dune-functions  2.7.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 
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&& f, Args&&... 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>
94 { return models<Concept::Function<Signature>, F>(); }
95 
96 
97 
98 // DifferentiableFunction concept ##############################################
99 template<class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
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 {
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>
133 { return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
134 
135 
136 
137 // LocalFunction concept ##############################################
138 template<class Signature, class LocalContext>
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  f.localContext(),
159  requireConvertible<LocalContext>(f.localContext())
160  );
161 };
162 
164 template<class F, class Signature, class LocalContext>
165 static constexpr bool isLocalFunction()
166 { return models<Concept::LocalFunction<Signature, LocalContext>, F>(); }
167 
168 
169 // DifferentiableLocalFunction concept ##############################################
170 template<class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
172 
185 template<class Range, class Domain, class LocalContext, template<class> class DerivativeTraits>
186 struct DifferentiableLocalFunction<Range(Domain), LocalContext, DerivativeTraits> :
187  Refines<
188  Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
189  Dune::Functions::Concept::LocalFunction<Range(Domain),LocalContext>
190  >
191 {
192  template<class F>
193  auto require(F&& f) -> decltype(
194  f.bind(std::declval<LocalContext>()),
195  f.unbind(),
196  f.localContext(),
197  requireConvertible<LocalContext>(f.localContext())
198  );
199 };
200 
202 template<class F, class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
203 static constexpr bool isDifferentiableLocalFunction()
204 { return models<Concept::DifferentiableLocalFunction<Signature, LocalContext, DerivativeTraits>, F>(); }
205 
206 
207 // EntitySet concept ##############################################
208 
218 struct EntitySet
219 {
220  template<class E>
221  auto require(E&& f) -> decltype(
222  requireType<typename E::Element>(),
223  requireType<typename E::LocalCoordinate>(),
224  requireType<typename E::GlobalCoordinate>()
225  );
226 };
227 
229 template<class E>
230 static constexpr bool isEntitySet()
231 { return models<Concept::EntitySet, E>(); }
232 
233 
234 
235 // GridFunction concept ##############################################
236 template<class Signature, class EntitySet>
238 
248 template<class Range, class Domain, class EntitySet>
249 struct GridFunction<Range(Domain), EntitySet> :
250  Refines<Dune::Functions::Concept::Function<Range(Domain)> >
251 {
252  using LocalSignature = Range(typename EntitySet::LocalCoordinate);
253  using LocalContext = typename EntitySet::Element;
254 
255  template<class F>
256  auto require(F&& f) -> decltype(
257  localFunction(f),
258  f.entitySet(),
260  requireConcept<Concept::EntitySet, EntitySet>(),
261  requireConvertible<EntitySet>(f.entitySet()),
262  requireConvertible<typename EntitySet::GlobalCoordinate, Domain>()
263  );
264 };
265 
267 template<class F, class Signature, class EntitySet>
268 static constexpr bool isGridFunction()
269 { return models<Concept::GridFunction<Signature, EntitySet>, F>(); }
270 
271 
272 // DifferentiableGridFunction concept ##############################################
273 template<class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
275 
288 template<class Range, class Domain, class EntitySet, template<class> class DerivativeTraits>
289 struct DifferentiableGridFunction<Range(Domain), EntitySet, DerivativeTraits> :
290  Refines<
291  Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
292  Dune::Functions::Concept::GridFunction<Range(Domain),EntitySet>
293  >
294 {
295  using LocalSignature = Range(typename EntitySet::LocalCoordinate);
296  using LocalContext = typename EntitySet::Element;
297 
298  template<class R>
300 
301  template<class F>
302  auto require(F&& f) -> decltype(
304  );
305 };
306 
308 template<class F, class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
309 static constexpr bool isDifferentiableGridFunction()
310 { return models<Concept::DifferentiableGridFunction<Signature, EntitySet, DerivativeTraits>, F>(); }
311 
312 
313 
314 // GridViewFunction concept ##############################################
315 template<class Signature, class GridView>
317 
330 template<class Range, class Domain, class GridView>
331 struct GridViewFunction<Range(Domain), GridView> :
332  Refines<Dune::Functions::Concept::GridFunction<Range(Domain), GridViewEntitySet<GridView,0>>>
333 {
334  template<class F>
335  auto require(F&& f) -> decltype(
336  0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
337  );
338 };
339 
341 template<class F, class Signature, class GridView>
342 static constexpr bool isGridViewFunction()
343 { return models<Concept::GridViewFunction<Signature, GridView>, F>(); }
344 
345 
346 // DifferentiableGridViewFunction concept ##############################################
347 template<class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
349 
363 template<class Range, class Domain, class GridView, template<class> class DerivativeTraits>
364 struct DifferentiableGridViewFunction<Range(Domain), GridView, DerivativeTraits> :
365  Refines<Dune::Functions::Concept::DifferentiableGridFunction<Range(Domain), GridViewEntitySet<GridView,0>, DerivativeTraits>>
366 {
367  template<class F>
368  auto require(F&& f) -> decltype(
369  0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
370  );
371 };
372 
374 template<class F, class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
375 static constexpr bool isDifferentiableGridViewFunction()
376 { return models<Concept::DifferentiableGridViewFunction<Signature, GridView, DerivativeTraits>, F>(); }
377 
378 
379 
380 }}} // namespace Dune::Functions::Concept
381 
382 #endif // DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
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()))
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
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:28