DUNE-FUNCTIONS (unstable)

composedgridfunction.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_COMPOSEDGRIDFUNCTION_HH
4 #define DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
5 
6 #include <type_traits>
7 #include <tuple>
8 
9 #include <dune/common/referencehelper.hh>
10 #include <dune/common/typeutilities.hh>
11 
12 #include <dune/functions/common/defaultderivativetraits.hh>
13 #include <dune/functions/common/differentiablefunction.hh>
14 #include <dune/functions/gridfunctions/gridfunction.hh>
15 
16 
17 namespace Dune {
18 namespace Functions {
19 
20 
21 
40 template<class OF, class... IF>
42 {
43  using InnerFunctions = std::tuple<IF...>;
44  using InnerLocalFunctions = std::tuple<decltype(localFunction(resolveRef(std::declval<const IF&>())))...>;
45 
46  template<std::size_t i>
47  using InnerFunction = std::decay_t<ResolveRef_t<std::tuple_element_t<i, InnerFunctions>>>;
48 
49  using OuterFunction = OF;
50 
51 public:
52 
53  using EntitySet = typename InnerFunction<0>::EntitySet;
54  using Element = typename EntitySet::Element;
55 
56  using Domain = typename EntitySet::GlobalCoordinate;
57  using LocalDomain = typename EntitySet::LocalCoordinate;
58 
59  using Range = decltype(std::declval<OF>()(std::declval<IF>()(std::declval<Domain>())...));
60 
61 private:
62 
63  using Traits = Imp::GridFunctionTraits<Range(Domain), EntitySet, DefaultDerivativeTraits, 16>;
64 
65  class LocalFunction
66  {
67  public:
74  LocalFunction(const ComposedGridFunction& globalFunction) :
75  globalFunction_(globalFunction),
76  innerLocalFunctions_(globalFunction.innerLocalFunctions())
77  {}
78 
88  void bind(const Element& element)
89  {
90  std::apply([&](auto&... innerFunction) {
91  (innerFunction.bind(element),...);
92  }, innerLocalFunctions_);
93  }
94 
96  void unbind()
97  {
98  std::apply([&](auto&... innerFunction) {
99  (innerFunction.unbind(),...);
100  }, innerLocalFunctions_);
101  }
102 
105  bool bound() const
106  {
107  return std::apply([](const auto&... innerFunction) {
108  return (innerFunction.bound() && ...);
109  }, innerLocalFunctions_);
110  }
111 
121  Range operator()(const LocalDomain& x) const
122  {
123  return std::apply([&](const auto&... innerFunction) {
124  return globalFunction_.outerFunction_(innerFunction(x)...);
125  }, innerLocalFunctions_);
126  }
127 
137  const Element& localContext() const
138  {
139  return std::get<0>(innerLocalFunctions_).localContext();
140  }
141 
143  friend typename Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction& t)
144  {
145  DUNE_THROW(NotImplemented,"not implemented");
146  }
147 
148  private:
149  const ComposedGridFunction& globalFunction_;
150  InnerLocalFunctions innerLocalFunctions_;
151  };
152 
153 public:
154 
164  template<class OFT, class... IFT,
165  disableCopyMove<ComposedGridFunction, OFT> = 0,
166  std::enable_if_t<(sizeof...(IFT) > 0), int> = 0>
167  ComposedGridFunction(OFT&& outerFunction, IFT&&... innerFunctions) :
168  outerFunction_(std::forward<OFT>(outerFunction)),
169  innerFunctions_(std::forward<IFT>(innerFunctions)...)
170  {}
171 
173  Range operator()(const Domain& x) const
174  {
175  return std::apply([&](const auto&... innerFunction) {
176  return outerFunction_(innerFunction(x)...);
177  }, innerFunctions_);
178  }
179 
181  friend typename Traits::DerivativeInterface derivative(const ComposedGridFunction& t)
182  {
183  DUNE_THROW(NotImplemented,"not implemented");
184  }
185 
192  friend LocalFunction localFunction(const ComposedGridFunction& cgf)
193  {
194  return LocalFunction(cgf);
195  }
196 
207  const EntitySet& entitySet() const
208  {
209  return resolveRef(std::get<0>(innerFunctions_)).entitySet();
210  }
211 
212 protected:
213 
214  InnerLocalFunctions innerLocalFunctions() const
215  {
216  return std::apply([&](const auto&... innerFunction) {
217  return std::make_tuple(localFunction(resolveRef(innerFunction))...);
218  }, innerFunctions_);
219  }
220 
221  OuterFunction outerFunction_;
222  InnerFunctions innerFunctions_;
223 };
224 
225 // deduction guides
226 template<class OF, class... IF>
227 ComposedGridFunction(const OF&, const IF&...)
228  -> ComposedGridFunction<OF,IF...>;
229 
230 
253 template<class OF, class... IF>
254 auto makeComposedGridFunction(OF&& outerFunction, IF&&... innerFunction)
255 {
256  using ComposedGridFunctionType = ComposedGridFunction<std::decay_t<OF>, std::decay_t<IF>...>;
257  return ComposedGridFunctionType(std::forward<OF>(outerFunction), std::forward<IF>(innerFunction)...);
258 }
259 
260 
261 
262 }} // namespace Dune::Functions
263 
264 
265 
266 #endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
Composition of grid functions with another function.
Definition: composedgridfunction.hh:42
const EntitySet & entitySet() const
Return the EntitySet associated to this composed grid-function.
Definition: composedgridfunction.hh:207
ComposedGridFunction(OFT &&outerFunction, IFT &&... innerFunctions)
Create ComposedGridFunction.
Definition: composedgridfunction.hh:167
friend LocalFunction localFunction(const ComposedGridFunction &cgf)
Create a local-function of this composed grid-function.
Definition: composedgridfunction.hh:192
Range operator()(const Domain &x) const
Evaluation of the composed grid function in coordinates x
Definition: composedgridfunction.hh:173
friend Traits::DerivativeInterface derivative(const ComposedGridFunction &t)
Not implemented.
Definition: composedgridfunction.hh:181
auto makeComposedGridFunction(OF &&outerFunction, IF &&... innerFunction)
Create a ComposedGridFunction that composes grid-functions with another function.
Definition: composedgridfunction.hh:254
Definition: polynomial.hh:13
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 10, 22:30, 2024)