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