3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
9#include <dune/common/referencehelper.hh>
12#include <dune/functions/common/defaultderivativetraits.hh>
13#include <dune/functions/common/differentiablefunction.hh>
14#include <dune/functions/gridfunctions/gridfunction.hh>
40template<
class OF,
class... IF>
43 using InnerFunctions = std::tuple<IF...>;
44 using InnerLocalFunctions = std::tuple<decltype(localFunction(resolveRef(std::declval<const IF&>())))...>;
46 template<std::
size_t i>
47 using InnerFunction = std::decay_t<ResolveRef_t<std::tuple_element_t<i, InnerFunctions>>>;
49 using OuterFunction = OF;
53 using EntitySet =
typename InnerFunction<0>::EntitySet;
54 using Element =
typename EntitySet::Element;
56 using Domain =
typename EntitySet::GlobalCoordinate;
57 using LocalDomain =
typename EntitySet::LocalCoordinate;
59 using Range =
decltype(std::declval<OF>()(std::declval<IF>()(std::declval<Domain>())...));
75 globalFunction_(globalFunction),
76 innerLocalFunctions_(globalFunction.innerLocalFunctions())
88 void bind(
const Element& element)
90 std::apply([&](
auto&... innerFunction) {
91 (innerFunction.bind(element),...);
92 }, innerLocalFunctions_);
98 std::apply([&](
auto&... innerFunction) {
99 (innerFunction.unbind(),...);
100 }, innerLocalFunctions_);
107 return std::apply([](
const auto&... innerFunction) {
108 return (innerFunction.bound() && ...);
109 }, innerLocalFunctions_);
123 return std::apply([&](
const auto&... innerFunction) {
124 return globalFunction_.outerFunction_(innerFunction(x)...);
125 }, innerLocalFunctions_);
137 const Element& localContext()
const
139 return std::get<0>(innerLocalFunctions_).localContext();
143 friend typename Traits::LocalFunctionTraits::DerivativeInterface
derivative(
const LocalFunction& t)
150 InnerLocalFunctions innerLocalFunctions_;
164 template<
class OFT,
class... IFT,
166 std::enable_if_t<(
sizeof...(IFT) > 0),
int> = 0>
168 outerFunction_(
std::forward<OFT>(outerFunction)),
169 innerFunctions_(
std::forward<IFT>(innerFunctions)...)
192 return LocalFunction(cgf);
207 return resolveRef(std::get<0>(innerFunctions_)).entitySet();
212 InnerLocalFunctions innerLocalFunctions()
const
214 return std::apply([&](
const auto&... innerFunction) {
219 OuterFunction outerFunction_;
220 InnerFunctions innerFunctions_;
247template<
class OF,
class... IF>
251 return ComposedGridFunctionType(std::forward<OF>(outerFunction), std::forward<IF>(innerFunction)...);
Composition of grid functions with another function.
Definition: composedgridfunction.hh:42
ComposedGridFunction(OFT &&outerFunction, IFT &&... innerFunctions)
Create ComposedGridFunction.
Definition: composedgridfunction.hh:167
const EntitySet & entitySet() const
Return the EntitySet associated to this composed grid-function.
Definition: composedgridfunction.hh:205
friend LocalFunction localFunction(const ComposedGridFunction &cgf)
Create a local-function of this composed grid-function.
Definition: composedgridfunction.hh:190
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:179
Default exception for dummy implementations.
Definition: exceptions.hh:263
constexpr T & resolveRef(T &gf) noexcept
Helper function to resolve std::reference_wrapper.
Definition: referencehelper.hh:47
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
auto makeComposedGridFunction(OF &&outerFunction, IF &&... innerFunction)
Create a ComposedGridFunction that composes grid-functions with another function.
Definition: composedgridfunction.hh:248
std::enable_if_t< not Impl::disableCopyMoveHelper< This, T... >::value, int > disableCopyMove
Helper to disable constructor as copy and move constructor.
Definition: typeutilities.hh:45
Dune namespace.
Definition: alignedallocator.hh:13
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
Utilities for type computations, constraining overloads, ...