3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
8#include <dune/common/std/optional.hh>
9#include <dune/common/typeutilities.hh>
11#include <dune/functions/common/signature.hh>
12#include <dune/functions/common/defaultderivativetraits.hh>
13#include <dune/functions/common/differentiablefunction_imp.hh>
14#include <dune/functions/common/differentiablefunction.hh>
15#include <dune/functions/gridfunctions/gridviewentityset.hh>
16#include <dune/functions/gridfunctions/localderivativetraits.hh>
24template<
class Signature,
class GV,
class FLocal,
template<
class>
class DerivativeTraits=DefaultDerivativeTraits>
25class LocalAnalyticGridViewFunction;
27template<
class Range,
class LocalDomain,
class GV,
class F,
template<
class>
class DerivativeTraits>
28class LocalAnalyticGridViewFunction<Range(LocalDomain), GV, F, DerivativeTraits>
31 using Signature = Range(LocalDomain);
32 using RawSignature =
typename SignatureTraits<Signature>::RawSignature;
33 using DerivativeSignature =
typename DerivativeTraits<RawSignature>::Range(LocalDomain);
36 using EntitySet = GridViewEntitySet<GridView, 0>;
37 using Element =
typename EntitySet::Element;
39 using Geometry =
typename std::decay<typename Element::Geometry>::type;
45 using DerivativeDummy = DifferentiableFunction<DerivativeSignature>;
46 using GlobalRawDerivative =
decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
47 using LocalDerivative = LocalAnalyticGridViewFunction<DerivativeSignature, GridView, GlobalRawDerivative, DerivativeTraits>;
49 template<
class FT, disableCopyMove<LocalAnalyticGr
idViewFunction, FT> = 0>
50 LocalAnalyticGridViewFunction(FT&& f) :
51 f_(std::forward<FT>(f))
55 void bind(
const Element& element)
66 geometry_.emplace(element_.geometry());
72 Range operator()(
const LocalDomain& x)
const
74 return f_(geometry_.value().global(x));
77 const Element& localContext()
const
82 friend LocalDerivative
derivative(
const LocalAnalyticGridViewFunction& t)
84 return LocalDerivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(t.f_));
90 Std::optional<Geometry> geometry_;
101template<
class Signature,
class GV,
class F,
template<
class>
class DerivativeTraits=DefaultDerivativeTraits>
102class AnalyticGridViewFunction;
110template<
class Range,
class Domain,
class GV,
class F,
template<
class>
class DerivativeTraits>
111class AnalyticGridViewFunction<Range(Domain), GV, F, DerivativeTraits>
114 using Signature = Range(Domain);
116 using DerivativeSignature =
typename DerivativeTraits<RawSignature>::Range(Domain);
121 using Geometry =
typename Element::Geometry;
127 using DerivativeDummy = DifferentiableFunction<DerivativeSignature>;
128 using GlobalRawDerivative =
decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
129 using Derivative = AnalyticGridViewFunction<DerivativeSignature, GridView, GlobalRawDerivative, DerivativeTraits>;
135 AnalyticGridViewFunction(FT&& f,
const GridView& gridView) :
136 f_(std::forward<FT>(f)),
140 Range operator()(
const Domain& x)
const
145 friend Derivative
derivative(
const AnalyticGridViewFunction& t)
147 return Derivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(t.f_), t.entitySet_.gridView());
150 friend LocalFunction
localFunction(
const AnalyticGridViewFunction& t)
152 return LocalFunction(t.f_);
178template<
class F,
class Gr
idView>
179AnalyticGridViewFunction<
180 typename std::result_of<F(
typename GridView::template Codim<0>::Geometry::GlobalCoordinate)>::type
181 (
typename GridView::template Codim<0>::Geometry::GlobalCoordinate),
183 typename std::decay<F>::type >
184 makeAnalyticGridViewFunction(F&& f,
const GridView& gridView)
186 using Domain =
typename GridView::template Codim<0>::Geometry::GlobalCoordinate;
187 using Range =
typename std::result_of<F(Domain)>::type;
188 using FRaw =
typename std::decay<F>::type;
190 return AnalyticGridViewFunction<Range(Domain), GridView, FRaw>(std::forward<F>(f), gridView);
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:32
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:35
void localFunction(DiscreteGlobalBasisFunction< TT... > &&t)=delete
Construction of local functions from a temporary DiscreteGlobalBasisFunction (forbidden)
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
Definition: polynomial.hh:10
Derivative traits for local functions.
Definition: localderivativetraits.hh:28
Helper class to deduce the signature of a callable.
Definition: signature.hh:60