3 #ifndef DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH 4 #define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH 6 #include <dune/common/typelist.hh> 7 #include <dune/common/concept.hh> 31 template<
class... Args>
35 auto require(F&& f) -> decltype(
36 f(std::declval<Args>()...)
41 template<
class F,
class... Args>
46 template<
class F,
class... Args>
47 static constexpr
bool isCallable(F&& f, TypeList<Args...>)
53 template<
class Signature>
64 template<
class Range,
class Domain>
65 struct Function<Range(Domain)> : Refines<Callable<Domain> >
68 auto require(F&& f) -> decltype(
70 requireConvertible<Range>(f(std::declval<Domain>()))
75 template<
class F,
class Signature>
77 {
return models<Concept::Function<Signature>, F>(); }
80 template<
class F,
class Signature,
template<
class>
class DerivativeTraits>
82 {
return models<Concept::Function<Signature>, F>(); }
101 template<
class Range,
class Domain,
template<
class>
class DerivativeTraits>
102 struct DifferentiableFunction<Range(Domain), DerivativeTraits> : Refines<Dune::Functions::Concept::Function<Range(Domain)> >
107 auto require(F&& f) -> decltype(
116 {
return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
119 template<
class F,
class Signature,
template<
class>
class DerivativeTraits>
121 {
return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
126 template<
class Signature,
class LocalContext,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
141 template<
class Range,
class Domain,
class LocalContext,
template<
class>
class DerivativeTraits>
143 Refines<Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits> >
146 auto require(F&& f) -> decltype(
147 f.bind(std::declval<LocalContext>()),
150 requireConvertible<LocalContext>(f.localContext())
155 template<
class F,
class Signature,
class LocalContext,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
157 {
return models<Concept::LocalFunction<Signature, LocalContext, DerivativeTraits>, F>(); }
175 auto require(E&& f) -> decltype(
176 requireType<typename E::Element>(),
177 requireType<typename E::LocalCoordinate>(),
178 requireType<typename E::GlobalCoordinate>()
185 {
return models<Concept::EntitySet, E>(); }
205 template<
class Range,
class Domain,
class EntitySet,
template<
class>
class DerivativeTraits>
207 Refines<Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits> >
216 auto require(F&& f) -> decltype(
219 requireConcept<LocalFunction<LocalSignature, LocalContext, LocalDerivativeTraits>>(localFunction(f)),
220 requireConcept<Concept::EntitySet, EntitySet>(),
221 requireConvertible<EntitySet>(f.entitySet()),
222 requireConvertible<typename EntitySet::GlobalCoordinate, Domain>()
227 template<
class F,
class Signature,
class EntitySet,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
229 {
return models<Concept::GridFunction<Signature, EntitySet, DerivativeTraits>, F>(); }
250 template<
class Range,
class Domain,
class Gr
idView,
template<
class>
class DerivativeTraits>
252 Refines<Dune::Functions::Concept::GridFunction<Range(Domain), GridViewEntitySet<GridView,0>, DerivativeTraits>>
255 auto require(F&& f) -> decltype(
261 template<
class F,
class Signature,
class Gr
idView,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
263 {
return models<Concept::GridViewFunction<Signature, GridView, DerivativeTraits>, F>(); }
269 #endif // DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH Derivative traits for local functions.
Definition: localderivativetraits.hh:27
typename EntitySet::Element LocalContext
Definition: functionconcepts.hh:210
Definition: functionconcepts.hh:54
static constexpr bool isFunction()
Check if F models the Function concept with given signature.
Definition: functionconcepts.hh:76
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition: functionconcepts.hh:209
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:36
Definition: polynomial.hh:7
typename SignatureTraits< Range(Domain)>::template DerivativeSignature< DerivativeTraits > DerivativeSignature
Definition: functionconcepts.hh:104
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:38
static constexpr bool isCallable()
Check if F models the Function concept with given signature.
Definition: functionconcepts.hh:42
static constexpr bool isEntitySet()
Check if F models the GridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:184
Definition: functionconcepts.hh:88
Definition: signature.hh:106
Concept objects that can be called with given argument list.
Definition: functionconcepts.hh:32
static constexpr bool isGridFunction()
Check if F models the GridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:228
Definition: functionconcepts.hh:191
Definition: functionconcepts.hh:127
typename Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits< R > LocalDerivativeTraits
Definition: functionconcepts.hh:213
Definition: functionconcepts.hh:235
static constexpr bool isGridViewFunction()
Check if F models the GridViewFunction concept with given signature.
Definition: functionconcepts.hh:262
Helper class to deduce the signature of a callable.
Definition: signature.hh:60
static constexpr bool isLocalFunction()
Check if F models the LocalFunction concept with given signature and local context.
Definition: functionconcepts.hh:156
Concept for an entity set for a Concept::GridFunction<Range(Domain), EntitySet, DerivativeTraits> ...
Definition: functionconcepts.hh:172
static constexpr bool isDifferentiableFunction()
Check if F models the DifferentiableFunction concept with given signature.
Definition: functionconcepts.hh:115