dune-functions  2.7.0
functionspacebases/concepts.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_FUNCTIONSPACEBASES_CONCEPTS_HH
4 #define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONCEPTS_HH
5 
6 
7 #include <dune/common/concept.hh>
8 
10 
12 
13 
14 namespace Dune {
15 namespace Functions {
16 namespace Concept {
17 
18 using namespace Dune::Concept;
19 
20 
21 struct HasResize
22 {
23  template<class C>
24  auto require(C&& c) -> decltype(
25  c.resize(0)
26  );
27 };
28 
29 
30 
32 {
33  template<class C>
34  auto require(C&& c) -> decltype(
35  c.size()
36  );
37 };
38 
39 
40 
42 {
43  template<class C, class I>
44  auto require(C&& c, I&& i) -> decltype(
45  c[i]
46  );
47 };
48 
49 
50 // Concept for a BasisNode in a local ansatz tree
51 struct BasisNode
52 {
53  template<class N>
54  auto require(const N& node) -> decltype(
55  requireType<typename N::size_type>(),
56  requireConvertible<typename N::size_type>(node.size()),
57  requireConvertible<typename N::size_type>(node.localIndex(std::declval<typename N::size_type>())),
58  requireConvertible<typename N::size_type>(node.treeIndex()),
59  requireBaseOf<BasisNodeMixin, N>()
60  );
61 };
62 
63 
64 
65 // Concept for a LeafBasisNode in a local ansatz tree
66 template<class GridView>
67 struct LeafBasisNode : Refines<BasisNode>
68 {
69  template<class N>
70  auto require(const N& node) -> decltype(
71  requireType<typename N::Element>(),
72  requireType<typename N::FiniteElement>(),
73  requireConvertible<typename N::Element>(node.element()),
74  requireConvertible<const typename N::FiniteElement&>(node.finiteElement()),
75  requireSameType<typename N::Element, typename GridView::template Codim<0>::Entity>(),
76  requireBaseOf<Dune::Functions::LeafBasisNode, N>()
77  );
78 };
79 
80 
81 template<class GridView>
82 struct BasisTree;
83 
84 // Concept for a PowerBasisNode in a local ansatz tree
85 template<class GridView>
86 struct PowerBasisNode : Refines<BasisNode>
87 {
88  template<class N>
89  auto require(const N& node) -> decltype(
91  requireConcept<BasisTree<GridView>, typename N::ChildType>()
92  );
93 };
94 
95 
96 // Concept for a CompositeBasisNode in a local ansatz tree
97 template<class GridView>
98 struct CompositeBasisNode : Refines<BasisNode>
99 {
100  template<class N>
101  auto require(const N& node) -> decltype(
103  requireConceptForTupleEntries<BasisTree<GridView>, typename N::ChildTypes>()
104  );
105 };
106 
107 
108 // Concept for a full local BasisTree
109 template<class GridView>
110 struct BasisTree : Refines<BasisNode>
111 {
112  template<class N>
113  auto require(const N& node) -> decltype(
114  requireConcept<typename std::conditional< N::isLeaf, LeafBasisNode<GridView>, BasisNode>::type, N>(),
115  requireConcept<typename std::conditional< N::isPower, PowerBasisNode<GridView>, BasisNode>::type, N>(),
116  requireConcept<typename std::conditional< N::isComposite, CompositeBasisNode<GridView>, BasisNode>::type, N>()
117  );
118 };
119 
120 
121 // Concept for a NodeIndexSet
122 template<class PreBasis>
124 {
125  template<class I>
126  auto require(const I& indexSet) -> decltype(
127  requireType<typename I::size_type>(),
128  requireType<typename I::MultiIndex>(),
129  requireType<typename I::PreBasis>(),
130  requireType<typename I::Node>(),
131  requireSameType<typename I::PreBasis, PreBasis>(),
132  const_cast<I&>(indexSet).bind(std::declval<typename I::Node>()),
133  const_cast<I&>(indexSet).unbind(),
134  requireConvertible<typename I::size_type>(indexSet.size()),
135  requireConvertible<typename std::vector<typename I::MultiIndex>::iterator>(
136  indexSet.indices(std::declval<typename std::vector<typename I::MultiIndex>::iterator>()))
137  );
138 };
139 
140 
141 // Concept for a PreBasis
142 template<class GridView>
143 struct PreBasis
144 {
145  template<class PB>
146  auto require(const PB& preBasis) -> decltype(
147  requireType<typename PB::GridView>(),
148  requireType<typename PB::size_type>(),
149  requireType<typename PB::MultiIndex>(),
150  requireType<typename PB::SizePrefix>(),
151  requireType<typename PB::Node>(),
152  requireType<typename PB::IndexSet>(),
153  requireSameType<typename PB::GridView, GridView>(),
154  const_cast<PB&>(preBasis).initializeIndices(),
155  requireConvertible<typename PB::GridView>(preBasis.gridView()),
156  requireConvertible<typename PB::Node>(preBasis.makeNode()),
157  requireConvertible<typename PB::IndexSet>(preBasis.makeIndexSet()),
158  requireConvertible<typename PB::size_type>(preBasis.size()),
159  requireConvertible<typename PB::size_type>(preBasis.size(std::declval<typename PB::SizePrefix>())),
160  requireConvertible<typename PB::size_type>(preBasis.dimension()),
161  requireConvertible<typename PB::size_type>(preBasis.maxNodeSize()),
162  requireSameType<decltype(const_cast<PB&>(preBasis).update(preBasis.gridView())),void>(),
163  requireConcept<BasisTree<typename PB::GridView>>(preBasis.makeNode()),
164  requireConcept<NodeIndexSet<PB>>(preBasis.makeIndexSet())
165  );
166 };
167 
168 
169 
170 // Concept for a LocalView
171 template<class GlobalBasis>
172 struct LocalView
173 {
174  template<class V>
175  auto require(const V& localView) -> decltype(
176  requireType<typename V::size_type>(),
177  requireType<typename V::MultiIndex>(),
178  requireType<typename V::GlobalBasis>(),
179  requireType<typename V::Tree>(),
180  requireType<typename V::GridView>(),
181  requireType<typename V::Element>(),
182  requireSameType<typename V::GlobalBasis, GlobalBasis>(),
183  requireSameType<typename V::GridView, typename GlobalBasis::GridView>(),
184  requireSameType<typename V::size_type, typename GlobalBasis::size_type>(),
185  requireSameType<typename V::Element, typename GlobalBasis::GridView::template Codim<0>::Entity>(),
186  const_cast<V&>(localView).bind(std::declval<typename V::Element>()),
187  const_cast<V&>(localView).unbind(),
188  requireConvertible<typename V::Tree>(localView.tree()),
189  requireConvertible<typename V::size_type>(localView.size()),
190  requireConvertible<typename V::MultiIndex>(localView.index(std::declval<typename V::size_type>())),
191  requireConvertible<typename V::size_type>(localView.maxSize()),
192  requireConvertible<typename V::GlobalBasis>(localView.globalBasis()),
193  requireConcept<BasisTree<typename V::GridView>>(localView.tree()),
194  0
195  );
196 };
197 
198 
199 
200 // Concept for a GlobalBasis
201 template<class GridView>
203 {
204  template<class B>
205  auto require(const B& basis) -> decltype(
206  requireType<typename B::GridView>(),
207  requireType<typename B::size_type>(),
208  requireType<typename B::MultiIndex>(),
209  requireType<typename B::SizePrefix>(),
210  requireType<typename B::LocalView>(),
211  requireSameType<typename B::GridView, GridView>(),
212  requireConvertible<typename B::GridView>(basis.gridView()),
213  requireConvertible<typename B::LocalView>(basis.localView()),
214  requireConvertible<typename B::size_type>(basis.size()),
215  requireConvertible<typename B::size_type>(basis.size(std::declval<typename B::SizePrefix>())),
216  requireConvertible<typename B::size_type>(basis.dimension()),
217  requireSameType<decltype(const_cast<B&>(basis).update(basis.gridView())),void>(),
218  requireConcept<LocalView<B>>(basis.localView())
219  );
220 };
221 
222 
223 
224 } // namespace Dune::Functions::Concept
225 } // namespace Dune::Functions
226 } // namespace Dune
227 
228 
229 #endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONCEPTS_HH
Dune::Functions::ExpandTuple
typename Imp::ExpandTupleHelper< T, ArgTuple >::Type ExpandTuple
Expand tuple arguments as template arguments.
Definition: utility.hh:94
Dune::Functions::Concept::HasSizeMethod
Definition: functionspacebases/concepts.hh:31
Dune::Functions::Concept::LocalView
Definition: functionspacebases/concepts.hh:172
Dune::Functions::PowerBasisNode
Definition: nodes.hh:186
Dune::Functions::Concept::NodeIndexSet
Definition: functionspacebases/concepts.hh:123
Dune::Functions::Concept::BasisTree
Definition: functionspacebases/concepts.hh:82
Dune::Functions::Concept::BasisNode
Definition: functionspacebases/concepts.hh:51
Dune::Functions::Concept::CompositeBasisNode
Definition: functionspacebases/concepts.hh:98
Dune::Functions::Concept::GlobalBasis
Definition: functionspacebases/concepts.hh:202
nodes.hh
Dune::Functions::Concept::HasResize
Definition: functionspacebases/concepts.hh:21
Dune
Definition: polynomial.hh:10
Dune::Functions::Concept::PreBasis
Definition: functionspacebases/concepts.hh:143
Dune::Functions::Concept::PowerBasisNode
Definition: functionspacebases/concepts.hh:86
Dune::Functions::Concept::LeafBasisNode
Definition: functionspacebases/concepts.hh:67
utility.hh
Dune::Functions::Concept::HasIndexAccess
Definition: functionspacebases/concepts.hh:41