DUNE PDELab (2.7)

concepts.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_FUNCTIONSPACEBASES_CONCEPTS_HH
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONCEPTS_HH
5
6
8
9#include <dune/functions/common/utility.hh>
10
11#include <dune/functions/functionspacebases/nodes.hh>
12
13
14namespace Dune {
15namespace Functions {
16namespace Concept {
17
18using namespace Dune::Concept;
19
20
21struct HasResize
22{
23 template<class C>
24 auto require(C&& c) -> decltype(
25 c.resize(0)
26 );
27};
28
29
30
31struct HasSizeMethod
32{
33 template<class C>
34 auto require(C&& c) -> decltype(
35 c.size()
36 );
37};
38
39
40
41struct HasIndexAccess
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
51struct 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
66template<class GridView>
67struct 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
81template<class GridView>
82struct BasisTree;
83
84// Concept for a PowerBasisNode in a local ansatz tree
85template<class GridView>
86struct PowerBasisNode : Refines<BasisNode>
87{
88 template<class N>
89 auto require(const N& node) -> decltype(
90 requireBaseOf<Dune::Functions::PowerBasisNode<typename N::ChildType, N::CHILDREN>, N>(),
91 requireConcept<BasisTree<GridView>, typename N::ChildType>()
92 );
93};
94
95
96// Concept for a CompositeBasisNode in a local ansatz tree
97template<class GridView>
98struct CompositeBasisNode : Refines<BasisNode>
99{
100 template<class N>
101 auto require(const N& node) -> decltype(
102 requireBaseOf<ExpandTuple<Dune::Functions::template CompositeBasisNode, typename N::ChildTypes>, N>(),
103 requireConceptForTupleEntries<BasisTree<GridView>, typename N::ChildTypes>()
104 );
105};
106
107
108// Concept for a full local BasisTree
109template<class GridView>
110struct 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
122template<class PreBasis>
123struct NodeIndexSet
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
142template<class GridView>
143struct 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
171template<class GlobalBasis>
172struct 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
201template<class GridView>
202struct GlobalBasis
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
Infrastructure for concepts.
Namespace for concepts.
Definition: concept.hh:32
Dune namespace.
Definition: alignedallocator.hh:14
Base class for refined concepts.
Definition: concept.hh:52
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)