5#include <dune/grid/utility/hierarchicsearch.hh>
7#include <amdis/common/Concepts.hpp>
8#include <amdis/common/DerivativeTraits.hpp>
9#include <amdis/gridfunctions/Derivative.hpp>
10#include <amdis/gridfunctions/GridFunction.hpp>
16 template <
class LF,
class Sig>
17 struct CheckFunctorConcept
19 static_assert(Concepts::Functor<LF, Sig>,
"Derivative of LocalFunction can not be called as a functor.");
22 template <
class Traits>
23 struct CheckValidRange
25 static_assert(!std::is_same_v<typename Traits::Range, Dune::Functions::InvalidRange>,
"Invalid Range.");
43 template <
class Gr
idFunction,
class Type>
46 using GridFctRange =
typename GridFunction::Range;
47 using GridFctDomain =
typename GridFunction::Domain;
48 using RawSignature =
typename Dune::Functions::SignatureTraits<GridFctRange(GridFctDomain)>::RawSignature;
51 using LocalFunction = TYPEOF( derivativeOf(localFunction(std::declval<GridFunction>()), std::declval<Type>()) ) ;
53 using LocalFctRange =
typename Traits::Range;
54 using LocalFctDomain =
typename GridFunction::EntitySet::LocalCoordinate;
56 CHECK_CONCEPT(Impl::CheckValidRange<Traits>);
57 CHECK_CONCEPT(Impl::CheckFunctorConcept<LocalFunction, LocalFctRange(LocalFctDomain)>);
59 enum { hasDerivative =
false };
63 using Range =
typename Traits::Range;
80 : gridFct_{std::move(gridFct)}
89 using GridView =
decltype(gv);
90 using Grid =
typename GridView::Grid;
91 using IS =
typename GridView::IndexSet;
93 Dune::HierarchicSearch<Grid,IS> hsearch{gv.grid(), gv.indexSet()};
95 auto element = hsearch.findEntity(x);
96 auto geometry = element.geometry();
98 localFct.bind(element);
99 return localFct(geometry.local(x));
105 return derivativeOf(localFunction(gridFct_), type_);
111 return gridFct_.entitySet();
115 GridFunction gridFct_;
133 template <
class GridFct,
class Type,
134 class LocalFct =
decltype( localFunction(std::declval<GridFct>()) ),
135 REQUIRES(not GridFct::hasDerivative)>
136 auto derivativeOf(GridFct
const& gridFct, Type
const& type)
138 static_assert(Concepts::HasDerivative<LocalFct,Type>,
139 "derivativeOf(LocalFunction,type) not defined!");
140 return DerivativeGridFunction<GridFct,Type>{gridFct, type};
145 template <
class Expr,
class Type>
152 template <
class Gr
idView>
153 static auto create(
Self const& self, GridView
const& gridView)
165 template <
class Expr,
class Type>
185 template <
class Expr, REQUIRES(not Concepts::Gr
idViewFunction<Expr>)>
201 template<
class Expr, REQUIRES(Concepts::Gr
idViewFunction<Expr>)>
204 return makeGridFunction(DerivativePreGridFunction<Expr, tag::gradient>{expr}, expr.entitySet().gridView());
208 template <
class Expr, REQUIRES(not Concepts::Gr
idViewFunction<Expr>)>
209 auto divergenceOf(Expr
const& expr)
211 return DerivativePreGridFunction<Expr, tag::divergence>{expr};
215 template<
class Expr, REQUIRES(Concepts::Gr
idViewFunction<Expr>)>
216 auto divergenceOf(Expr
const& expr)
218 return makeGridFunction(DerivativePreGridFunction<Expr, tag::divergence>{expr}, expr.entitySet().gridView());
222 template <
class Expr, REQUIRES(not Concepts::Gr
idViewFunction<Expr>)>
223 auto partialDerivativeOf(Expr
const& expr, std::size_t i)
225 return DerivativePreGridFunction<Expr, tag::partial>{expr, tag::partial{i}};
229 template<
class Expr, REQUIRES(Concepts::Gr
idViewFunction<Expr>)>
230 auto partialDerivativeOf(Expr
const& expr, std::size_t i)
232 return makeGridFunction(DerivativePreGridFunction<Expr, tag::partial>{expr, tag::partial{i}}, expr.entitySet().gridView());
A Gridfunction that returns the derivative when calling localFunction.
Definition DerivativeGridFunction.hpp:45
LocalFunction makeLocalFunction() const
Return the derivative-localFunction of the GridFunction.
Definition DerivativeGridFunction.hpp:103
DerivativeGridFunction(GridFunction const &gridFct, Type const &type)
Constructor. Stores a copy of gridFct.
Definition DerivativeGridFunction.hpp:73
Range operator()(Domain const &x) const
Evaluate derivative in global coordinates. NOTE: expensive.
Definition DerivativeGridFunction.hpp:85
DerivativeGridFunction(GridFunction &&gridFct, Type const &type)
Constructor. Moves the gridFct into an instance variable.
Definition DerivativeGridFunction.hpp:79
GridFctDomain Domain
The domain of the GridFunction.
Definition DerivativeGridFunction.hpp:66
EntitySet const & entitySet() const
Return the EntitySet of the GridFunction.
Definition DerivativeGridFunction.hpp:109
typename Traits::Range Range
The Range of the derivative of the GridFunction.
Definition DerivativeGridFunction.hpp:63
typename GridFunction::EntitySet EntitySet
The EntitySet of the GridFunction.
Definition DerivativeGridFunction.hpp:69
auto gradientOf(Expr const &expr)
Definition DerivativeGridFunction.hpp:186
decltype(auto) makeGridFunction(PreGridFct const &preGridFct, GridView const &gridView)
Generator for Gridfunctions from Expressions (PreGridfunctions)
Definition GridFunction.hpp:194
Definition DerivativeGridFunction.hpp:151
Definition DerivativeGridFunction.hpp:147
Definition DerivativeTraits.hpp:29
Definition GridFunction.hpp:28