24#include <dune/grid/common/gridfactory.hh>
40#include <dune/vtk/vtkwriter.hh>
41#include <dune/vtk/datacollectors/discontinuouslagrangedatacollector.hh>
43#include <dune/assembler/backends/istlvectorbackend.hh>
44#include <dune/assembler/backends/istlmatrixbackend.hh>
45#include <dune/assembler/defaultglobalassembler.hh>
46#include <dune/assembler/parallel/gridcoloring.hh>
47#include <dune/assembler/parallel/coloredrangeexecutor.hh>
55#include "utilities.hh"
72template<
class Constra
ints,
class Basis,
class IntersectionSet>
73void computeTraceConstraints(Constraints& constraints,
const Basis& basis,
const IntersectionSet& intersectionSet)
76 auto isIntersectionDOF = constraints.isConstrained();
77 auto isIntersectionDOFBackend = istlVectorBackend(isIntersectionDOF);
80 auto&& isConstrainedBackend = istlVectorBackend(constraints.isConstrained());
81 auto&& constraintValuesBackend = istlVectorBackend(constraints.constantTerm());
83 auto localView = basis.localView();
84 const auto& gridView = basis.gridView();
85 for(
auto&& element : elements(gridView))
87 localView.bind(element);
88 for(
auto i :
Dune::range(localView.tree().
size()))
90 auto i_local = localView.tree().localIndex(i);
91 auto i_global = localView.index(i_local);
92 if (not isIntersectionDOFBackend[i_global])
94 isConstrainedBackend[i_global] =
true;
95 constraintValuesBackend[i_global] = 0;
99 constraints.resolveDependencies();
105int main (
int argc,
char *argv[])
try
112 log(
"MPI initialized");
116 auto meshFile = parameters.get<
std::string>(
"meshFile",
"bulk-surface.msh");
117 auto refinements = parameters.get<
std::size_t>(
"refinements", 0);
118 auto tol = parameters.get<
double>(
"tol", 1e-4);
119 auto maxIter = parameters.get<
std::size_t>(
"maxIter", 1000);
120 auto verbosity = parameters.get<
std::size_t>(
"verbosity", 2);
121 auto alpha = parameters.get<
double>(
"alpha", 10.0);
122 auto delta = parameters.get<
double>(
"delta", 2.0);
124 log(
"Command line processed");
126 auto rhs_A = [] (
const auto& x) {
132 auto rhs_B = [] (
const auto& x) {
return 0; };
133 auto rhs_I = [] (
const auto& x) {
return 0; };
135 auto dirichletValues = [] (
const auto& x) {
return 0; };
140 auto gridPtr = factory.createGrid();
141 auto&
grid = *gridPtr;
148 elementData.update(gridView);
155 for(
auto&& element :
elements(gridView))
156 if (elementData(element) == 1)
157 subDomain_A.insertElement(element);
162 for(
auto&& element :
elements(gridView))
163 if (elementData(element) == 2)
164 subDomain_B.insertElement(element);
174 restrict(lagrange<1>(), subDomain_A),
175 restrict(lagrange<1>(), subDomain_B),
176 restrict(lagrange<1>(), subDomain_A),
190 auto stiffnessMatrix =
Matrix();
195 log(
"Boundary constraints computed");
197 computeTraceConstraints(constraints, interfaceBasis, interface);
199 log(
"Trace constraints computed");
204 constexpr auto dim =
decltype(n)
::size();
208 T[i][j] = (i==j) - n[i]*n[j];
231 auto a = a_A + a_B + a_I + a_coupling;
233 auto l_A =
integrate(f_A*v_A, subDomain_A);
234 auto l_B =
integrate(f_B*v_B, subDomain_B);
235 auto l_I =
integrate(f_I*v_I, interface);
237 auto l = l_A + l_B + l_I;
238 auto matrixBackend = Dune::Assembler::ISTLMatrixBackend(stiffnessMatrix);
239 auto rhsBackend = Dune::Assembler::ISTLVectorBackend(
rhs);
240 auto assembler = Dune::Assembler::Assembler(basis, basis);
242 log(
"Assembler set up");
244 auto patternBuilder = matrixBackend.patternBuilder();
245 patternBuilder.resize(basis, basis);
247 assembler.assembleMatrixPattern(a, patternBuilder);
249 log(
"Matrix pattern assembled");
251 patternBuilder.setupMatrix();
253 log(
"Matrix set up");
255 assembler.assembleMatrixEntries(a, matrixBackend);
257 log(
"Matrix assembled");
259 rhsBackend.resize(basis);
260 rhsBackend.setZero();
261 assembler.assembleVectorEntries(l, rhsBackend);
263 log(
"RHS assembled");
264 constraints.constrainLinearSystem(stiffnessMatrix,
rhs);
266 log(
"Boundary condition incorporated into system");
267 Dune::Assembler::ISTLVectorBackend(sol).resize(basis);
268 Dune::Assembler::ISTLVectorBackend(sol).setZero();
272 auto preconditioner = makeAMGPreconditioner<Vector>(stiffnessMatrix);
274 log(
"Preconditioner created");
284 log(
"Solver created");
288 solver.apply(sol,
rhs, solverStatistics);
290 log(
"Linear system solved");
292 constraints.interpolate(sol);
293 auto vtkWriter = Dune::Vtk::UnstructuredGridWriter(Dune::Vtk::DiscontinuousLagrangeDataCollector(basis.gridView(), 1));
294 vtkWriter.addPointData(u_A|sol,
Dune::VTK::FieldInfo(
"sol_A", Dune::VTK::FieldInfo::Type::scalar, 1));
295 vtkWriter.addPointData(u_B|sol,
Dune::VTK::FieldInfo(
"sol_B", Dune::VTK::FieldInfo::Type::scalar, 1));
296 vtkWriter.addPointData((u_A + u_B)|sol,
Dune::VTK::FieldInfo(
"sol_bulk", Dune::VTK::FieldInfo::Type::scalar, 1));
297 vtkWriter.addPointData(u_I|sol,
Dune::VTK::FieldInfo(
"sol_I", Dune::VTK::FieldInfo::Type::scalar, 1));
298 vtkWriter.write(
"bulk-surface");
300 log(
"Solution written to vtk file");
int main(int argc, char **argv)
field_type dot(const type &newv) const
constexpr FlatLexicographic flatLexicographic()
auto istlVectorBackend(Vector &v)
std::decay_t< F > makeGridViewFunction(F &&f, const GridView &gridView)
auto subspaceBasis(const RootBasis &rootBasis, const TypeTree::TreePath< PrefixTreeIndices... > &prefixPath)
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 markIntersectionDofs(const IntersectionSet &intersectionSet, const Basis &basis, Vector &vector)
For a given basis and intersection set, determine all degrees of freedom on the patch.
Definition boundarydofs.hh:45
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 outside(const Op &op)
Construct outside version of a given operator.
Definition userfunctions.hh:862
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 faceNormal(const GridView &gridView)
Construct operator representing the face normals.
Definition userfunctions.hh:965
auto grad(const Op &op)
Obtain the gradient of an operator.
Definition userfunctions.hh:1186
auto compose(const OuterOp &outerOp, const InnerOp &innerOp)
Generic composition of a multilinear operators with a pointwise outer operator.
Definition userfunctions.hh:483
::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
IteratorRange<... > elements(const GV &gv)
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
Class for storing data associated to elements.
Definition elementdata.hh:47