DUNE PDELab (git)

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
9
10#include <dune/functions/common/utility.hh>
11
12#include <dune/functions/functionspacebases/nodes.hh>
13
14
15namespace Dune {
16namespace Functions {
17namespace Concept {
18
19using namespace Dune::Concept;
20
21
22struct HasResize
23{
24 template<class C>
25 auto require(C&& c) -> decltype(
26 c.resize(0)
27 );
28};
29
30
31
32struct HasSizeMethod
33{
34 template<class C>
35 auto require(C&& c) -> decltype(
36 c.size()
37 );
38};
39
40
41
42struct HasIndexAccess
43{
44 template<class C, class I>
45 auto require(C&& c, I&& i) -> decltype(
46 c[i]
47 );
48};
49
50
51// Concept for a BasisNode in a local ansatz tree
52struct BasisNode
53{
54 template<class N>
55 auto require(const N& node) -> decltype(
56 requireType<typename N::size_type>(),
57 requireConvertible<typename N::size_type>(node.size()),
58 requireConvertible<typename N::size_type>(node.localIndex(std::declval<typename N::size_type>())),
59 requireConvertible<typename N::size_type>(node.treeIndex()),
60 requireBaseOf<BasisNodeMixin, N>()
61 );
62};
63
64
65
66// Concept for a LeafBasisNode in a local ansatz tree
67template<class GridView>
68struct LeafBasisNode : Refines<BasisNode>
69{
70 template<class N>
71 auto require(const N& node) -> decltype(
72 requireType<typename N::Element>(),
73 requireType<typename N::FiniteElement>(),
74 requireConvertible<typename N::Element>(node.element()),
75 requireConvertible<const typename N::FiniteElement&>(node.finiteElement()),
76 requireSameType<typename N::Element, typename GridView::template Codim<0>::Entity>(),
77 requireBaseOf<Dune::Functions::LeafBasisNode, N>()
78 );
79};
80
81
82template<class GridView>
83struct BasisTree;
84
85// Concept for a PowerBasisNode in a local ansatz tree
86template<class GridView>
87struct PowerBasisNode : Refines<BasisNode>
88{
89 template<class N>
90 auto require(const N& node) -> decltype(
91 requireBaseOf<Dune::Functions::PowerBasisNode<typename N::ChildType, N::degree()>, N>(),
92 requireConcept<BasisTree<GridView>, typename N::ChildType>()
93 );
94};
95
96// Concept for a DynamicPowerBasisNode in a local ansatz tree
97template<class GridView>
98struct DynamicPowerBasisNode : Refines<BasisNode>
99{
100 template<class N>
101 auto require(const N& node) -> decltype(
102 requireBaseOf<Dune::Functions::DynamicPowerBasisNode<typename N::ChildType>, N>(),
103 requireConcept<BasisTree<GridView>, typename N::ChildType>()
104 );
105};
106
107// Concept for a CompositeBasisNode in a local ansatz tree
108template<class GridView>
109struct CompositeBasisNode : Refines<BasisNode>
110{
111 template<class N>
112 auto require(const N& node) -> decltype(
113 requireBaseOf<ExpandTuple<Dune::Functions::template CompositeBasisNode, typename N::ChildTypes>, N>(),
114 requireConceptForTupleEntries<BasisTree<GridView>, typename N::ChildTypes>()
115 );
116};
117
118
119// Concept for a full local BasisTree
120template<class GridView>
121struct BasisTree : Refines<BasisNode>
122{
123 template<class N, class NodeTag = typename N::NodeTag>
124 auto require(const N& node) -> decltype(
125 requireConcept<std::conditional_t<N::isLeaf, LeafBasisNode<GridView>, BasisNode>, N>(),
126 requireConcept<std::conditional_t<std::is_same_v<NodeTag, Dune::TypeTree::PowerNodeTag>,
127 PowerBasisNode<GridView>, BasisNode>, N>(),
128 requireConcept<std::conditional_t<std::is_same_v<NodeTag, Dune::TypeTree::DynamicPowerNodeTag>,
129 DynamicPowerBasisNode<GridView>, BasisNode>, N>(),
130 requireConcept<std::conditional_t<N::isComposite, CompositeBasisNode<GridView>, BasisNode>, N>()
131 );
132};
133
134
135// Concept for a PreBasis
136template<class GridView>
137struct PreBasis
138{
139private:
140 template<class PB>
142
143public:
144 template<class PB>
145 auto require(const PB& preBasis) -> decltype(
146 requireType<typename PB::GridView>(),
147 requireType<typename PB::size_type>(),
148 requireType<typename PB::Node>(),
149 requireConvertible<decltype(PB::maxMultiIndexSize), typename PB::size_type>(),
150 requireConvertible<decltype(PB::maxMultiIndexSize), typename PB::size_type>(),
151 requireConvertible<decltype(PB::multiIndexBufferSize), typename PB::size_type>(),
152 requireTrue<PB::minMultiIndexSize <= PB::maxMultiIndexSize>(),
153 requireTrue<PB::maxMultiIndexSize <= PB::multiIndexBufferSize>(),
154 requireSameType<typename PB::GridView, GridView>(),
155 const_cast<PB&>(preBasis).initializeIndices(),
156 requireConvertible<typename PB::GridView>(preBasis.gridView()),
157 requireConvertible<typename PB::Node>(preBasis.makeNode()),
158 requireConvertible<typename PB::size_type>(preBasis.size()),
159 requireConvertible<typename PB::size_type>(preBasis.size(std::declval<MultiIndex<PB>>())),
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 requireConvertible<typename std::vector<MultiIndex<PB>>::iterator>(
165 preBasis.indices(
166 preBasis.makeNode(),
167 std::declval<typename std::vector<MultiIndex<PB>>::iterator>()))
168 );
169};
170
171
172
173// Concept for a LocalView
174template<class GlobalBasis>
175struct LocalView
176{
177 template<class V>
178 auto require(const V& localView) -> decltype(
179 requireType<typename V::size_type>(),
180 requireType<typename V::MultiIndex>(),
181 requireType<typename V::GlobalBasis>(),
182 requireType<typename V::Tree>(),
183 requireType<typename V::GridView>(),
184 requireType<typename V::Element>(),
185 requireSameType<typename V::GlobalBasis, GlobalBasis>(),
186 requireSameType<typename V::GridView, typename GlobalBasis::GridView>(),
187 requireSameType<typename V::size_type, typename GlobalBasis::size_type>(),
188 requireSameType<typename V::Element, typename GlobalBasis::GridView::template Codim<0>::Entity>(),
189 const_cast<V&>(localView).bind(std::declval<typename V::Element>()),
190 const_cast<V&>(localView).unbind(),
191 requireConvertible<bool>(localView.bound()),
192 requireConvertible<typename V::Tree>(localView.tree()),
193 requireConvertible<typename V::size_type>(localView.size()),
194 requireConvertible<typename V::MultiIndex>(localView.index(std::declval<typename V::size_type>())),
195 requireConvertible<typename V::size_type>(localView.maxSize()),
196 requireConvertible<typename V::GlobalBasis>(localView.globalBasis()),
197 requireConcept<BasisTree<typename V::GridView>>(localView.tree()),
198 0
199 );
200};
201
202
203
204// Concept for a GlobalBasis
205template<class GridView>
206struct GlobalBasis
207{
208 template<class B>
209 auto require(const B& basis) -> decltype(
210 requireType<typename B::GridView>(),
211 requireType<typename B::size_type>(),
212 requireType<typename B::MultiIndex>(),
213 requireType<typename B::SizePrefix>(),
214 requireType<typename B::LocalView>(),
215 requireSameType<typename B::GridView, GridView>(),
216 requireConvertible<typename B::GridView>(basis.gridView()),
217 requireConvertible<typename B::LocalView>(basis.localView()),
218 requireConvertible<typename B::size_type>(basis.size()),
219 requireConvertible<typename B::size_type>(basis.size(std::declval<typename B::SizePrefix>())),
220 requireConvertible<typename B::size_type>(basis.dimension()),
221 requireSameType<decltype(const_cast<B&>(basis).update(basis.gridView())),void>(),
222 requireConcept<LocalView<B>>(basis.localView())
223 );
224};
225
226
227
228} // namespace Dune::Functions::Concept
229} // namespace Dune::Functions
230} // namespace Dune
231
232
233#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONCEPTS_HH
A Vector class with statically reserved memory.
Definition: reservedvector.hh:47
Infrastructure for concepts.
std::size_t degree(const Node &node)
Returns the degree of node as run time information.
Definition: nodeinterface.hh:79
Namespace for concepts.
Definition: concept.hh:34
Dune namespace.
Definition: alignedallocator.hh:13
An stl-compliant random-access container which stores everything on the stack.
Base class for refined concepts.
Definition: concept.hh:54
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)