dune-pdelab 2.7-git
Loading...
Searching...
No Matches
ordering/utility.hh
Go to the documentation of this file.
1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=8 sw=2 sts=2:
3
4#ifndef DUNE_PDELAB_ORDERING_UTILITY_HH
5#define DUNE_PDELAB_ORDERING_UTILITY_HH
6
7#include <vector>
8#include <bitset>
9
13
14namespace Dune {
15 namespace PDELab {
16
19
21 struct MergeMode
22 {
23
28
29 };
30
31#ifndef DOXYGEN
32
33 namespace ordering {
34
35 // This is an implementation detail of the composite orderings, no need to confuse our users!
36 struct update_direct_children
37 : public TypeTree::DirectChildrenVisitor
38 , public TypeTree::DynamicTraversal
39 {
40
41 template<typename GFS, typename Child, typename TreePath, typename ChildIndex>
42 void afterChild(const GFS& gfs, Child& child, TreePath tp, ChildIndex childIndex) const
43 {
44 child.update();
45 }
46
47 };
48
49 } // end namespace ordering
50
51#endif // DOXYGEN
52
53
55 {
56
57 template<typename DOFIndex, typename SizeType, typename IndexType>
58 static typename std::enable_if<
59 std::is_integral<IndexType>::value
60 >::type
61 store(DOFIndex& dof_index, const GeometryType& gt, SizeType entity_index, IndexType tree_index)
62 {
63 dof_index.clear();
64 dof_index.entityIndex()[0] = GlobalGeometryTypeIndex::index(gt);
65 dof_index.entityIndex()[1] = entity_index;
66 dof_index.treeIndex().push_back(tree_index);
67 }
68
69 template<typename DOFIndex, typename SizeType, typename IndexType>
70 static typename std::enable_if<
71 !std::is_integral<IndexType>::value
72 >::type
73 store(DOFIndex& dof_index, const GeometryType& gt, SizeType entity_index, IndexType tree_index)
74 {
75 dof_index.entityIndex()[0] = GlobalGeometryTypeIndex::index(gt);
76 dof_index.entityIndex()[1] = entity_index;
77 dof_index.treeIndex() = tree_index;
78 }
79
80 template<typename DOFIndex, typename SizeType, typename IndexType>
81 static typename std::enable_if<
82 std::is_integral<IndexType>::value
83 >::type
84 store(DOFIndex& dof_index, SizeType gt_index, SizeType entity_index, IndexType tree_index)
85 {
86 dof_index.clear();
87 dof_index.entityIndex()[0] = gt_index;
88 dof_index.entityIndex()[1] = entity_index;
89 dof_index.treeIndex().push_back(tree_index);
90 }
91
92 template<typename DOFIndex, typename SizeType, typename IndexType>
93 static typename std::enable_if<
94 !std::is_integral<IndexType>::value
95 >::type
96 store(DOFIndex& dof_index, SizeType gt_index, SizeType entity_index, IndexType tree_index)
97 {
98 dof_index.entityIndex()[0] = gt_index;
99 dof_index.entityIndex()[1] = entity_index;
100 dof_index.treeIndex() = tree_index;
101 }
102
103
105 {
106
107 template<typename Index>
108 static std::size_t geometryType(const Index& geometry_index)
109 {
110 return geometry_index[0];
111 }
112
113 template<typename Index>
114 static std::size_t entityIndex(const Index& geometry_index)
115 {
116 return geometry_index[1];
117 }
118
119 template<typename Index, typename SizeType>
120 static void store(Index& index, const GeometryType& gt, SizeType entity_index)
121 {
122 index[0] = GlobalGeometryTypeIndex::index(gt);
123 index[1] = entity_index;
124 }
125
126 };
127
128 template<typename DOFIndex>
129 static std::size_t geometryType(const DOFIndex& dof_index)
130 {
131 return GeometryIndex::geometryType(dof_index.entityIndex());
132 }
133
134 template<typename DOFIndex>
135 static std::size_t entityIndex(const DOFIndex& dof_index)
136 {
137 return GeometryIndex::entityIndex(dof_index.entityIndex());
138 }
139
140 };
141
143 {
144
145 template<typename DOFIndex, typename SizeType>
146 static void store(DOFIndex& dof_index, const GeometryType& gt, SizeType entity_index, SizeType tree_index)
147 {
148 dof_index = entity_index;
149 }
150
151 };
152
153
154 template<typename DI, typename CI>
156 {
157
158 typedef DI DOFIndex;
159
160 typedef CI ContainerIndex;
161
162 typedef std::size_t SizeType;
163
165
166 };
167
168
169 template<typename SizeType_, typename CI>
171 {
172
174
175 typedef CI ContainerIndex;
176
177 typedef SizeType_ SizeType;
178
180
181 };
182
183
184
185 template<typename DI, typename CI>
187 : public SimpleOrderingTraits<DI,CI>
188 {
189
190 // The maximum dimension supported (length of bitsets)
191 // 32 dimensions should probably be fine for now... ;-)
192 static const std::size_t max_dim = 32;
193
194 typedef std::bitset<max_dim> CodimFlag;
195
196 typedef typename DI::TreeIndex TreeIndex;
197
198 typedef typename DI::View DOFIndexView;
199 typedef typename DI::View::TreeIndex TreeIndexView;
200
201 typedef typename DI::size_type SizeType;
202 typedef typename DI::size_type size_type;
203
204 };
205
206
207 template<typename ES, typename DI, typename CI>
209 : public OrderingTraits<DI,
210 CI
211 >
212 {
213
214 using EntitySet = ES;
215 using GridView = typename ES::GridView;
216
217 };
218
219 template<typename ES, typename DI, typename CI>
221 : public LocalOrderingTraits<ES,DI,CI>
222 {
223
224 typedef typename DI::EntityIndex EntityIndex;
225 typedef typename DI::View::EntityIndex EntityIndexView;
226
227 };
228
229
230 template<typename DI, typename CI>
232 {
233 public:
234
236
238 virtual ~VirtualOrderingBase() = default;
239
240 virtual void map_index_dynamic(typename Traits::DOFIndexView di, typename Traits::ContainerIndex& ci) const = 0;
241 };
242
243
244 template<typename child_type>
246 : public TypeTree::DirectChildrenVisitor
247 , public TypeTree::DynamicTraversal
248 {
249
250 template<typename Node, typename Child, typename TreePath, typename ChildIndex>
251 void afterChild(const Node& node, Child& child, TreePath tp, ChildIndex child_index)
252 {
253 extract_child(node,child,child_index);
254 }
255
256 template<typename Node, typename Child, typename ChildIndex>
257 typename std::enable_if<Node::has_dynamic_ordering_children>::type
258 extract_child(const Node& node, Child& child, ChildIndex child_index)
259 {
260 _children[child_index] = &child;
261 }
262
263 template<typename Node, typename Child, typename ChildIndex>
264 typename std::enable_if<!Node::has_dynamic_ordering_children>::type
265 extract_child(const Node& node, Child& child, ChildIndex child_index)
266 {
267 }
268
269 extract_child_bases(std::vector<child_type*>& children)
270 : _children(children)
271 {}
272
273 private:
274 std::vector<child_type*>& _children;
275
276 };
277
278
280
290 {
291
292 typedef std::size_t size_type;
293
295 {
296 return *this;
297 }
298
300 {
301 return *this;
302 }
303
305 {
306 return *this;
307 }
308
310 {
311 return this;
312 }
313
315 {
316 return *this;
317 }
318
320 {
321 return true;
322 }
323
325 {
326 return !operator==(r);
327 }
328
330 {}
331
332 };
333
335 } // namespace PDELab
336} // namespace Dune
337
338#endif // DUNE_PDELAB_ORDERING_UTILITY_HH
Define and register ordering related transformations. This header defines the two transformations gfs...
std::size_t index
Definition interpolate.hh:97
For backward compatibility – Do not use this!
Definition adaptivity.hh:28
A multi-index representing a degree of freedom in a GridFunctionSpace.
Definition dofindex.hh:148
EntityIndex & entityIndex()
Returns the index of the grid entity associated with the DOF.
Definition dofindex.hh:258
void clear()
Definition dofindex.hh:251
TreeIndex & treeIndex()
Returns the tuple of entity-local indices associated with the DOF.
Definition dofindex.hh:270
Definition simpledofindex.hh:16
Index merging algorithm for global orderings.
Definition ordering/utility.hh:22
type
Definition ordering/utility.hh:24
@ interleaved
Indices are interleaved according to a user-supplied pattern ([i1,i2],[j1,j2] -> [i1,...
Definition ordering/utility.hh:26
@ lexicographic
Lexicographically ordered ([i1,i2],[j1,j2] -> [i1,i2,j1,j2]).
Definition ordering/utility.hh:25
Definition ordering/utility.hh:55
static std::enable_if< std::is_integral< IndexType >::value >::type store(DOFIndex &dof_index, SizeType gt_index, SizeType entity_index, IndexType tree_index)
Definition ordering/utility.hh:84
static std::size_t entityIndex(const DOFIndex &dof_index)
Definition ordering/utility.hh:135
static std::enable_if<!std::is_integral< IndexType >::value >::type store(DOFIndex &dof_index, const GeometryType &gt, SizeType entity_index, IndexType tree_index)
Definition ordering/utility.hh:73
static std::enable_if< std::is_integral< IndexType >::value >::type store(DOFIndex &dof_index, const GeometryType &gt, SizeType entity_index, IndexType tree_index)
Definition ordering/utility.hh:61
static std::enable_if<!std::is_integral< IndexType >::value >::type store(DOFIndex &dof_index, SizeType gt_index, SizeType entity_index, IndexType tree_index)
Definition ordering/utility.hh:96
static std::size_t geometryType(const DOFIndex &dof_index)
Definition ordering/utility.hh:129
static std::size_t entityIndex(const Index &geometry_index)
Definition ordering/utility.hh:114
static void store(Index &index, const GeometryType &gt, SizeType entity_index)
Definition ordering/utility.hh:120
static std::size_t geometryType(const Index &geometry_index)
Definition ordering/utility.hh:108
Definition ordering/utility.hh:143
static void store(DOFIndex &dof_index, const GeometryType &gt, SizeType entity_index, SizeType tree_index)
Definition ordering/utility.hh:146
Definition ordering/utility.hh:156
CI ContainerIndex
Definition ordering/utility.hh:160
DefaultDOFIndexAccessor DOFIndexAccessor
Definition ordering/utility.hh:164
DI DOFIndex
Definition ordering/utility.hh:158
std::size_t SizeType
Definition ordering/utility.hh:162
SimpleDOFIndex< SizeType_ > DOFIndex
Definition ordering/utility.hh:173
SimpleDOFIndexAccessor DOFIndexAccessor
Definition ordering/utility.hh:179
Definition ordering/utility.hh:188
static const std::size_t max_dim
Definition ordering/utility.hh:192
DI::View::TreeIndex TreeIndexView
Definition ordering/utility.hh:199
DI::size_type SizeType
Definition ordering/utility.hh:201
std::bitset< max_dim > CodimFlag
Definition ordering/utility.hh:194
DI::TreeIndex TreeIndex
Definition ordering/utility.hh:196
DI::View DOFIndexView
Definition ordering/utility.hh:198
DI::size_type size_type
Definition ordering/utility.hh:202
Definition ordering/utility.hh:212
ES EntitySet
Definition ordering/utility.hh:214
typename ES::GridView GridView
Definition ordering/utility.hh:215
Definition ordering/utility.hh:222
DI::EntityIndex EntityIndex
Definition ordering/utility.hh:224
DI::View::EntityIndex EntityIndexView
Definition ordering/utility.hh:225
Definition ordering/utility.hh:232
virtual void map_index_dynamic(typename Traits::DOFIndexView di, typename Traits::ContainerIndex &ci) const =0
virtual ~VirtualOrderingBase()=default
OrderingTraits< DI, CI > Traits
Definition ordering/utility.hh:235
VirtualOrderingBase()
Definition ordering/utility.hh:237
Definition ordering/utility.hh:248
extract_child_bases(std::vector< child_type * > &children)
Definition ordering/utility.hh:269
std::enable_if<!Node::has_dynamic_ordering_children >::type extract_child(const Node &node, Child &child, ChildIndex child_index)
Definition ordering/utility.hh:265
void afterChild(const Node &node, Child &child, TreePath tp, ChildIndex child_index)
Definition ordering/utility.hh:251
std::enable_if< Node::has_dynamic_ordering_children >::type extract_child(const Node &node, Child &child, ChildIndex child_index)
Definition ordering/utility.hh:258
Dummy iterator type over DOF indices.
Definition ordering/utility.hh:290
DummyDOFIndexIterator & operator++()
Definition ordering/utility.hh:294
void push_back(size_type i)
Definition ordering/utility.hh:329
DummyDOFIndexIterator & treeIndex()
Definition ordering/utility.hh:314
DummyDOFIndexIterator & operator*()
Definition ordering/utility.hh:304
bool operator==(const DummyDOFIndexIterator &r) const
Definition ordering/utility.hh:319
std::size_t size_type
Definition ordering/utility.hh:292
DummyDOFIndexIterator & operator+=(size_type i)
Definition ordering/utility.hh:299
bool operator!=(const DummyDOFIndexIterator &r) const
Definition ordering/utility.hh:324
DummyDOFIndexIterator * operator->()
Definition ordering/utility.hh:309