AMDiS 2.11-git
The Adaptive Multi-Dimensional Simulation Toolbox
 
Loading...
Searching...
No Matches
VariadicGridFunctionOperator.hpp
1#pragma once
2
3#include <cassert>
4#include <tuple>
5#include <type_traits>
6
7#include <dune/common/hybridutilities.hh>
8
9#include <amdis/common/ConceptsBase.hpp>
10#include <amdis/common/Order.hpp>
11#include <amdis/common/TypeTraits.hpp>
12#include <amdis/gridfunctions/GridFunction.hpp>
13#include <amdis/GridFunctionOperatorTransposed.hpp>
14#include <amdis/GridFunctionOperator.hpp>
15#include <amdis/Output.hpp>
16#include <amdis/utility/QuadratureFactory.hpp>
17
18namespace AMDiS
19{
25 template <class Imp, class... LF>
26 class VariadicGridFunctionLocalOperator;
27
28
30
43 template <class Imp, class... GF>
45 {
46 public:
47 using Implementation = Imp;
48
50
54 template <class... GridFct, class Impl>
55 VariadicGridFunctionOperator(Impl&& impl, int derivDeg,
56 int gridFctOrder, GridFct&&... gridFct)
57 : gridFct_(std::forward_as_tuple(gridFct...))
58 , impl_(FWD(impl))
59 , derivDeg_(derivDeg)
60 , gridFctOrder_(gridFctOrder)
61 {}
62
64 template <class GridView>
65 void update(GridView const&) { /* do nothing */ }
66
69 {
70 return std::apply([&op](auto const& ... gfs){
72 op.derivDeg_, op.gridFctOrder_, localFunction(gfs)...};
73 }, op.gridFct_);
74 }
75
76 private:
78 std::tuple<GF...> gridFct_;
79
81 Implementation impl_;
82
84 int derivDeg_;
85
87 int gridFctOrder_;
88 };
89
90 template <class... GridFct, class Impl>
91 VariadicGridFunctionOperator(Impl const& impl, int, int, GridFct const&... gridFct)
92 -> VariadicGridFunctionOperator< Impl, GridFct... >;
93
94
96
109 template <class Imp, class... LF>
111 {
112 private:
113
115 using Implementation = Imp;
116
117 public:
119
126 template <class... LocalFct, class Impl>
128 int localFctOrder, LocalFct&&... localFct)
129 : localFct_(std::forward_as_tuple(localFct...))
130 , impl_(FWD(impl))
131 , derivDeg_(derivDeg)
132 , localFctOrder_(localFctOrder)
133 {}
134
136
139 template <class Element>
140 void bind(Element const& element)
141 {
142 std::apply([&element](auto&... lf){
143 (lf.bind(element),...);
144 },
145 localFct_);
146 }
147
149 void unbind()
150 {
151 std::apply([](auto&... lf){
152 (lf.unbind(),...);
153 },
154 localFct_); }
155
157
161 template <class CG, class RN, class CN, class Mat>
162 void assemble(CG const& contextGeo, RN const& rowNode, CN const& colNode,
163 Mat& elementMatrix) const
164 {
165 auto const& quad = getQuadratureRule(contextGeo.geometry(),
166 derivDeg_, localFctOrder(), rowNode, colNode);
167
168 std::apply([&](auto const& ... lf){
169 impl().assemble(contextGeo, rowNode, colNode, quad, lf..., elementMatrix);
170 }
171 ,localFct_);
172 }
173
175
179 template <class CG, class Node, class Vec>
180 void assemble(CG const& contextGeo, Node const& node,
181 Vec& elementVector) const
182 {
183 auto const& quad = getQuadratureRule(contextGeo.geometry(),
184 derivDeg_, localFctOrder(), node);
185
186 std::apply([&](auto const& ... lf){
187 impl().assemble(contextGeo, node, quad, lf..., elementVector);
188 }, localFct_);
189 }
190
191 Implementation & impl() { return impl_; }
192 Implementation const& impl() const { return impl_; }
193
194 protected:
195 // Return the order of the coefficients function, either localFctOrder_ or
196 // the order of the local-function
197 int localFctOrder() const
198 {
199 if (localFctOrder_ >= 0)
200 return localFctOrder_;
201 else {
202 int coeffOrder = -1;
203 // Try to get polynomial order of local-functions
204 std::apply([&coeffOrder, this](auto const& ... lf){
205 coeffOrder = std::max({coeffOrder, getOrder(lf)...});
206 }, localFct_);
207 test_exit(coeffOrder >= 0,
208 "Polynomial degree of coefficients cannot be determined. "
209 "Please provide a quadrature order manually.");
210
211 return coeffOrder;
212 }
213 }
214
215 // get the polynomial order of a single local function or -1 if it cannot be determined.
216 template<class LFF>
217 constexpr int getOrder(LFF const& lf) const{
218 if constexpr (Concepts::Polynomial<LFF>)
219 return order(lf);
220 else
221 return -1;
222 }
223
224 private:
226 std::tuple<LF...> localFct_;
227
229 Implementation impl_;
230
232 int derivDeg_;
233
235 int localFctOrder_;
236 };
237
238 // deduction guide
239 template <class Impl, class... LocalFct>
240 VariadicGridFunctionLocalOperator(Impl const& impl, int, int, LocalFct const&... localFct)
241 -> VariadicGridFunctionLocalOperator<Impl, LocalFct...>;
242
243
245 template <class Tag, class LocalContext>
247
251 template <class Tag, class... Expr>
253 {
254 Tag tag;
255 std::tuple<Expr...> expr;
256 int gridFctDeg;
257
258 VariadicOperatorTerm(Tag tag,int gridFctDeg, Expr const&... expr)
259 : tag(tag)
260 , expr(std::make_tuple(expr...))
261 , gridFctDeg(gridFctDeg)
262 {}
263 };
264
265
272 template <class Tag, class... Expr>
273 auto makeOperator(Tag const& tag, int gridFctDeg, Expr const&... expr)
274 ->std::enable_if_t<sizeof...(Expr) != 1, VariadicOperatorTerm<Tag, Expr...>>
275 {
276 return VariadicOperatorTerm{tag, gridFctDeg, expr...};
277 }
278
279
282#ifndef DOXYGEN
283
284
287 template <class Context, class Tag, class... Expr, class GridView>
288 auto makeOperator(VariadicOperatorTerm<Tag,Expr...> const& op, GridView const& gridView)
289 {
290 using Registry = VariadicGridFunctionOperatorRegistry<Tag,Context>;
291 if constexpr (Dune::Std::is_detected_v<IsTransposed,Registry,Tag>) {
292 auto impl = typename Registry::type{Registry::transposedTag(op.tag)};
293 return GridFunctionOperatorTransposed{
294 std::apply([&](auto const&... expr){
295 return VariadicGridFunctionOperator{
296 std::move(impl),
297 Registry::degree,
298 op.gridFctDeg,
299 makeGridFunction(expr,gridView)...} ;
300 }, op.expr)
301 };
302 } else {
303 auto impl = typename Registry::type{op.tag};
304 return VariadicGridFunctionOperator{
305 std::apply([&](auto const&... expr){
306 return VariadicGridFunctionOperator{
307 std::move(impl),
308 Registry::degree,
309 op.gridFctDeg,
310 makeGridFunction(expr,gridView)...} ;
311 }, op.expr)
312 };
313 }
314 }
316
317#endif // DOXYGEN
318
319} // end namespace AMDiS
A LocalOperator parametrized by multiple LocalFunctions.
Definition VariadicGridFunctionOperator.hpp:111
VariadicGridFunctionLocalOperator(Impl &&impl, int derivDeg, int localFctOrder, LocalFct &&... localFct)
Constructor. Stores a copy of localFct and impl.
Definition VariadicGridFunctionOperator.hpp:127
void bind(Element const &element)
Binds operator to element.
Definition VariadicGridFunctionOperator.hpp:140
void assemble(CG const &contextGeo, Node const &node, Vec &elementVector) const
Assemble a local element vector on the element that is bound.
Definition VariadicGridFunctionOperator.hpp:180
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 VariadicGridFunctionOperator.hpp:162
void unbind()
Unbinds operator from element.
Definition VariadicGridFunctionOperator.hpp:149
The main implementation of an operator depending on a variadic number of GridFunctions.
Definition VariadicGridFunctionOperator.hpp:45
void update(GridView const &)
Update the Operator upon GridView change.
Definition VariadicGridFunctionOperator.hpp:65
VariadicGridFunctionOperator(Impl &&impl, int derivDeg, int gridFctOrder, GridFct &&... gridFct)
Constructor. Stores a copy of gridFct and impl.
Definition VariadicGridFunctionOperator.hpp:55
friend auto localOperator(VariadicGridFunctionOperator const &op)
Turn this (global) Operator into a LocalOperator.
Definition VariadicGridFunctionOperator.hpp:68
decltype(auto) makeGridFunction(PreGridFct const &preGridFct, GridView const &gridView)
Generator for Gridfunctions from Expressions (PreGridfunctions)
Definition GridFunction.hpp:194
auto makeOperator(Tag const &tag, Expr &&expr, int gridFctDeg=-1)
Definition GridFunctionOperator.hpp:235
Registry to specify a tag for each implementation type.
Definition VariadicGridFunctionOperator.hpp:246
Intermediate representation for the operator. Essentially this just stores the tag and the GridFuncti...
Definition VariadicGridFunctionOperator.hpp:253