Dune Core Modules (2.4.1)

iterator.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_ALU2DGRID_ITERATOR_HH
4#define DUNE_ALU2DGRID_ITERATOR_HH
5
6// System includes
7#include <stack>
8#include <utility>
9
10// Dune includes
13
14// Local includes
15#include "entity.hh"
16
17namespace Dune {
18 // Forward declarations
19 template<int cd, int dim, class GridImp>
20 class ALU2dGridEntity;
21 template<int cd, PartitionIteratorType pitype, class GridImp >
22 class ALU2dGridLevelIterator;
23 template<int cd, class GridImp >
24 class ALU2dGridEntityPointer;
25 template<int mydim, int coorddim, class GridImp>
26 class ALU2dGridGeometry;
27 template<class GridImp>
28 class ALU2dGridHierarchicIterator;
29 template<class GridImp>
30 class ALU2dGridIntersectionBase;
31 template<class GridImp>
32 class ALU2dGridLeafIntersectionIterator;
33 template<class GridImp>
34 class ALU2dGridLevelIntersectionIterator;
35 template<int codim, PartitionIteratorType pitype, class GridImp>
36 class ALU2dGridLeafIterator;
37 template< int dim, int dimworld, ALU2DSPACE ElementType eltype >
38 class ALU2dGrid;
39
40
41 //********************************************************************
42 // --ALU2dGridLeafIterator
43 // --LeafIterator
44 // --for codim = 0,2
45 //
46 //********************************************************************
47
48 template<int cdim, PartitionIteratorType pitype, class GridImp>
49 class ALU2dGridLeafIterator
50 : public ALU2dGridEntityPointer<cdim,GridImp>
51 // public LeafIteratorDefaultImplementation<cdim, pitype, GridImp, ALU2dGridLeafIterator>
52 {
53 static const int dim = GridImp::dimension;
54 static const int dimworld = GridImp::dimensionworld;
55 static const ALU2DSPACE ElementType eltype = GridImp::elementType;
56 static const int codim = cdim;
57
58 friend class ALU2dGridEntity<0,dimworld,GridImp>;
59 friend class ALU2dGridEntity<1,dimworld,GridImp>;
60 friend class ALU2dGridEntity<dim,dimworld,GridImp>;
61 friend class ALU2dGrid< dim, dimworld, eltype >;
62
63 typedef ALU2dGridEntityPointer<cdim,GridImp> EntityPointerType;
64 typedef ALU2dGridEntity<cdim,dim,GridImp> EntityImp;
65
66 typedef ALU2dGridLeafIterator<cdim, pitype, GridImp> ThisType;
67
68 typedef typename GridImp :: ALU2dGridLeafMarkerVectorType LeafMarkerVectorType;
69
70 // default impl for elements
71 template <class ElementImp, class MarkerVectorImp, int codim>
72 struct GetLevel
73 {
74 // return level of element
75 static int level(const ElementImp & elem, const MarkerVectorImp& marker)
76 {
77 return elem.level();
78 }
79 };
80
81 // specialization for vertices
82 template <class ElementImp, class MarkerVectorImp>
83 struct GetLevel<ElementImp,MarkerVectorImp,2>
84 {
85 // return level of leaf vertex
86 static int level(const ElementImp & elem, const MarkerVectorImp& marker)
87 {
88 return marker.levelOfVertex(elem.getIndex());
89 }
90 };
91
92 public:
93 typedef typename GridImp :: GridObjectFactoryType FactoryType;
94
96 typedef typename GridImp::template Codim<cdim>::Entity Entity;
97 typedef typename Dune::ALU2dImplTraits< dimworld, eltype >::template Codim<cdim>::InterfaceType ElementType;
98
100 ALU2dGridLeafIterator(const FactoryType& factory, bool end);
101
103 ALU2dGridLeafIterator(const ThisType & org);
104
106 void increment ();
107
109 ThisType & operator = (const ThisType & org);
110
111 private:
113 bool endIter_;
115 int level_;
116 ElementType * elem_;
117 typedef ALU2DSPACE Listwalkptr< ElementType > IteratorType;
118 // Listwalkptr, behaves like a proxy for Leafwalk and Levelwalk Ptrs
119 IteratorType iter_;
120
121 // for the codim 2 case
122 LeafMarkerVectorType & marker_;
123 }; // end ALU2dGridLeafIterator
124
125
126 //********************************************************************
127 // --ALU2dGridLeafIterator
128 // --LeafIterator
129 // --specialized for codim = 1
130 //
131 //********************************************************************
132
133 template<PartitionIteratorType pitype, class GridImp>
134 class ALU2dGridLeafIterator<1,pitype,GridImp>
135 : public ALU2dGridEntityPointer<1,GridImp>
136 // public LeafIteratorDefaultImplementation<1, pitype, GridImp, ALU2dGridLeafIterator>
137 {
138 static const int dim = GridImp::dimension;
139 static const int dimworld = GridImp::dimensionworld;
140 static const ALU2DSPACE ElementType eltype = GridImp::elementType;
141 static const int codim = 1;
142
143 friend class ALU2dGridEntity<0,dimworld,GridImp>;
144 friend class ALU2dGridEntity<1,dimworld,GridImp>;
145 friend class ALU2dGridEntity<dim,dimworld,GridImp>;
146 friend class ALU2dGrid< dim, dimworld, eltype >;
147
148 typedef ALU2dGridEntityPointer<1,GridImp> EntityPointerType;
149 typedef ALU2dGridEntity<1,dim,GridImp> EntityImp;
150
151 typedef ALU2dGridLeafIterator<1, pitype, GridImp> ThisType;
152
153 typedef typename GridImp :: ALU2dGridLeafMarkerVectorType LeafMarkerVectorType;
154
155 public:
156 typedef typename GridImp :: GridObjectFactoryType FactoryType;
157
159 typedef typename GridImp::template Codim<1>::Entity Entity;
160 typedef typename Dune::ALU2dImplTraits< dimworld, eltype >::template Codim<1>::InterfaceType ElementType;
161
163 ALU2dGridLeafIterator(const FactoryType& factory, bool end);
164
166 ALU2dGridLeafIterator(const ThisType & org);
167
169 void increment ();
170
172 ThisType & operator = (const ThisType & org);
173
174 private:
175 int goNextElement();
176
178 bool endIter_;
180 int level_;
182 int face_;
183
185 ElementType * elem_;
186
187 typedef ALU2DSPACE Listwalkptr< ElementType > IteratorType;
188
189 // Listwalkptr, behaves like a proxy for Leafwalk and Levelwalk Ptrs
190 IteratorType iter_;
191
192 // for the codim 1 case
193 LeafMarkerVectorType & marker_;
194
195 }; // end ALU2dGridLeafIterator
196
197 //**********************************************************************
198 //
199 // --ALU2dGridLevelIterator
200 // --LevelIterator, specialized for cd=0
201 //**********************************************************************
202
203 template<PartitionIteratorType pitype, class GridImp>
204 class ALU2dGridLevelIterator<0, pitype, GridImp>
205 : public ALU2dGridEntityPointer<0,GridImp>
206 // public LevelIteratorDefaultImplementation <0, pitype, GridImp, ALU2dGridLevelIterator>
207 {
208 static const int dim = GridImp::dimension;
209 static const int dimworld = GridImp::dimensionworld;
210 static const ALU2DSPACE ElementType eltype = GridImp::elementType;
211 static const int codim = 0;
212
213 friend class ALU2dGridEntity<dim,dimworld,GridImp>;
214 friend class ALU2dGridEntity<1,dimworld,GridImp>;
215 friend class ALU2dGridEntity<0,dimworld,GridImp>;
216 friend class ALU2dGrid< dim, dimworld, eltype >;
217
218 typedef ALU2dGridEntityPointer<codim,GridImp> EntityPointerType;
219 typedef ALU2dGridEntity<codim,dim,GridImp> EntityImp;
220
221 typedef typename ALU2dImplTraits< dimworld, eltype >::HElementType HElementType;
222 typedef ALU2dGridLevelIterator<0,pitype,GridImp> ThisType;
223
224 public:
225 typedef typename GridImp :: GridObjectFactoryType FactoryType;
226
227 typedef typename GridImp::template Codim<codim>::Entity Entity;
228
230 ALU2dGridLevelIterator(const FactoryType& factory, int level, bool end);
231
233 ALU2dGridLevelIterator(const ThisType & org);
234
236 void increment ();
237
239 ThisType & operator = (const ThisType & org);
240
241 private:
243 bool endIter_;
245 int level_;
246
248 HElementType * item_;
249
251 typedef typename Dune::ALU2dImplTraits< dimworld, eltype >::template Codim<0>::InterfaceType ElementType;
252 typedef ALU2DSPACE Listwalkptr< ElementType > IteratorType;
253 IteratorType iter_;
254
255 };
256
257 //**********************************************************************
258 //
259 // --ALU2dGridLevelIterator
260 // --LevelIterator, specialized for cd=1
261 //**********************************************************************
262
263 template<PartitionIteratorType pitype, class GridImp>
264 class ALU2dGridLevelIterator<1, pitype, GridImp>
265 : public ALU2dGridEntityPointer<1,GridImp>
266 // public LevelIteratorDefaultImplementation <1, pitype, GridImp, ALU2dGridLevelIterator>
267 {
268 static const int dim = GridImp::dimension;
269 static const int dimworld = GridImp::dimensionworld;
270 static const ALU2DSPACE ElementType eltype = GridImp::elementType;
271 static const int codim = 1;
272
273 friend class ALU2dGridEntity<dim,dimworld,GridImp>;
274 friend class ALU2dGridEntity<1,dimworld,GridImp>;
275 friend class ALU2dGridEntity<0,dimworld,GridImp>;
276 friend class ALU2dGrid< dim, dimworld, eltype >;
277
278 typedef ALU2dGridEntityPointer<codim,GridImp> EntityPointerType;
279 typedef ALU2dGridEntity<codim,dim,GridImp> EntityImp;
280
281 typedef typename ALU2dImplTraits< dimworld, eltype >::HElementType HElementType;
282
283 typedef ALU2dGridLevelIterator<1,pitype,GridImp> ThisType;
284 public:
285 typedef typename GridImp :: GridObjectFactoryType FactoryType;
286
287 typedef typename GridImp::template Codim<codim>::Entity Entity;
288
290 ALU2dGridLevelIterator(const FactoryType& factroy, int level, bool end);
291
293 ALU2dGridLevelIterator(const ThisType & org);
294
295 ~ALU2dGridLevelIterator();
296
298 void increment ();
299
301 ThisType & operator = (const ThisType & org);
302
303 private:
305 bool endIter_;
307 int level_;
309 int myFace_;
310
311 // current item
312 HElementType * item_;
314 typedef typename Dune::ALU2dImplTraits< dimworld, eltype >::template Codim<1>::InterfaceType ElementType;
315 ElementType * elem_;
316 // Listwalkptr is a proxy for iterator pointers
317 typedef ALU2DSPACE Listwalkptr< ElementType > IteratorType;
318
319 IteratorType iter_;
320
321 ALU2dGridMarkerVector * marker_;
322
323 ALU2dGridMarkerVector & marker()
324 {
325 assert( marker_ );
326 return *marker_;
327 }
328 };
329
330 //**********************************************************************
331 //
332 // --ALU2dGridLevelIterator
333 // --LevelIterator, specialized for cd=2
334 //**********************************************************************
335
336 template<PartitionIteratorType pitype, class GridImp>
337 class ALU2dGridLevelIterator<2, pitype, GridImp>
338 : public ALU2dGridEntityPointer<2,GridImp>
339 // public LevelIteratorDefaultImplementation <2, pitype, GridImp, ALU2dGridLevelIterator>
340 {
341 static const int dim = GridImp::dimension;
342 static const int dimworld = GridImp::dimensionworld;
343 static const ALU2DSPACE ElementType eltype = GridImp::elementType;
344 static const int codim = 2;
345
346 friend class ALU2dGridEntity<dim,dimworld,GridImp>;
347 friend class ALU2dGridEntity<1,dimworld,GridImp>;
348 friend class ALU2dGridEntity<0,dimworld,GridImp>;
349 friend class ALU2dGrid< dim, dimworld, eltype >;
350
351 typedef ALU2dGridEntityPointer<codim,GridImp> EntityPointerType;
352 typedef ALU2dGridEntity<codim,dim,GridImp> EntityImp;
353
354 typedef typename ALU2dImplTraits< dimworld, eltype >::HElementType HElementType ;
355 typedef ALU2dGridLevelIterator<2,pitype,GridImp> ThisType;
356
357 public:
358 typedef typename GridImp :: GridObjectFactoryType FactoryType;
359
360 typedef typename GridImp::template Codim<codim>::Entity Entity;
361
363 ALU2dGridLevelIterator(const FactoryType& factory, int level, bool end);
364
366 ALU2dGridLevelIterator(const ThisType & org);
367
368 ~ALU2dGridLevelIterator();
369
371 void increment ();
372
374 ThisType & operator = (const ThisType & org);
375
376 private:
378 bool endIter_;
380 int level_;
382 int myFace_;
384
386 typedef typename Dune::ALU2dImplTraits< dimworld, eltype >::template Codim<0>::InterfaceType ElementType;
387 typedef typename Dune::ALU2dImplTraits< dimworld, eltype >::template Codim<2>::InterfaceType VertexType;
388
389 HElementType * item_;
390 VertexType * vertex_;
391
392
393 typedef ALU2DSPACE Listwalkptr< ElementType > IteratorType;
394 IteratorType iter_;
395
396 // marker vector to tell on which element vertex is visited
397 ALU2dGridMarkerVector * marker_;
398 ALU2dGridMarkerVector & marker()
399 {
400 assert( marker_ );
401 return *marker_;
402 }
403 };
404
405 //***************************************************************
406 //
407 // - HierarchicIteraror
408 // --HierarchicIterator
409 //***************************************************************
410
412 template<class GridImp>
414 : public ALU2dGridEntityPointer<0,GridImp>
415 // public HierarchicIteratorDefaultImplementation <GridImp,ALU2dGridHierarchicIterator>
416 {
418
419 static const int dim = GridImp::dimension;
420 static const int dimworld = GridImp::dimensionworld;
421 static const ALU2DSPACE ElementType eltype = GridImp::elementType;
422 static const int codim = 2;
423
424 typedef typename ALU2dImplTraits< dimworld, eltype >::HElementType HElementType ;
425
426 public:
427 typedef typename GridImp :: GridObjectFactoryType FactoryType;
428
430 typedef typename GridImp::template Codim<0>::Entity Entity;
432 typedef typename GridImp::ctype ctype;
435
437 ALU2dGridHierarchicIterator(const FactoryType& factory,
438 const HElementType & elem, int maxlevel, bool end=false);
439
442
444 void increment();
445
448 {
450 elem_ = org.elem_;
451 maxlevel_= org.maxlevel_;
452 endIter_ = org.endIter_;
453 return *this;
454 }
455
456 private:
457
459 HElementType * goNextElement (HElementType * oldEl);
460
462 const HElementType * elem_;
463
465 int maxlevel_;
467 bool endIter_;
468 }; // end ALU2dHierarchicIterator
469
470} // end namespace Dune
471
472#include "iterator_imp.cc"
473
474#endif // #ifndef DUNE_ALU2DGRID_ITERATOR_HH
Definition: entity.hh:549
ThisType & operator=(const ThisType &org)
assigment operator
Hierarchic Iterator of ALU2dGrid.
Definition: iterator.hh:416
ThisType & operator=(const ALU2dGridHierarchicIterator< GridImp > &org)
the assignment operator
Definition: iterator.hh:447
GridImp::template Codim< 0 >::Entity Entity
type of entities we iterate
Definition: iterator.hh:430
void increment()
increment, go to next entity
ALU2dGridEntity< 0, dim, GridImp > EntityImp
tpye of entity implementation
Definition: iterator.hh:434
ALU2dGridHierarchicIterator(const FactoryType &factory, const HElementType &elem, int maxlevel, bool end=false)
the normal Constructor
ALU2dGridHierarchicIterator(const ALU2dGridHierarchicIterator< GridImp > &org)
the normal Constructor
GridImp::ctype ctype
type of coordinates, i.e. double
Definition: iterator.hh:432
Different resources needed by all grid implementations.
InterfaceType
Parameter to be used for the communication functions.
Definition: gridenums.hh:84
Provides proxy classes for IntersectionsIterators.
Dune namespace.
Definition: alignment.hh:10
Static tag representing a codimension.
Definition: dimension.hh:22
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Dec 22, 23:30, 2024)