dune-functions  2.5.1
functionconcepts.hh
Go to the documentation of this file.
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_COMMON_FUNCTIONCONCEPT_HH
4 #define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
5 
6 #include <dune/common/typelist.hh>
7 #include <dune/common/concept.hh>
8 
12 
13 namespace Dune {
14 namespace Functions {
15 namespace Concept {
16 
17 using namespace Dune::Concept;
18 
19 
20 
21 // Callable concept ############################################################
22 
23 
31 template<class... Args>
32 struct Callable
33 {
34  template<class F>
35  auto require(F&& f) -> decltype(
36  f(std::declval<Args>()...)
37  );
38 };
39 
41 template<class F, class... Args>
42 static constexpr bool isCallable()
43 { return models<Concept::Callable<Args...>, F>(); }
44 
46 template<class F, class... Args>
47 static constexpr bool isCallable(F&& f, TypeList<Args...>)
48 { return models<Concept::Callable<Args...>, F>(); }
49 
50 
51 
52 // Function concept ############################################################
53 template<class Signature>
54 struct Function;
55 
64 template<class Range, class Domain>
65 struct Function<Range(Domain)> : Refines<Callable<Domain> >
66 {
67  template<class F>
68  auto require(F&& f) -> decltype(
69  // F models Function<Range(Domain)> if the result of F(Domain) is implicitly convertible to Range
70  requireConvertible<Range>(f(std::declval<Domain>()))
71  );
72 };
73 
75 template<class F, class Signature>
76 static constexpr bool isFunction()
77 { return models<Concept::Function<Signature>, F>(); }
78 
80 template<class F, class Signature, template<class> class DerivativeTraits>
82 { return models<Concept::Function<Signature>, F>(); }
83 
84 
85 
86 // DifferentiableFunction concept ##############################################
87 template<class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
89 
101 template<class Range, class Domain, template<class> class DerivativeTraits>
102 struct DifferentiableFunction<Range(Domain), DerivativeTraits> : Refines<Dune::Functions::Concept::Function<Range(Domain)> >
103 {
105 
106  template<class F>
107  auto require(F&& f) -> decltype(
108  derivative(f),
109  requireConcept<Function<DerivativeSignature>>(derivative(f))
110  );
111 };
112 
114 template<class F, class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
115 static constexpr bool isDifferentiableFunction()
116 { return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
117 
119 template<class F, class Signature, template<class> class DerivativeTraits>
121 { return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
122 
123 
124 
125 // LocalFunction concept ##############################################
126 template<class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
128 
141 template<class Range, class Domain, class LocalContext, template<class> class DerivativeTraits>
142 struct LocalFunction<Range(Domain), LocalContext, DerivativeTraits> :
143  Refines<Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits> >
144 {
145  template<class F>
146  auto require(F&& f) -> decltype(
147  f.bind(std::declval<LocalContext>()),
148  f.unbind(),
149  f.localContext(),
150  requireConvertible<LocalContext>(f.localContext())
151  );
152 };
153 
155 template<class F, class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
156 static constexpr bool isLocalFunction()
157 { return models<Concept::LocalFunction<Signature, LocalContext, DerivativeTraits>, F>(); }
158 
159 
160 
161 // EntitySet concept ##############################################
162 
172 struct EntitySet
173 {
174  template<class E>
175  auto require(E&& f) -> decltype(
176  requireType<typename E::Element>(),
177  requireType<typename E::LocalCoordinate>(),
178  requireType<typename E::GlobalCoordinate>()
179  );
180 };
181 
183 template<class E>
184 static constexpr bool isEntitySet()
185 { return models<Concept::EntitySet, E>(); }
186 
187 
188 
189 // GridFunction concept ##############################################
190 template<class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
192 
205 template<class Range, class Domain, class EntitySet, template<class> class DerivativeTraits>
206 struct GridFunction<Range(Domain), EntitySet, DerivativeTraits> :
207  Refines<Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits> >
208 {
209  using LocalSignature = Range(typename EntitySet::LocalCoordinate);
210  using LocalContext = typename EntitySet::Element;
211 
212  template<class R>
214 
215  template<class F>
216  auto require(F&& f) -> decltype(
217  localFunction(f),
218  f.entitySet(),
219  requireConcept<LocalFunction<LocalSignature, LocalContext, LocalDerivativeTraits>>(localFunction(f)),
220  requireConcept<Concept::EntitySet, EntitySet>(),
221  requireConvertible<EntitySet>(f.entitySet()),
222  requireConvertible<typename EntitySet::GlobalCoordinate, Domain>()
223  );
224 };
225 
227 template<class F, class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
228 static constexpr bool isGridFunction()
229 { return models<Concept::GridFunction<Signature, EntitySet, DerivativeTraits>, F>(); }
230 
231 
232 
233 // GridViewFunction concept ##############################################
234 template<class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
236 
250 template<class Range, class Domain, class GridView, template<class> class DerivativeTraits>
251 struct GridViewFunction<Range(Domain), GridView, DerivativeTraits> :
252  Refines<Dune::Functions::Concept::GridFunction<Range(Domain), GridViewEntitySet<GridView,0>, DerivativeTraits>>
253 {
254  template<class F>
255  auto require(F&& f) -> decltype(
256  0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
257  );
258 };
259 
261 template<class F, class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
262 static constexpr bool isGridViewFunction()
263 { return models<Concept::GridViewFunction<Signature, GridView, DerivativeTraits>, F>(); }
264 
265 
266 
267 }}} // namespace Dune::Functions::Concept
268 
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