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>
17 using namespace Dune::Concept;
31 template<
class... Args>
36 f(std::declval<Args>()...)
46 template<
class F,
class... Args>
56 template<
class F,
class... Args>
65 template<
class Signature>
76 template<
class Range,
class Domain>
77 struct Function<Range(Domain)> : Refines<Callable<Domain> >
82 requireConvertible<Range>(f(std::declval<Domain>()))
87 template<
class F,
class Signature>
89 {
return models<Concept::Function<Signature>, F>(); }
92 template<
class F,
class Signature,
template<
class>
class DerivativeTraits>
94 {
return models<Concept::Function<Signature>, F>(); }
113 template<
class Range,
class Domain,
template<
class>
class DerivativeTraits>
114 struct DifferentiableFunction<Range(Domain), DerivativeTraits> : Refines<Dune::Functions::Concept::Function<Range(Domain)> >
128 {
return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
131 template<
class F,
class Signature,
template<
class>
class DerivativeTraits>
133 {
return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
138 template<
class Signature,
class LocalContext>
150 template<
class Range,
class Domain,
class LocalContext>
152 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
156 f.bind(std::declval<LocalContext>()),
159 requireConvertible<LocalContext>(f.localContext())
164 template<
class F,
class Signature,
class LocalContext>
166 {
return models<Concept::LocalFunction<Signature, LocalContext>, F>(); }
170 template<
class Signature,
class LocalContext,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
185 template<
class Range,
class Domain,
class LocalContext,
template<
class>
class DerivativeTraits>
188 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
189 Dune::Functions::Concept::LocalFunction<Range(Domain),LocalContext>
194 f.bind(std::declval<LocalContext>()),
197 requireConvertible<LocalContext>(f.localContext())
202 template<
class F,
class Signature,
class LocalContext,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
204 {
return models<Concept::DifferentiableLocalFunction<Signature, LocalContext, DerivativeTraits>, F>(); }
222 requireType<typename E::Element>(),
223 requireType<typename E::LocalCoordinate>(),
224 requireType<typename E::GlobalCoordinate>()
231 {
return models<Concept::EntitySet, E>(); }
236 template<
class Signature,
class EntitySet>
248 template<
class Range,
class Domain,
class EntitySet>
250 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
260 requireConcept<Concept::EntitySet, EntitySet>(),
261 requireConvertible<EntitySet>(f.entitySet()),
262 requireConvertible<typename EntitySet::GlobalCoordinate, Domain>()
267 template<
class F,
class Signature,
class EntitySet>
269 {
return models<Concept::GridFunction<Signature, EntitySet>, F>(); }
288 template<
class Range,
class Domain,
class EntitySet,
template<
class>
class DerivativeTraits>
291 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
292 Dune::Functions::Concept::GridFunction<Range(Domain),EntitySet>
308 template<
class F,
class Signature,
class EntitySet,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
310 {
return models<Concept::DifferentiableGridFunction<Signature, EntitySet, DerivativeTraits>, F>(); }
315 template<
class Signature,
class Gr
idView>
330 template<
class Range,
class Domain,
class Gr
idView>
332 Refines<Dune::Functions::Concept::GridFunction<Range(Domain), GridViewEntitySet<GridView,0>>>
341 template<
class F,
class Signature,
class Gr
idView>
343 {
return models<Concept::GridViewFunction<Signature, GridView>, F>(); }
363 template<
class Range,
class Domain,
class Gr
idView,
template<
class>
class DerivativeTraits>
365 Refines<Dune::Functions::Concept::DifferentiableGridFunction<Range(Domain), GridViewEntitySet<GridView,0>, DerivativeTraits>>
374 template<
class F,
class Signature,
class Gr
idView,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
376 {
return models<Concept::DifferentiableGridViewFunction<Signature, GridView, DerivativeTraits>, F>(); }
static constexpr bool isGridFunction()
Check if F models the GridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:268
static constexpr bool isDifferentiableLocalFunction()
Check if F models the DifferentiableLocalFunction concept with given signature and local context.
Definition: functionconcepts.hh:203
static constexpr bool isFunction()
Check if F models the Function concept with given signature.
Definition: functionconcepts.hh:88
static constexpr bool isDifferentiableGridViewFunction()
Check if F models the DifferentiableGridViewFunction concept with given signature.
Definition: functionconcepts.hh:375
static constexpr bool isDifferentiableFunction()
Check if F models the DifferentiableFunction concept with given signature.
Definition: functionconcepts.hh:127
static constexpr bool isGridViewFunction()
Check if F models the GridViewFunction concept with given signature.
Definition: functionconcepts.hh:342
static constexpr bool isEntitySet()
Check if F models the GridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:230
static constexpr bool isDifferentiableGridFunction()
Check if F models the DifferentiableGridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:309
static constexpr bool isLocalFunction()
Check if F models the LocalFunction concept with given signature and local context.
Definition: functionconcepts.hh:165
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
void localFunction(DiscreteGlobalBasisFunction< TT... > &&t)=delete
Construction of local functions from a temporary DiscreteGlobalBasisFunction (forbidden)
static constexpr auto isCallable()
Check if f is callable with given argument list.
Definition: functionconcepts.hh:47
Definition: polynomial.hh:10
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
Concept objects that can be called with given argument list.
Definition: functionconcepts.hh:33
auto require(F &&f) -> decltype(f(std::declval< Args >()...))
Definition: functionconcepts.hh:66
auto require(F &&f) -> decltype(requireConvertible< Range >(f(std::declval< Domain >())))
Definition: functionconcepts.hh:100
typename SignatureTraits< Range(Domain)>::template DerivativeSignature< DerivativeTraits > DerivativeSignature
Definition: functionconcepts.hh:116
auto require(F &&f) -> decltype(derivative(f), requireConcept< Function< DerivativeSignature >>(derivative(f)))
Definition: functionconcepts.hh:139
auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), f.unbind(), f.localContext(), requireConvertible< LocalContext >(f.localContext()))
Definition: functionconcepts.hh:171
auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), f.unbind(), f.localContext(), requireConvertible< LocalContext >(f.localContext()))
Concept for an entity set for a Concept::GridFunction<Range(Domain), EntitySet, DerivativeTraits>
Definition: functionconcepts.hh:219
auto require(E &&f) -> decltype(requireType< typename E::Element >(), requireType< typename E::LocalCoordinate >(), requireType< typename E::GlobalCoordinate >())
Definition: functionconcepts.hh:237
typename EntitySet::Element LocalContext
Definition: functionconcepts.hh:253
auto require(F &&f) -> decltype(localFunction(f), f.entitySet(), requireConcept< LocalFunction< LocalSignature, LocalContext >>(localFunction(f)), requireConcept< Concept::EntitySet, EntitySet >(), requireConvertible< EntitySet >(f.entitySet()), requireConvertible< typename EntitySet::GlobalCoordinate, Domain >())
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition: functionconcepts.hh:252
Definition: functionconcepts.hh:274
typename Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits< R > LocalDerivativeTraits
Definition: functionconcepts.hh:299
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition: functionconcepts.hh:295
typename EntitySet::Element LocalContext
Definition: functionconcepts.hh:296
auto require(F &&f) -> decltype(requireConcept< DifferentiableLocalFunction< LocalSignature, LocalContext, LocalDerivativeTraits >>(localFunction(f)))
Definition: functionconcepts.hh:316
auto require(F &&f) -> decltype(0)
Definition: functionconcepts.hh:348
auto require(F &&f) -> decltype(0)
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
Definition: signature.hh:102
Derivative traits for local functions.
Definition: localderivativetraits.hh:28