AMDiS  0.3
The Adaptive Multi-Dimensional Simulation Toolbox
AssembleOperators.hpp
1 #pragma once
2 
3 namespace AMDiS
4 {
5  template <class ElementAssembler, class IntersectionAssembler, class BoundaryAssembler>
7  {
8  ElementAssembler elementAssembler;
9  IntersectionAssembler intersectionAssembler;
10  BoundaryAssembler boundaryAssembler;
11  };
12 
13  template <class EA, class IA, class BA>
14  AssemblerTriple<EA, IA, BA> makeAssemblerTriple(EA const& ea, IA const& ia, BA const& ba)
15  {
16  return {ea, ia, ba};
17  }
18 
19 
20  template <class GV, class Element, class Operators, class EA, class IA, class BA>
21  void assembleOperators(GV const& gridView, Element const& element,
22  Operators& operators,
23  AssemblerTriple<EA,IA,BA> const& assemblerTriple)
24  {
25  // assemble element operators
26  assemblerTriple.elementAssembler(element, operators.onElement());
27 
28  // assemble intersection operators
29  if (!operators.onIntersection().empty()
30  || (!operators.onBoundary().empty() && element.hasBoundaryIntersections()))
31  {
32  for (auto const& intersection : intersections(gridView, element)) {
33  if (intersection.boundary())
34  assemblerTriple.boundaryAssembler(intersection, operators.onBoundary());
35  else
36  assemblerTriple.intersectionAssembler(intersection, operators.onIntersection());
37  }
38  }
39  }
40 
41 
42  template <class Node, class Vec>
43  auto makeVectorAssembler(Node const& node, Vec& elementVector)
44  {
45  return makeAssemblerTriple(
46  [&](auto const& element, auto& operators) {
47  for (auto& op : operators)
48  op->assemble(element, node, elementVector);
49  },
50  [&](auto const& is, auto& operators) {
51  for (auto& op : operators)
52  op->assemble(is, node, elementVector);
53  },
54  [&](auto const& bis, auto& operators) {
55  for (auto& data : operators) {
56  if (data.bs(bis))
57  data.op->assemble(bis, node, elementVector);
58  }
59  });
60  }
61 
62 
63  template <class RN, class CN, class Mat>
64  auto makeMatrixAssembler(RN const& rowNode, CN const& colNode, Mat& elementMatrix)
65  {
66  return makeAssemblerTriple(
67  [&](auto const& element, auto& operators) {
68  for (auto& op : operators)
69  op->assemble(element, rowNode, colNode, elementMatrix);
70  },
71  [&](auto const& is, auto& operators) {
72  for (auto& op : operators)
73  op->assemble(is, rowNode, colNode, elementMatrix);
74  },
75  [&](auto const& bis, auto& operators) {
76  for (auto& data : operators) {
77  if (data.bs(bis))
78  data.op->assemble(bis, rowNode, colNode, elementMatrix);
79  }
80  });
81  }
82 
83 } // end namespace AMDiS
Contains all classes needed for solving linear and non linear equation systems.
Definition: AdaptBase.hpp:6
Definition: AssembleOperators.hpp:6