DUNE-FUNCTIONS (unstable)

analyticgridviewfunction.hh
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
4 #define DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
5 
6 #include <type_traits>
7 #include <optional>
8 
9 #include <dune/common/copyableoptional.hh>
10 #include <dune/common/typeutilities.hh>
11 
12 #include <dune/functions/common/signature.hh>
13 #include <dune/functions/common/defaultderivativetraits.hh>
14 #include <dune/functions/common/differentiablefunction_imp.hh>
15 #include <dune/functions/common/differentiablefunction.hh>
16 #include <dune/functions/gridfunctions/gridviewentityset.hh>
17 #include <dune/functions/gridfunctions/localderivativetraits.hh>
18 
19 
20 namespace Dune {
21 namespace Functions {
22 
23 namespace Imp {
24 
25 template<class Signature, class GV, class FLocal, template<class> class DerivativeTraits=DefaultDerivativeTraits>
26 class LocalAnalyticGridViewFunction;
27 
28 template<class Range, class LocalDomain, class GV, class F, template<class> class DerivativeTraits>
29 class LocalAnalyticGridViewFunction<Range(LocalDomain), GV, F, DerivativeTraits>
30 {
31 public:
32  using Signature = Range(LocalDomain);
33  using RawSignature = typename SignatureTraits<Signature>::RawSignature;
34  using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(LocalDomain);
35 
36  using GridView = GV;
37  using EntitySet = GridViewEntitySet<GridView, 0>;
38  using Element = typename EntitySet::Element;
39 // using Geometry = typename Element::Geometry;
40  using Geometry = std::decay_t<typename Element::Geometry>;
41 
42  // Use the indirection via derivativeIfImplemented to also support
43  // function types F that do not implement derivative. In this case
44  // the interface type DifferentiableFunction is using a dummy for
45  // the derivative type
46  using DerivativeDummy = DifferentiableFunction<DerivativeSignature>;
47  using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
48  using LocalDerivative = LocalAnalyticGridViewFunction<DerivativeSignature, GridView, GlobalRawDerivative, DerivativeTraits>;
49 
51  template<class FT, disableCopyMove<LocalAnalyticGridViewFunction, FT> = 0>
52  LocalAnalyticGridViewFunction(FT&& f) :
53  f_(std::forward<FT>(f))
54  {}
55 
57  template<class FT>
58  LocalAnalyticGridViewFunction(FT&& f, const Element& element, const std::optional<Geometry>& geometry) :
59  f_(std::forward<FT>(f)),
60  element_(element),
61  geometry_(geometry)
62  {}
63 
64 
73  void bind(const Element& element)
74  {
75  element_ = element;
76  geometry_.emplace(element_.geometry());
77  }
78 
80  void unbind()
81  {
82  geometry_.reset();
83  }
84 
87  bool bound() const
88  {
89  return static_cast<bool>(geometry_);
90  }
91 
101  Range operator()(const LocalDomain& x) const
102  {
103  assert(!!geometry_);
104  return (*f_)(geometry_->global(x));
105  }
106 
108  const Element& localContext() const
109  {
110  assert(!!geometry_);
111  return element_;
112  }
113 
122  friend LocalDerivative derivative(const LocalAnalyticGridViewFunction& t)
123  {
124  return LocalDerivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(*t.f_), t.element_, t.geometry_);
125  }
126 
127 private:
128  // Wrap the function into CopyableOptional to make it copy-assignable
129  CopyableOptional<F> f_;
130  Element element_;
131  std::optional<Geometry> geometry_ = std::nullopt;
132 };
133 
134 } // end namespace Imp
135 
136 
137 
138 
139 template<class Signature, class GV, class F, template<class> class DerivativeTraits=DefaultDerivativeTraits>
140 class AnalyticGridViewFunction;
141 
142 
148 template<class Range, class Domain, class GV, class F, template<class> class DerivativeTraits>
149 class AnalyticGridViewFunction<Range(Domain), GV, F, DerivativeTraits>
150 {
151 public:
152  using Signature = Range(Domain);
153  using RawSignature = typename SignatureTraits<Signature>::RawSignature;
154  using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
155 
156  using GridView = GV;
158  using Element = typename EntitySet::Element;
159  using Geometry = typename Element::Geometry;
160 
161  // Use the indirection via derivativeIfImplemented to also support
162  // function types F that do not implement derivative. In this case
163  // the interface type DifferentiableFunction is used a dummy for
164  // the derivative type
165  using DerivativeDummy = DifferentiableFunction<DerivativeSignature>;
166  using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
167  using Derivative = AnalyticGridViewFunction<DerivativeSignature, GridView, GlobalRawDerivative, DerivativeTraits>;
168 
169  using LocalDomain = typename EntitySet::LocalCoordinate;
170  using LocalFunction = typename Imp::LocalAnalyticGridViewFunction<Range(LocalDomain), GridView, F, LocalDerivativeTraits<EntitySet, DerivativeTraits>::template Traits>;
171 
173  template<class FT>
174  AnalyticGridViewFunction(FT&& f, const GridView& gridView) :
175  f_(std::forward<FT>(f)),
176  entitySet_(gridView)
177  {}
178 
180  Range operator()(const Domain& x) const
181  {
182  return (*f_)(x);
183  }
184 
186  friend Derivative derivative(const AnalyticGridViewFunction& t)
187  {
188  return Derivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(*t.f_), t.entitySet_.gridView());
189  }
190 
192  friend LocalFunction localFunction(const AnalyticGridViewFunction& t)
193  {
194  return LocalFunction(*t.f_);
195  }
196 
198  const EntitySet& entitySet() const
199  {
200  return entitySet_;
201  }
202 
203 private:
204  // Wrap the function into CopyableOptional to make it copy-assignable
205  CopyableOptional<F> f_;
206  EntitySet entitySet_;
207 };
208 
209 // deduction guides
210 template<class F, class GridView,
211  class Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate,
212  class Range = std::invoke_result_t<F,Domain>>
213 AnalyticGridViewFunction(const F&, const GridView&)
214  -> AnalyticGridViewFunction<Range(Domain), GridView, F>;
215 
216 
233 template<class F, class GridView>
234 auto makeAnalyticGridViewFunction(F&& f, const GridView& gridView)
235 {
236  using Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate;
237  using Range = std::invoke_result_t<F, Domain>;
238  using FRaw = std::decay_t<F>;
239 
240  return AnalyticGridViewFunction<Range(Domain), GridView, FRaw>(std::forward<F>(f), gridView);
241 }
242 
243 
244 
245 }} // namespace Dune::Functions
246 
247 
248 
249 #endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
Range operator()(const Domain &x) const
Evaluate the wrapped function f directly in global coordinates x.
Definition: analyticgridviewfunction.hh:180
friend Derivative derivative(const AnalyticGridViewFunction &t)
Create a derivative grid-function by wrapping the derivative of f.
Definition: analyticgridviewfunction.hh:186
AnalyticGridViewFunction(FT &&f, const GridView &gridView)
Create the grid-function by wrapping a function f and create a GridViewEntitySet.
Definition: analyticgridviewfunction.hh:174
friend LocalFunction localFunction(const AnalyticGridViewFunction &t)
Construct the associated local-function.
Definition: analyticgridviewfunction.hh:192
const EntitySet & entitySet() const
Return the set of entities this local-function can be bound to.
Definition: analyticgridviewfunction.hh:198
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
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
auto makeAnalyticGridViewFunction(F &&f, const GridView &gridView)
Create an AnalyticGridViewFunction from a function and a grid view.
Definition: analyticgridviewfunction.hh:234
Definition: polynomial.hh:13
Derivative traits for local functions.
Definition: localderivativetraits.hh:28
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 10, 22:30, 2024)