AMDiS  0.3
The Adaptive Multi-Dimensional Simulation Toolbox
GridFunctionOperator.hpp
1 #pragma once
2 
3 #include <cassert>
4 #include <type_traits>
5 
6 #include <amdis/GridFunctionOperatorTransposed.hpp>
7 #include <amdis/common/Order.hpp>
8 #include <amdis/common/TypeTraits.hpp>
9 #include <amdis/utility/QuadratureFactory.hpp>
10 
11 namespace AMDiS
12 {
18  template <class LF, class Imp>
20 
21 
23 
36  template <class GF, class Imp>
38  {
39  public:
40  using GridFunction = GF;
41  using Implementation = Imp;
42 
44 
48  template <class GridFct, class Impl>
49  GridFunctionOperator(GridFct&& gridFct, Impl&& impl,
50  int derivDeg, int gridFctOrder)
51  : gridFct_(FWD(gridFct))
52  , impl_(FWD(impl))
53  , derivDeg_(derivDeg)
54  , gridFctOrder_(gridFctOrder)
55  {}
56 
57  template <class GridView>
58  void update(GridView const&) { /* do nothing */ }
59 
60  friend auto localOperator(GridFunctionOperator const& op)
61  {
62  return GridFunctionLocalOperator{localFunction(op.gridFct_), op.impl_,
63  op.derivDeg_, op.gridFctOrder_};
64  }
65 
66  private:
68  GridFunction gridFct_;
69 
71  Implementation impl_;
72 
74  int derivDeg_;
75 
77  int gridFctOrder_;
78  };
79 
80  template <class GridFct, class Impl>
81  GridFunctionOperator(GridFct const& gridFct, Impl const& impl, int, int)
83 
84 
86 
99  template <class LF, class Imp>
101  {
102  private:
104  using LocalFunction = LF;
105 
107  using Implementation = Imp;
108 
109  public:
111 
116  template <class LocalFct, class Impl>
117  GridFunctionLocalOperator(LocalFct&& localFct, Impl&& impl,
118  int derivDeg, int localFctOrder)
119  : localFct_(FWD(localFct))
120  , impl_(FWD(impl))
121  , derivDeg_(derivDeg)
122  , localFctOrder_(localFctOrder)
123  {}
124 
126 
129  template <class Element>
130  void bind(Element const& element)
131  {
132  localFct_.bind(element);
133  }
134 
136  void unbind()
137  {
138  localFct_.unbind();
139  }
140 
142 
146  template <class CG, class RN, class CN, class Mat>
147  void assemble(CG const& contextGeo, RN const& rowNode, CN const& colNode,
148  Mat& elementMatrix) const
149  {
150  auto const& quad = getQuadratureRule(contextGeo.localContext().geometry(),
151  derivDeg_, localFctOrder(), rowNode, colNode);
152  impl().assemble(contextGeo, rowNode, colNode, quad, localFct_, elementMatrix);
153  }
154 
156 
160  template <class CG, class Node, class Vec>
161  void assemble(CG const& contextGeo, Node const& node,
162  Vec& elementVector) const
163  {
164  auto const& quad = getQuadratureRule(contextGeo.localContext().geometry(),
165  derivDeg_, localFctOrder(), node);
166  impl().assemble(contextGeo, node, quad, localFct_, elementVector);
167  }
168 
169  Implementation & impl() { return impl_; }
170  Implementation const& impl() const { return impl_; }
171 
172  protected:
173  // calculated polynomial order of local-function. Fallback to localFctOrder_;
174  int localFctOrder() const
175  {
176  if constexpr (Concepts::Polynomial<LF>)
177  return order(localFct_);
178  else
179  return localFctOrder_;
180  }
181 
182  private:
184  LocalFunction localFct_;
185 
187  Implementation impl_;
188 
190  int derivDeg_;
191 
193  int localFctOrder_;
194  };
195 
196  // deduction guide
197  template <class LocalFct, class Impl>
198  GridFunctionLocalOperator(LocalFct const& localFct, Impl const& impl, int, int)
200 
201 
203  template <class Tag, class LocalContext>
205 
206  template <class Tag, class Expr>
208  {
209  Tag tag;
210  Expr expr;
211  int gridFctDeg;
212 
213  OperatorTerm(Tag tag, Expr const& expr, int gridFctDeg = -1)
214  : tag(tag)
215  , expr(expr)
216  , gridFctDeg(gridFctDeg)
217  {}
218  };
219 
222  template <class Tag, class Expr>
223  auto makeOperator(Tag const& tag, Expr&& expr, int gridFctDeg = -1)
224  {
225  return OperatorTerm{tag, FWD(expr), gridFctDeg};
226  }
227 
228  template <class Tag, class Expr>
229  auto operatorTerm(Tag const& tag, Expr&& expr, int gridFctDeg = -1)
230  {
231  return OperatorTerm{tag, FWD(expr), gridFctDeg};
232  }
233 
236 #ifndef DOXYGEN
237 
238  template <class R, class Tag>
239  using IsTransposed = decltype(R::transposedTag(std::declval<Tag>()));
240 
243  template <class Context, class Tag, class Expr, class GridView>
244  auto makeOperator(OperatorTerm<Tag,Expr> const& op, GridView const& gridView)
245  {
246  auto gf = makeGridFunction(std::move(op.expr), gridView);
247 
249  if constexpr (Dune::Std::is_detected_v<IsTransposed,Registry,Tag>) {
250  auto impl = typename Registry::type{Registry::transposedTag(op.tag)};
252  GridFunctionOperator{std::move(gf), std::move(impl), Registry::degree, op.gridFctDeg}
253  };
254  } else {
255  auto impl = typename Registry::type{op.tag};
256  return GridFunctionOperator{std::move(gf), std::move(impl), Registry::degree, op.gridFctDeg};
257  }
258  }
260 
261 #endif // DOXYGEN
262 
263 } // end namespace AMDiS
void assemble(CG const &contextGeo, RN const &rowNode, CN const &colNode, Mat &elementMatrix) const
Assemble a local element matrix on the element that is bound.
Definition: GridFunctionOperator.hpp:147
The main implementation of an operator depending on a grid-function.
Definition: GridFunctionOperator.hpp:37
GridFunctionLocalOperator(LocalFct &&localFct, Impl &&impl, int derivDeg, int localFctOrder)
Constructor. Stores a copy of localFct and impl.
Definition: GridFunctionOperator.hpp:117
decltype(auto) makeGridFunction(PreGridFct const &preGridFct, GridView const &gridView)
Generator for Gridfunctions from Expressions (PreGridfunctions)
Definition: GridFunction.hpp:168
Definition: AdaptBase.hpp:6
GridFunctionOperator(GridFct &&gridFct, Impl &&impl, int derivDeg, int gridFctOrder)
Constructor. Stores a copy of gridFct and impl.
Definition: GridFunctionOperator.hpp:49
void unbind()
Unbinds operator from element.
Definition: GridFunctionOperator.hpp:136
auto makeOperator(Tag const &tag, Expr &&expr, int gridFctDeg=-1)
Definition: GridFunctionOperator.hpp:223
The transposed operator, implemented in terms of its transposed by calling assemble with inverted arg...
Definition: GridFunctionOperatorTransposed.hpp:13
void assemble(CG const &contextGeo, Node const &node, Vec &elementVector) const
Assemble a local element vector on the element that is bound.
Definition: GridFunctionOperator.hpp:161
Definition: GridFunctionOperator.hpp:207
void bind(Element const &element)
Binds operator to element.
Definition: GridFunctionOperator.hpp:130
Registry to specify a tag for each implementation type.
Definition: GridFunctionOperator.hpp:204
The main implementation of a local-operator depending on a local-function.
Definition: GridFunctionOperator.hpp:19