25#include <dune/grid/common/gridfactory.hh>
37#include <dune/vtk/datacollectors/lagrangedatacollector.hh>
38#include <dune/vtk/vtkwriter.hh>
40#include <dune/assembler/backends/istlmatrixbackend.hh>
41#include <dune/assembler/backends/istlvectorbackend.hh>
42#include <dune/assembler/defaultglobalassembler.hh>
43#include <dune/assembler/parallel/coloredrangeexecutor.hh>
44#include <dune/assembler/parallel/gridcoloring.hh>
51#include "utilities.hh"
53int main (
int argc,
char *argv[])
try
60 log(
"MPI initialized");
64 auto refinements = parameters.get<
std::size_t>(
"refinements", 4);
66 auto tol = parameters.get<
double>(
"tol", 1e-4);
67 auto maxIter = parameters.get<
std::size_t>(
"maxIter", 1000);
68 auto verbosity = parameters.get<
std::size_t>(
"verbosity", 2);
70 log(
"Command line processed");
71 auto rightHandSide = [] (
const auto& x) {
return 10;};
72 auto dirichletValues = [](
const auto& x){
return std::sin(2*std::numbers::pi*x[0]); };
76 for(
unsigned int k :
Dune::range(9))
77 factory.insertVertex({0.5*(k%3), 0.5*(k/3)});
78 factory.insertElement(Dune::GeometryTypes::cube(2), {0, 1, 3, 4});
79 factory.insertElement(Dune::GeometryTypes::cube(2), {1, 2, 4, 5});
80 factory.insertElement(Dune::GeometryTypes::simplex(2), {3, 4, 6});
81 factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 7, 6});
82 factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 5, 7});
83 factory.insertElement(Dune::GeometryTypes::simplex(2), {5, 8, 7});
85 auto gridPtr = factory.createGrid();
86 auto&
grid = *gridPtr;
95 auto coloredRange = Dune::Assembler::Experimental::coloredElementRange(gridView);
97 log(
"Grid coloring computed");
99 auto executor = Dune::Assembler::Experimental::ColoredRangeExecutor(coloredRange, threadCount);
103 auto basis =
makeBasis(gridView, lagrange<2>());
111 auto stiffnessMatrix =
Matrix();
116 log(
"Boundary constraints computed");
125 auto matrixBackend = Dune::Assembler::ISTLMatrixBackend(stiffnessMatrix);
126 auto rhsBackend = Dune::Assembler::ISTLVectorBackend(
rhs);
127 auto assembler = Dune::Assembler::Assembler(basis, basis, executor);
129 log(
"Assembler set up");
130 auto patternBuilder = matrixBackend.patternBuilder();
132 patternBuilder.resize(basis, basis);
134 assembler.assembleMatrixPattern(a, patternBuilder);
136 log(
"Matrix pattern assembled");
137 patternBuilder.setupMatrix();
139 log(
"Matrix set up");
141 assembler.assembleMatrixEntries(a, matrixBackend);
143 log(
"Matrix assembled");
144 rhsBackend.resize(basis);
145 rhsBackend.setZero();
147 assembler.assembleVectorEntries(l, rhsBackend);
149 log(
"RHS assembled");
150 constraints.constrainLinearSystem(stiffnessMatrix,
rhs);
152 log(
"Boundary condition incorporated into system");
153 Dune::Assembler::ISTLVectorBackend(sol).resize(basis);
154 Dune::Assembler::ISTLVectorBackend(sol).setZero();
157 auto preconditioner = makeAMGPreconditioner<Vector>(stiffnessMatrix);
159 log(
"Preconditioner created");
169 log(
"Solver created");
173 solver.apply(sol,
rhs, solverStatistics);
175 log(
"Linear system solved");
176 auto vtkWriter = Dune::Vtk::UnstructuredGridWriter(Dune::Vtk::LagrangeDataCollector(basis.gridView(), 2));
177 vtkWriter.addPointData(u|sol,
Dune::VTK::FieldInfo(
"sol", Dune::VTK::FieldInfo::Type::scalar, 1));
178 vtkWriter.write(
"poisson-pq2");
180 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 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)
Coefficient function.
Definition coefficient.hh:42
T hardware_concurrency(T... args)