7#include <dune/common/hybridutilities.hh>
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>
25 template <
class Imp,
class... LF>
26 class VariadicGridFunctionLocalOperator;
43 template <
class Imp,
class... GF>
47 using Implementation = Imp;
54 template <
class... GridFct,
class Impl>
56 int gridFctOrder, GridFct&&... gridFct)
57 : gridFct_(std::forward_as_tuple(gridFct...))
60 , gridFctOrder_(gridFctOrder)
64 template <
class Gr
idView>
70 return std::apply([&op](
auto const& ... gfs){
72 op.derivDeg_, op.gridFctOrder_, localFunction(gfs)...};
78 std::tuple<GF...> gridFct_;
90 template <
class... GridFct,
class Impl>
91 VariadicGridFunctionOperator(
Impl const& impl,
int,
int, GridFct
const&... gridFct)
92 -> VariadicGridFunctionOperator<
Impl, GridFct... >;
109 template <
class Imp,
class... LF>
115 using Implementation = Imp;
126 template <
class... LocalFct,
class Impl>
128 int localFctOrder, LocalFct&&... localFct)
129 : localFct_(std::forward_as_tuple(localFct...))
131 , derivDeg_(derivDeg)
132 , localFctOrder_(localFctOrder)
139 template <
class Element>
140 void bind(Element
const& element)
142 std::apply([&element](
auto&... lf){
143 (lf.bind(element),...);
151 std::apply([](
auto&... lf){
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
165 auto const& quad = getQuadratureRule(contextGeo.geometry(),
166 derivDeg_, localFctOrder(), rowNode, colNode);
168 std::apply([&](
auto const& ... lf){
169 impl().assemble(contextGeo, rowNode, colNode, quad, lf..., elementMatrix);
179 template <
class CG,
class Node,
class Vec>
180 void assemble(CG
const& contextGeo, Node
const& node,
181 Vec& elementVector)
const
183 auto const& quad = getQuadratureRule(contextGeo.geometry(),
184 derivDeg_, localFctOrder(), node);
186 std::apply([&](
auto const& ... lf){
187 impl().assemble(contextGeo, node, quad, lf..., elementVector);
191 Implementation & impl() {
return impl_; }
192 Implementation
const& impl()
const {
return impl_; }
197 int localFctOrder()
const
199 if (localFctOrder_ >= 0)
200 return localFctOrder_;
204 std::apply([&coeffOrder,
this](
auto const& ... lf){
205 coeffOrder = std::max({coeffOrder, getOrder(lf)...});
207 test_exit(coeffOrder >= 0,
208 "Polynomial degree of coefficients cannot be determined. "
209 "Please provide a quadrature order manually.");
217 constexpr int getOrder(LFF
const& lf)
const{
218 if constexpr (Concepts::Polynomial<LFF>)
226 std::tuple<LF...> localFct_;
229 Implementation impl_;
239 template <
class Impl,
class... LocalFct>
240 VariadicGridFunctionLocalOperator(
Impl const& impl,
int,
int, LocalFct
const&... localFct)
241 -> VariadicGridFunctionLocalOperator<
Impl, LocalFct...>;
245 template <
class Tag,
class LocalContext>
251 template <
class Tag,
class... Expr>
255 std::tuple<Expr...> expr;
260 , expr(std::make_tuple(expr...))
261 , gridFctDeg(gridFctDeg)
272 template <
class Tag,
class... Expr>
287 template <
class Context,
class Tag,
class... Expr,
class GridView>
288 auto makeOperator(VariadicOperatorTerm<Tag,Expr...>
const& op, GridView
const& gridView)
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{
303 auto impl =
typename Registry::type{op.tag};
304 return VariadicGridFunctionOperator{
305 std::apply([&](
auto const&... expr){
306 return VariadicGridFunctionOperator{
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