36#include <dune/vtk/vtkwriter.hh>
37#include <dune/vtk/datacollectors/lagrangedatacollector.hh>
39#include <dune/assembler/backends/istlvectorbackend.hh>
40#include <dune/assembler/backends/istlmatrixbackend.hh>
41#include <dune/assembler/defaultglobalassembler.hh>
43#include <dune/assembler/parallel/gridcoloring.hh>
44#include <dune/assembler/parallel/coloredrangeexecutor.hh>
56#include "utilities.hh"
58int main (
int argc,
char *argv[])
try
66 auto refinements = parameters.get<
std::size_t>(
"refinements", 3);
68 auto tol = parameters.get<
double>(
"tol", 1e-4);
69 auto maxIter = parameters.get<
std::size_t>(
"maxIter", 1000);
70 auto verbosity = parameters.get<
std::size_t>(
"verbosity", 2);
72 log(
"Command line processed");
76 log(
"MPI initialized");
77 auto dirichletIndicator = [&](
auto x) {
78 return (x[1] <= 0.25) or (x[1] > 0.75);
81 auto dirichletValues = [](
const auto& x){
return 0; };
83 auto rightHandSide = [] (
const auto& x) {
return 20*(x[0]>=.5);};
87 for(
unsigned int k :
Dune::range(9))
88 factory.insertVertex({0.5*(k%3), 0.5*(k/3)});
89 factory.insertElement(Dune::GeometryTypes::cube(2), {0, 1, 3, 4});
90 factory.insertElement(Dune::GeometryTypes::cube(2), {1, 2, 4, 5});
91 factory.insertElement(Dune::GeometryTypes::simplex(2), {3, 4, 6});
92 factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 7, 6});
93 factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 5, 7});
94 factory.insertElement(Dune::GeometryTypes::simplex(2), {5, 8, 7});
95 factory.insertBoundarySegment({0, 3});
96 factory.insertBoundarySegment({3, 6});
97 factory.insertBoundarySegment({2, 5});
98 factory.insertBoundarySegment({5, 8});
99 constexpr int leftID = 0;
100 constexpr int rightID = 1;
101 auto boundaryIDs =
std::vector({leftID, leftID, rightID, rightID});
102 auto periodicRightToLeft = [](
auto x) {
107 auto&
grid = *gridPtr;
119 for (
const auto& intersection :
Dune::Fufem::Boundary(gridView))
121 if (dirichletIndicator(intersection.geometry().center()))
122 dirichletPatch.insertFace(intersection);
123 if (boundaryData(intersection) == leftID)
124 periodicLeftPatch.insertFace(intersection);
125 if (boundaryData(intersection) == rightID)
126 periodicRightPatch.insertFace(intersection);
129 log(
"Boundary patches set up");
130 auto coloredRange = Dune::Assembler::Experimental::coloredElementRange(gridView);
132 log(
"Grid coloring computed");
134 auto executor = Dune::Assembler::Experimental::ColoredRangeExecutor(coloredRange, threadCount);
138 auto basis =
makeBasis(gridView, lagrange<2>());
146 auto stiffnessMatrix =
Matrix();
151 log(
"Boundary constraints computed");
155 log(
"Periodic constraints computed");
164 auto matrixBackend = Dune::Assembler::ISTLMatrixBackend(stiffnessMatrix);
165 auto rhsBackend = Dune::Assembler::ISTLVectorBackend(
rhs);
166 auto assembler = Dune::Assembler::Assembler(basis, basis, executor);
168 log(
"Assembler set up");
169 auto patternBuilder = matrixBackend.patternBuilder();
171 patternBuilder.resize(basis, basis);
173 assembler.assembleMatrixPattern(a, patternBuilder);
175 constraints.extendMatrixPattern(patternBuilder, basis);
177 log(
"Matrix pattern assembled");
178 patternBuilder.setupMatrix();
180 log(
"Matrix set up");
182 assembler.assembleMatrixEntries(a, matrixBackend);
184 log(
"Matrix assembled");
185 rhsBackend.resize(basis);
186 rhsBackend.setZero();
188 assembler.assembleVectorEntries(l, rhsBackend);
190 log(
"RHS assembled");
191 constraints.constrainLinearSystem(stiffnessMatrix,
rhs);
193 log(
"Boundary condition incorporated into system");
194 Dune::Assembler::ISTLVectorBackend(sol).resize(basis);
195 Dune::Assembler::ISTLVectorBackend(sol).setZero();
198 auto preconditioner = makeAMGPreconditioner<Vector>(stiffnessMatrix);
200 log(
"Preconditioner created");
210 log(
"Solver created");
214 solver.apply(sol,
rhs, solverStatistics);
216 log(
"Linear system solved");
217 constraints.interpolate(sol);
219 log(
"Constrained solution interpolated");
220 auto vtkWriter = Dune::Vtk::UnstructuredGridWriter(Dune::Vtk::LagrangeDataCollector(basis.gridView(), 2));
221 vtkWriter.addPointData(u|sol,
Dune::VTK::FieldInfo(
"sol", Dune::VTK::FieldInfo::Type::scalar, 1));
222 vtkWriter.write(
"poisson-periodic");
224 log(
"Solution written to vtk file");
int main(int argc, char **argv)
field_type dot(const type &newv) const
std::decay_t< F > makeGridViewFunction(F &&f, const GridView &gridView)
std::vector< Child > Vector
auto makeBasis(const GridView &gridView, PreBasisFactory &&preBasisFactory)
static std::string formatString(const std::string &s, const T &... args)
const char * what() const noexcept override
void computePeriodicConstraints(AffineConstraints< BV, V, MI, C > &constraints, const PrimaryBasis &primaryBasis, const PrimaryPatch &primaryPatch, const SecondaryBasis &secondaryBasis, const SecondaryPatch &secondaryPatch, const SecondaryToPrimary &secondaryToPrimary)
Compute constraints for periodic boundary conditions.
Definition periodicconstraints.hh:64
void computeBoundaryConstraints(AffineConstraints< BV, V, MI, C > &constraints, const Basis &basis, Function &&f, const IntersectionSet &intersectionSet)
Compute constraints for essential boundary conditions.
Definition boundaryconstraints.hh:51
auto makeAffineConstraints(const Basis &basis)
Create and initialize an AffineConstraints object for a basis.
Definition affineconstraints.hh:825
auto testFunction(const Basis &basis)
Create unary identity operator on test function space.
Definition userfunctions.hh:694
auto trialFunction(const Basis &basis)
Create unary identity operator on trial function space.
Definition userfunctions.hh:773
auto grad(const Op &op)
Obtain the gradient of an operator.
Definition userfunctions.hh:1186
::value auto integrate(MultilinearOperator op, const Domain &domain)
Integrate a k-linear operator to obtain a k-linear form.
Definition integrate.hh:53
auto makeLogger(std::ostream &stream, std::string format)
Create a simple logger callback.
Definition logger.hh:42
Definition baseclass.hh:22
const Grid & grid() const
static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)
static void readOptions(int argc, char *argv[], ParameterTree &pt)
LeafGridView leafGridView() const
void globalRefine(int refCount)
Encapsulate a subset of the boundary intersections of a GridView.
Definition domains/boundarypatch.hh:37
Coefficient function.
Definition coefficient.hh:42
Class for storing data associated to boundary segments.
Definition boundarydata.hh:44
T hardware_concurrency(T... args)