7#ifndef DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
8#define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
10#include <dune/common/typelist.hh>
11#include <dune/common/concept.hh>
21using namespace Dune::Concept;
35template<
class... Args>
40 f(std::declval<Args>()...)
50template<
class F,
class... Args>
60template<
class F,
class... Args>
69template<
class Signature>
80template<
class Range,
class Domain>
81struct Function<Range(Domain)> : Refines<Callable<Domain> >
86 requireConvertible<Range>(f(std::declval<Domain>()))
91template<
class F,
class Signature>
93{
return models<Concept::Function<Signature>, F>(); }
96template<
class F,
class Signature,
template<
class>
class DerivativeTraits>
98{
return models<Concept::Function<Signature>, F>(); }
117template<
class Range,
class Domain,
template<
class>
class DerivativeTraits>
118struct DifferentiableFunction<Range(Domain), DerivativeTraits> : Refines<Dune::Functions::Concept::Function<Range(Domain)> >
125 requireConcept<Function<DerivativeSignature>>(
derivative(f))
132{
return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
135template<
class F,
class Signature,
template<
class>
class DerivativeTraits>
137{
return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
142template<
class Signature,
class LocalContext>
154template<
class Range,
class Domain,
class LocalContext>
156 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
160 f.bind(std::declval<LocalContext>()),
162 requireConvertible<bool>(f.bound()),
164 requireConvertible<LocalContext>(f.localContext())
169template<
class F,
class Signature,
class LocalContext>
171{
return models<Concept::LocalFunction<Signature, LocalContext>, F>(); }
190template<
class Range,
class Domain,
class LocalContext,
template<
class>
class DerivativeTraits>
193 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
194 Dune::Functions::Concept::LocalFunction<Range(Domain),LocalContext>
199 f.bind(std::declval<LocalContext>()),
202 requireConvertible<LocalContext>(f.localContext())
207template<
class F,
class Signature,
class LocalContext,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
209{
return models<Concept::DifferentiableLocalFunction<Signature, LocalContext, DerivativeTraits>, F>(); }
227 requireType<typename E::Element>(),
228 requireType<typename E::LocalCoordinate>(),
229 requireType<typename E::GlobalCoordinate>()
236{
return models<Concept::EntitySet, E>(); }
241template<
class Signature,
class EntitySet>
253template<
class Range,
class Domain,
class EntitySet>
255 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
264 requireConcept<LocalFunction<LocalSignature, LocalContext>>(localFunction(f)),
265 requireConcept<Concept::EntitySet, EntitySet>(),
266 requireConvertible<EntitySet>(f.entitySet()),
267 requireConvertible<typename EntitySet::GlobalCoordinate, Domain>()
272template<
class F,
class Signature,
class EntitySet>
274{
return models<Concept::GridFunction<Signature, EntitySet>, F>(); }
293template<
class Range,
class Domain,
class EntitySet,
template<
class>
class DerivativeTraits>
296 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
297 Dune::Functions::Concept::GridFunction<Range(Domain),EntitySet>
308 requireConcept<DifferentiableLocalFunction<LocalSignature, LocalContext, LocalDerivativeTraits>>(localFunction(f))
313template<
class F,
class Signature,
class EntitySet,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
315{
return models<Concept::DifferentiableGridFunction<Signature, EntitySet, DerivativeTraits>, F>(); }
320template<
class Signature,
class Gr
idView>
335template<
class Range,
class Domain,
class Gr
idView>
337 Refines<Dune::Functions::Concept::GridFunction<Range(Domain), GridViewEntitySet<GridView,0>>>
346template<
class F,
class Signature,
class Gr
idView>
348{
return models<Concept::GridViewFunction<Signature, GridView>, F>(); }
368template<
class Range,
class Domain,
class Gr
idView,
template<
class>
class DerivativeTraits>
370 Refines<Dune::Functions::Concept::DifferentiableGridFunction<Range(Domain), GridViewEntitySet<GridView,0>, DerivativeTraits>>
379template<
class F,
class Signature,
class Gr
idView,
template<
class>
class DerivativeTraits =
DefaultDerivativeTraits>
381{
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:273
static constexpr bool isDifferentiableLocalFunction()
Check if F models the DifferentiableLocalFunction concept with given signature and local context.
Definition functionconcepts.hh:208
static constexpr bool isFunction()
Check if F models the Function concept with given signature.
Definition functionconcepts.hh:92
static constexpr bool isDifferentiableGridViewFunction()
Check if F models the DifferentiableGridViewFunction concept with given signature.
Definition functionconcepts.hh:380
static constexpr bool isDifferentiableFunction()
Check if F models the DifferentiableFunction concept with given signature.
Definition functionconcepts.hh:131
static constexpr bool isGridViewFunction()
Check if F models the GridViewFunction concept with given signature.
Definition functionconcepts.hh:347
static constexpr bool isEntitySet()
Check if F models the GridFunction concept with given signature and entity set.
Definition functionconcepts.hh:235
static constexpr bool isDifferentiableGridFunction()
Check if F models the DifferentiableGridFunction concept with given signature and entity set.
Definition functionconcepts.hh:314
static constexpr bool isLocalFunction()
Check if F models the LocalFunction concept with given signature and local context.
Definition functionconcepts.hh:170
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition trigonometricfunction.hh:43
static constexpr auto isCallable()
Check if f is callable with given argument list.
Definition functionconcepts.hh:51
Definition polynomial.hh:17
Default implementation for derivative traits.
Definition defaultderivativetraits.hh:41
Concept objects that can be called with given argument list.
Definition functionconcepts.hh:37
auto require(F &&f) -> decltype(f(std::declval< Args >()...))
Definition functionconcepts.hh:70
auto require(F &&f) -> decltype(requireConvertible< Range >(f(std::declval< Domain >())))
Definition functionconcepts.hh:104
typename SignatureTraits< Range(Domain)>::template DerivativeSignature< DerivativeTraits > DerivativeSignature
Definition functionconcepts.hh:120
auto require(F &&f) -> decltype(derivative(f), requireConcept< Function< DerivativeSignature > >(derivative(f)))
Definition functionconcepts.hh:143
auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), f.unbind(), requireConvertible< bool >(f.bound()), f.localContext(), requireConvertible< LocalContext >(f.localContext()))
Definition functionconcepts.hh:176
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:224
auto require(E &&f) -> decltype(requireType< typename E::Element >(), requireType< typename E::LocalCoordinate >(), requireType< typename E::GlobalCoordinate >())
Definition functionconcepts.hh:242
typename EntitySet::Element LocalContext
Definition functionconcepts.hh:258
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition functionconcepts.hh:257
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 >())
Definition functionconcepts.hh:279
typename Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits< R > LocalDerivativeTraits
Definition functionconcepts.hh:304
auto require(F &&f) -> decltype(requireConcept< DifferentiableLocalFunction< LocalSignature, LocalContext, LocalDerivativeTraits > >(localFunction(f)))
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition functionconcepts.hh:300
typename EntitySet::Element LocalContext
Definition functionconcepts.hh:301
Definition functionconcepts.hh:321
auto require(F &&f) -> decltype(0)
Definition functionconcepts.hh:353
auto require(F &&f) -> decltype(0)
Helper class to deduce the signature of a callable.
Definition signature.hh:60
Definition signature.hh:106
Derivative traits for local functions.
Definition localderivativetraits.hh:32