Dune Core Modules (2.9.0)

functionconcepts.hh
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 
9 #include <dune/functions/common/signature.hh>
10 #include <dune/functions/gridfunctions/localderivativetraits.hh>
11 #include <dune/functions/gridfunctions/gridviewentityset.hh>
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 
46 template<class F, class... Args>
47 static constexpr auto isCallable()
48 { return models<Concept::Callable<Args...>, F>(); }
49 
56 template<class F, class... Args>
57 static constexpr auto isCallable(F&&, Args&&...)
58 {
59  return models<Concept::Callable<Args&&...>, F>();
60 }
61 
62 
63 
64 // Function concept ############################################################
65 template<class Signature>
66 struct Function;
67 
76 template<class Range, class Domain>
77 struct Function<Range(Domain)> : Refines<Callable<Domain> >
78 {
79  template<class F>
80  auto require(F&& f) -> decltype(
81  // F models Function<Range(Domain)> if the result of F(Domain) is implicitly convertible to Range
82  requireConvertible<Range>(f(std::declval<Domain>()))
83  );
84 };
85 
87 template<class F, class Signature>
88 static constexpr bool isFunction()
89 { return models<Concept::Function<Signature>, F>(); }
90 
92 template<class F, class Signature, template<class> class DerivativeTraits>
93 static constexpr bool isFunction(F&& f, SignatureTag<Signature, DerivativeTraits>)
94 { return models<Concept::Function<Signature>, F>(); }
95 
96 
97 
98 // DifferentiableFunction concept ##############################################
99 template<class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
100 struct DifferentiableFunction;
101 
113 template<class Range, class Domain, template<class> class DerivativeTraits>
114 struct DifferentiableFunction<Range(Domain), DerivativeTraits> : Refines<Dune::Functions::Concept::Function<Range(Domain)> >
115 {
116  using DerivativeSignature = typename SignatureTraits<Range(Domain)>::template DerivativeSignature<DerivativeTraits>;
117 
118  template<class F>
119  auto require(F&& f) -> decltype(
120  derivative(f),
121  requireConcept<Function<DerivativeSignature>>(derivative(f))
122  );
123 };
124 
126 template<class F, class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
127 static constexpr bool isDifferentiableFunction()
128 { return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
129 
131 template<class F, class Signature, template<class> class DerivativeTraits>
132 static constexpr bool isDifferentiableFunction(F&& f, SignatureTag<Signature, DerivativeTraits>)
133 { return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
134 
135 
136 
137 // LocalFunction concept ##############################################
138 template<class Signature, class LocalContext>
139 struct LocalFunction;
140 
150 template<class Range, class Domain, class LocalContext>
151 struct LocalFunction<Range(Domain), LocalContext> :
152  Refines<Dune::Functions::Concept::Function<Range(Domain)> >
153 {
154  template<class F>
155  auto require(F&& f) -> decltype(
156  f.bind(std::declval<LocalContext>()),
157  f.unbind(),
158  requireConvertible<bool>(f.bound()),
159  f.localContext(),
160  requireConvertible<LocalContext>(f.localContext())
161  );
162 };
163 
165 template<class F, class Signature, class LocalContext>
166 static constexpr bool isLocalFunction()
167 { return models<Concept::LocalFunction<Signature, LocalContext>, F>(); }
168 
169 
170 // DifferentiableLocalFunction concept ##############################################
171 template<class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
172 struct DifferentiableLocalFunction;
173 
186 template<class Range, class Domain, class LocalContext, template<class> class DerivativeTraits>
187 struct DifferentiableLocalFunction<Range(Domain), LocalContext, DerivativeTraits> :
188  Refines<
189  Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
190  Dune::Functions::Concept::LocalFunction<Range(Domain),LocalContext>
191  >
192 {
193  template<class F>
194  auto require(F&& f) -> decltype(
195  f.bind(std::declval<LocalContext>()),
196  f.unbind(),
197  f.localContext(),
198  requireConvertible<LocalContext>(f.localContext())
199  );
200 };
201 
203 template<class F, class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
204 static constexpr bool isDifferentiableLocalFunction()
205 { return models<Concept::DifferentiableLocalFunction<Signature, LocalContext, DerivativeTraits>, F>(); }
206 
207 
208 // EntitySet concept ##############################################
209 
219 struct EntitySet
220 {
221  template<class E>
222  auto require(E&& f) -> decltype(
223  requireType<typename E::Element>(),
224  requireType<typename E::LocalCoordinate>(),
225  requireType<typename E::GlobalCoordinate>()
226  );
227 };
228 
230 template<class E>
231 static constexpr bool isEntitySet()
232 { return models<Concept::EntitySet, E>(); }
233 
234 
235 
236 // GridFunction concept ##############################################
237 template<class Signature, class EntitySet>
238 struct GridFunction;
239 
249 template<class Range, class Domain, class EntitySet>
250 struct GridFunction<Range(Domain), EntitySet> :
251  Refines<Dune::Functions::Concept::Function<Range(Domain)> >
252 {
253  using LocalSignature = Range(typename EntitySet::LocalCoordinate);
254  using LocalContext = typename EntitySet::Element;
255 
256  template<class F>
257  auto require(F&& f) -> decltype(
258  localFunction(f),
259  f.entitySet(),
260  requireConcept<LocalFunction<LocalSignature, LocalContext>>(localFunction(f)),
261  requireConcept<Concept::EntitySet, EntitySet>(),
262  requireConvertible<EntitySet>(f.entitySet()),
263  requireConvertible<typename EntitySet::GlobalCoordinate, Domain>()
264  );
265 };
266 
268 template<class F, class Signature, class EntitySet>
269 static constexpr bool isGridFunction()
270 { return models<Concept::GridFunction<Signature, EntitySet>, F>(); }
271 
272 
273 // DifferentiableGridFunction concept ##############################################
274 template<class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
275 struct DifferentiableGridFunction;
276 
289 template<class Range, class Domain, class EntitySet, template<class> class DerivativeTraits>
290 struct DifferentiableGridFunction<Range(Domain), EntitySet, DerivativeTraits> :
291  Refines<
292  Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
293  Dune::Functions::Concept::GridFunction<Range(Domain),EntitySet>
294  >
295 {
296  using LocalSignature = Range(typename EntitySet::LocalCoordinate);
297  using LocalContext = typename EntitySet::Element;
298 
299  template<class R>
300  using LocalDerivativeTraits = typename Dune::Functions::LocalDerivativeTraits<EntitySet, DerivativeTraits>::template Traits<R>;
301 
302  template<class F>
303  auto require(F&& f) -> decltype(
304  requireConcept<DifferentiableLocalFunction<LocalSignature, LocalContext, LocalDerivativeTraits>>(localFunction(f))
305  );
306 };
307 
309 template<class F, class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
310 static constexpr bool isDifferentiableGridFunction()
311 { return models<Concept::DifferentiableGridFunction<Signature, EntitySet, DerivativeTraits>, F>(); }
312 
313 
314 
315 // GridViewFunction concept ##############################################
316 template<class Signature, class GridView>
317 struct GridViewFunction;
318 
331 template<class Range, class Domain, class GridView>
332 struct GridViewFunction<Range(Domain), GridView> :
333  Refines<Dune::Functions::Concept::GridFunction<Range(Domain), GridViewEntitySet<GridView,0>>>
334 {
335  template<class F>
336  auto require(F&& f) -> decltype(
337  0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
338  );
339 };
340 
342 template<class F, class Signature, class GridView>
343 static constexpr bool isGridViewFunction()
344 { return models<Concept::GridViewFunction<Signature, GridView>, F>(); }
345 
346 
347 // DifferentiableGridViewFunction concept ##############################################
348 template<class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
349 struct DifferentiableGridViewFunction;
350 
364 template<class Range, class Domain, class GridView, template<class> class DerivativeTraits>
365 struct DifferentiableGridViewFunction<Range(Domain), GridView, DerivativeTraits> :
366  Refines<Dune::Functions::Concept::DifferentiableGridFunction<Range(Domain), GridViewEntitySet<GridView,0>, DerivativeTraits>>
367 {
368  template<class F>
369  auto require(F&& f) -> decltype(
370  0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
371  );
372 };
373 
375 template<class F, class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
376 static constexpr bool isDifferentiableGridViewFunction()
377 { return models<Concept::DifferentiableGridViewFunction<Signature, GridView, DerivativeTraits>, F>(); }
378 
379 
380 
381 }}} // namespace Dune::Functions::Concept
382 
383 #endif // DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
Base class template for function classes.
Definition: function.hh:41
Grid view abstract base class.
Definition: gridview.hh:66
Infrastructure for concepts.
constexpr auto models()
Check if concept is modeled by given types.
Definition: concept.hh:184
static constexpr bool isGridFunction()
Check if F models the GridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:269
static constexpr bool isDifferentiableLocalFunction()
Check if F models the DifferentiableLocalFunction concept with given signature and local context.
Definition: functionconcepts.hh:204
static constexpr bool isDifferentiableFunction(F &&f, SignatureTag< Signature, DerivativeTraits >)
Check if f models the DifferentiableFunction concept with given signature.
Definition: functionconcepts.hh:132
static constexpr bool isDifferentiableGridViewFunction()
Check if F models the DifferentiableGridViewFunction concept with given signature.
Definition: functionconcepts.hh:376
static constexpr bool isGridViewFunction()
Check if F models the GridViewFunction concept with given signature.
Definition: functionconcepts.hh:343
static constexpr bool isEntitySet()
Check if F models the GridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:231
static constexpr bool isDifferentiableGridFunction()
Check if F models the DifferentiableGridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:310
static constexpr bool isLocalFunction()
Check if F models the LocalFunction concept with given signature and local context.
Definition: functionconcepts.hh:166
static constexpr bool isFunction(F &&f, SignatureTag< Signature, DerivativeTraits >)
Check if f models the Function concept with given signature.
Definition: functionconcepts.hh:93
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
static constexpr auto isCallable(F &&, Args &&...)
Check if f is callable with given argument list.
Definition: functionconcepts.hh:57
Namespace for concepts.
Definition: concept.hh:34
Dune namespace.
Definition: alignedallocator.hh:13
Base class for refined concepts.
Definition: concept.hh:54
Concept objects that can be called with given argument list.
Definition: functionconcepts.hh:33
Concept for an entity set for a Concept::GridFunction<Range(Domain), EntitySet, DerivativeTraits>
Definition: functionconcepts.hh:220
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
Derivative traits for local functions.
Definition: localderivativetraits.hh:28
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (Apr 27, 22:29, 2024)