dune-pdelab  2.5-dev
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 
14 namespace Dune {
15  namespace PDELab {
16 
19 
21  struct MergeMode
22  {
23 
24  enum type {
27  };
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<
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<
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<
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<
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>
170  struct SimpleOrderingTraits<SimpleDOFIndex<SizeType_>,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 
239  virtual void map_index_dynamic(typename Traits::DOFIndexView di, typename Traits::ContainerIndex& ci) const = 0;
240  };
241 
242 
243  template<typename child_type>
245  : public TypeTree::DirectChildrenVisitor
246  , public TypeTree::DynamicTraversal
247  {
248 
249  template<typename Node, typename Child, typename TreePath, typename ChildIndex>
250  void afterChild(const Node& node, Child& child, TreePath tp, ChildIndex child_index)
251  {
252  extract_child(node,child,child_index);
253  }
254 
255  template<typename Node, typename Child, typename ChildIndex>
256  typename std::enable_if<Node::has_dynamic_ordering_children>::type
257  extract_child(const Node& node, Child& child, ChildIndex child_index)
258  {
259  _children[child_index] = &child;
260  }
261 
262  template<typename Node, typename Child, typename ChildIndex>
263  typename std::enable_if<!Node::has_dynamic_ordering_children>::type
264  extract_child(const Node& node, Child& child, ChildIndex child_index)
265  {
266  }
267 
268  extract_child_bases(std::vector<child_type*>& children)
269  : _children(children)
270  {}
271 
272  private:
273  std::vector<child_type*>& _children;
274 
275  };
276 
277 
279 
289  {
290 
291  typedef std::size_t size_type;
292 
294  {
295  return *this;
296  }
297 
299  {
300  return *this;
301  }
302 
304  {
305  return *this;
306  }
307 
309  {
310  return this;
311  }
312 
314  {
315  return *this;
316  }
317 
318  bool operator==(const DummyDOFIndexIterator& r) const
319  {
320  return true;
321  }
322 
323  bool operator!=(const DummyDOFIndexIterator& r) const
324  {
325  return !operator==(r);
326  }
327 
328  void push_back(size_type i)
329  {}
330 
331  };
332 
334  } // namespace PDELab
335 } // namespace Dune
336 
337 #endif // DUNE_PDELAB_ORDERING_UTILITY_HH
Definition: ordering/utility.hh:104
bool operator==(const DummyDOFIndexIterator &r) const
Definition: ordering/utility.hh:318
DI DOFIndex
Definition: ordering/utility.hh:158
Define and register ordering related transformations. This header defines the two transformations gfs...
std::bitset< max_dim > CodimFlag
Definition: ordering/utility.hh:194
Definition: ordering/utility.hh:208
Definition: ordering/utility.hh:155
OrderingTraits< DI, CI > Traits
Definition: ordering/utility.hh:235
DI::EntityIndex EntityIndex
Definition: ordering/utility.hh:224
Definition: ordering/utility.hh:231
void clear()
Definition: dofindex.hh:250
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::size_t entityIndex(const Index &geometry_index)
Definition: ordering/utility.hh:114
std::enable_if< Node::has_dynamic_ordering_children >::type extract_child(const Node &node, Child &child, ChildIndex child_index)
Definition: ordering/utility.hh:257
EntityIndex & entityIndex()
Returns the index of the grid entity associated with the DOF.
Definition: dofindex.hh:257
SimpleDOFIndex< SizeType_ > DOFIndex
Definition: ordering/utility.hh:173
Definition: ordering/utility.hh:54
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
VirtualOrderingBase()
Definition: ordering/utility.hh:237
SimpleDOFIndexAccessor DOFIndexAccessor
Definition: ordering/utility.hh:179
DummyDOFIndexIterator * operator->()
Definition: ordering/utility.hh:308
DummyDOFIndexIterator & treeIndex()
Definition: ordering/utility.hh:313
static void store(DOFIndex &dof_index, const GeometryType &gt, SizeType entity_index, SizeType tree_index)
Definition: ordering/utility.hh:146
DI::View DOFIndexView
Definition: ordering/utility.hh:198
Definition: ordering/utility.hh:186
extract_child_bases(std::vector< child_type *> &children)
Definition: ordering/utility.hh:268
std::enable_if<!Node::has_dynamic_ordering_children >::type extract_child(const Node &node, Child &child, ChildIndex child_index)
Definition: ordering/utility.hh:264
Definition: ordering/utility.hh:142
bool operator!=(const DummyDOFIndexIterator &r) const
Definition: ordering/utility.hh:323
Index merging algorithm for global orderings.
Definition: ordering/utility.hh:21
ES EntitySet
Definition: ordering/utility.hh:214
Indices are interleaved according to a user-supplied pattern ([i1,i2],[j1,j2] -> [i1,j1,i2,j2]).
Definition: ordering/utility.hh:26
Dummy iterator type over DOF indices.
Definition: ordering/utility.hh:288
static const unsigned int value
Definition: gridfunctionspace/tags.hh:139
DI::View::EntityIndex EntityIndexView
Definition: ordering/utility.hh:225
Definition: ordering/utility.hh:220
TreeIndex & treeIndex()
Returns the tuple of entity-local indices associated with the DOF.
Definition: dofindex.hh:269
std::size_t size_type
Definition: ordering/utility.hh:291
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
DI::size_type SizeType
Definition: ordering/utility.hh:201
void push_back(size_type i)
Definition: ordering/utility.hh:328
Definition: simpledofindex.hh:14
Definition: ordering/utility.hh:244
void afterChild(const Node &node, Child &child, TreePath tp, ChildIndex child_index)
Definition: ordering/utility.hh:250
DummyDOFIndexIterator & operator+=(size_type i)
Definition: ordering/utility.hh:298
CI ContainerIndex
Definition: ordering/utility.hh:160
DI::size_type size_type
Definition: ordering/utility.hh:202
Lexicographically ordered ([i1,i2],[j1,j2] -> [i1,i2,j1,j2]).
Definition: ordering/utility.hh:25
static std::size_t geometryType(const DOFIndex &dof_index)
Definition: ordering/utility.hh:129
static std::size_t entityIndex(const DOFIndex &dof_index)
Definition: ordering/utility.hh:135
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
DI::View::TreeIndex TreeIndexView
Definition: ordering/utility.hh:199
DummyDOFIndexIterator & operator++()
Definition: ordering/utility.hh:293
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::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
std::size_t SizeType
Definition: ordering/utility.hh:162
DefaultDOFIndexAccessor DOFIndexAccessor
Definition: ordering/utility.hh:164
A multi-index representing a degree of freedom in a GridFunctionSpace.
Definition: dofindex.hh:146
DI::TreeIndex TreeIndex
Definition: ordering/utility.hh:196
DummyDOFIndexIterator & operator*()
Definition: ordering/utility.hh:303
type
Definition: ordering/utility.hh:24
SizeType_ SizeType
Definition: ordering/utility.hh:177
typename ES::GridView GridView
Definition: ordering/utility.hh:215