Dune Core Modules (2.9.0)

iterator.hh
1 #ifndef DUNE_ALU3DGRIDITERATOR_HH
2 #define DUNE_ALU3DGRIDITERATOR_HH
3 
4 // System includes
5 #include <type_traits>
6 
7 // Dune includes
10 #include <dune/alugrid/common/memory.hh>
11 #include <dune/alugrid/common/twists.hh>
12 
13 // Local includes
14 #include "alu3dinclude.hh"
15 #include "topology.hh"
16 #include "faceutility.hh"
17 #include "alu3diterators.hh"
18 
19 namespace Dune {
20  // Forward declarations
21  template<int cd, int dim, class GridImp>
22  class ALU3dGridEntity;
23  template<int cd, PartitionIteratorType pitype, class GridImp >
24  class ALU3dGridLevelIterator;
25  template<int cd, class GridImp >
26  class ALU3dGridEntityPointer;
27  template<int mydim, int coorddim, class GridImp>
28  class ALU3dGridGeometry;
29  template<class GridImp>
30  class ALU3dGridHierarchicIterator;
31  template<class GridImp>
32  class ALU3dGridIntersectionIterator;
33  template<int codim, PartitionIteratorType pitype, class GridImp>
34  class ALU3dGridLeafIterator;
35  template< int, int, ALU3dGridElementType, class >
36  class ALU3dGrid;
37  template< int, int, ALU3dGridElementType, class >
38  class ALU3dGridFaceInfo;
39  template< ALU3dGridElementType, class >
40  class ALU3dGridGeometricFaceInfo;
41 
42 //**********************************************************************
43 //
44 // --ALU3dGridIntersectionIterator
45 // --IntersectionIterator
53 template<class GridImp>
55 //: public IntersectionIteratorDefaultImplementation <GridImp,ALU3dGridIntersectionIterator>
56 {
57  enum { dim = GridImp::dimension };
58  enum { dimworld = GridImp::dimensionworld };
59 
60  typedef typename GridImp::MPICommunicatorType Comm;
61 
62  typedef ALU3dImplTraits< GridImp::elementType, Comm > ImplTraits;
63 
64  typedef typename ImplTraits::HElementType HElementType ;
65  typedef typename ImplTraits::HBndSegType HBndSegType;
66  typedef typename ImplTraits::GEOElementType GEOElementType;
67  typedef typename ImplTraits::IMPLElementType IMPLElementType;
68  typedef typename ImplTraits::GEOFaceType GEOFaceType;
69  typedef typename ImplTraits::NeighbourPairType NeighbourPairType;
70  typedef typename ImplTraits::BNDFaceType BNDFaceType;
71 
72  typedef typename ALU3dImplTraits< tetra, Comm >::GEOElementType GEOTetraElementType;
73  typedef typename ALU3dImplTraits< tetra, Comm >::BNDFaceType GEOTriangleBndType;
74  typedef typename ALU3dImplTraits< hexa, Comm >::GEOElementType GEOHexaElementType;
75  typedef typename ALU3dImplTraits< hexa, Comm >::BNDFaceType GEOQuadBndType;
76 
77  typedef ALU3dGridFaceInfo< dim, dimworld, GridImp::elementType, Comm > FaceInfoType;
78 
79  typedef typename std::conditional<
80  tetra == GridImp::elementType,
83 
86 
87  enum { numFaces = (dim==3) ? EntityCount<GridImp::elementType>::numFaces : (GridImp::elementType==tetra ? 3 : 4) };
88  enum { numVerticesPerFace =
89  GeometryInfoType::numVerticesPerFace };
90  enum { numVertices = (dim==3) ? EntityCount<GridImp::elementType>::numVertices : (GridImp::elementType==tetra ? 3 : 4)};
91 
93 
94  friend class ALU3dGridEntity<0,dim,GridImp>;
95  friend class IntersectionIteratorWrapper<GridImp,ThisType>;
96 
97 protected:
98  enum IntersectionIteratorType { IntersectionLeaf , IntersectionLevel, IntersectionBoth };
99 
100  typedef typename GridImp::Traits::template Codim< 1 >::GeometryImpl GeometryImpl;
101  typedef typename GridImp::Traits::template Codim< 1 >::LocalGeometryImpl LocalGeometryImpl;
102 
103 public:
104  typedef ALUTwists< (dim == 3 ) ? GridImp::elementType == tetra ? 3 : 4 : 2, dim-1 > Twists;
105  typedef typename Twists::Twist Twist;
106 
107  typedef typename GridImp::template Codim<0>::Entity Entity;
108  typedef typename GridImp::template Codim<0>::EntityImp EntityImp;
109 
110  typedef typename GridImp::template Codim<1>::Geometry Geometry;
111  typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
112 
116 
118 
120  explicit ALU3dGridIntersectionIterator( const bool levelIntersectionIterator = false );
121 
124 
127 
129  bool equals (const ALU3dGridIntersectionIterator<GridImp> & i) const;
130 
132  void increment ();
133 
135  EntityImp outside() const;
136 
138  EntityImp inside() const;
139 
141  bool boundary () const;
142 
144  bool neighbor () const;
145 
147  int boundaryId () const;
148 
150  size_t boundarySegmentIndex() const;
151 
153  int segmentId() const;
154 
159  LocalGeometry geometryInInside () const;
160 
165  Geometry geometry () const;
166 
168  GeometryType type () const;
169 
172  int indexInInside () const;
173 
177  LocalGeometry geometryInOutside () const;
178 
181  int indexInOutside () const;
182 
184  Twist twistInInside () const;
185 
187  Twist twistInOutside () const;
188 
192 
196 
200 
202  int level () const;
203 
204  int outsideLevel () const { return connector_.outsideLevel(); }
205 
207  bool conforming () const
208  {
209  return (connector_.conformanceState() == FaceInfoType::CONFORMING);
210  }
211 
213  const GEOFaceType& getItem() const { return connector_.face(); }
214 
216  int weight() const
217  {
218  return this->getItem().weight();
219  }
220 
221 protected:
222  // set interator to end iterator
223  void done () ;
224  template< class EntityType > void done ( const EntityType &en ) { done(); }
225 
226  // reset IntersectionIterator to first neighbour
227  void setFirstItem(const HElementType & elem, int wLevel);
228 
229  // reset IntersectionIterator to first neighbour
230  void setInteriorItem(const HElementType & elem,
231  const BNDFaceType& bnd, int wLevel);
232 
233  // reset IntersectionIterator to first neighbour
234  void first(const EntityImp& en, int wLevel, const GridImp& grid );
235 
236  // set new face
237  void setNewFace(const GEOFaceType& newFace);
238 
239 private:
240  // set new face (only LeafIntersectionIterator)
241  void setGhostFace(const GEOFaceType& newFace);
242 
243 protected:
244  // generate local geometries
245  void buildLocalGeometries() const;
246 
247  // get the face corresponding to the index
248  const typename ALU3dImplTraits< tetra, Comm >::GEOFaceType *
249  getFace ( const GEOTriangleBndType &bnd, int index ) const;
250 
251  // get the face corresponding to the index
252  const typename ALU3dImplTraits< hexa, Comm >::GEOFaceType *
253  getFace ( const GEOQuadBndType &bnd, int index ) const;
254 
255  // get the face corresponding to the index
256  const typename ALU3dImplTraits< tetra, Comm >::GEOFaceType *
257  getFace ( const GEOTetraElementType &elem, int index ) const;
258 
259  const typename ALU3dImplTraits< hexa, Comm >::GEOFaceType *
260  getFace ( const GEOHexaElementType &elem, int index ) const;
261 
264  mutable FaceInfoType connector_;
265  mutable GeometryInfoType geoProvider_; // need to initialise
266 
268  const IMPLElementType* item_;
269 
271  const BNDFaceType* ghost_;
272 
274  const GridImp* grid_;
275 
276  mutable int innerLevel_;
277  mutable int index_;
278 
279  mutable GeometryImpl intersectionGlobal_;
280  mutable LocalGeometryImpl intersectionSelfLocal_;
281  mutable LocalGeometryImpl intersectionNeighborLocal_;
282 
283  // unit outer normal
284  mutable NormalType unitOuterNormal_;
285 
286 public:
287  // used by SharedPointer
288  void invalidate() { done(); }
289  // refCount used by SharedPointer
290  unsigned int refCount_;
291 };
292 
293 template<class GridImp>
294 class ALU3dGridLevelIntersectionIterator :
295 public ALU3dGridIntersectionIterator<GridImp>
296 {
297  enum { dim = GridImp::dimension };
298  enum { dimworld = GridImp::dimensionworld };
299 
300  typedef typename GridImp::MPICommunicatorType Comm;
301 
302  typedef ALU3dImplTraits< GridImp::elementType, Comm > ImplTraits;
303 
304  typedef typename ImplTraits::HElementType HElementType ;
305  typedef typename ImplTraits::GEOElementType GEOElementType;
306  typedef typename ImplTraits::IMPLElementType IMPLElementType;
307  typedef typename ImplTraits::GEOFaceType GEOFaceType;
308  typedef typename ImplTraits::NeighbourPairType NeighbourPairType;
309  typedef typename ImplTraits::BNDFaceType BNDFaceType;
310 
311  typedef ALU3dGridFaceInfo< dim, dimworld, GridImp::elementType, Comm > FaceInfoType;
312 
313  typedef typename std::conditional<
314  tetra == GridImp::elementType,
315  ALU3dGridGeometricFaceInfoTetra< dim, dimworld, Comm >,
316  ALU3dGridGeometricFaceInfoHexa< dim, dimworld, Comm > >::type GeometryInfoType;
317 
318  typedef ElementTopologyMapping<GridImp::elementType> ElementTopo;
319  typedef FaceTopologyMapping<GridImp::elementType> FaceTopo;
320 
321  enum { numFaces = (dim==3) ? EntityCount<GridImp::elementType>::numFaces : (GridImp::elementType==tetra ? 3 : 4) };
322  enum { numVerticesPerFace =
323  GeometryInfoType::numVerticesPerFace };
324  enum { numVertices = (dim==3) ? EntityCount<GridImp::elementType>::numVertices : (GridImp::elementType==tetra ? 3 : 4)};
325 
326  typedef ALU3dGridIntersectionIterator<GridImp> BaseType;
327  typedef ALU3dGridLevelIntersectionIterator<GridImp> ThisType;
328 
329  typedef typename BaseType :: EntityImp EntityImp;
330 
331  friend class ALU3dGridEntity<0,dim,GridImp>;
332  friend class IntersectionIteratorWrapper<GridImp,ThisType>;
333 protected:
334  using BaseType :: item_;
335  using BaseType :: ghost_;
336  using BaseType :: grid_;
337  using BaseType :: innerLevel_;
338  using BaseType :: index_;
340  using BaseType :: geoProvider_;
341  using BaseType :: boundary;
342  using BaseType :: done ;
343  using BaseType :: getFace;
344  using BaseType :: neighbor ;
345 
346 public:
348  ALU3dGridLevelIntersectionIterator();
349 
351  ALU3dGridLevelIntersectionIterator(const ThisType & org);
352 
354  void assign(const ThisType & org);
355 
357  void increment ();
358 
359  // reset IntersectionIterator to first neighbour
360  void first(const EntityImp& en, int wLevel, const GridImp& grid );
361 
363  bool neighbor () const;
364 
366  bool conforming () const
367  {
368  alugrid_assert ( ( ! connector_.conformingRefinement() ) ?
369  ( !neighbor() || this->connector_.conformanceState() == FaceInfoType::CONFORMING ) : true );
370  // for conforming refinement use base implementation
371  // otherwise its true
372  return connector_.conformingRefinement() ?
373  BaseType :: conforming() : true ;
374  }
375 
376 private:
377  // set new face
378  void setNewFace(const GEOFaceType& newFace);
379 
380  // reset IntersectionIterator to first neighbour
381  void setFirstItem(const HElementType & elem, int wLevel);
382 
383  // reset IntersectionIterator to first neighbour
384  void setInteriorItem(const HElementType & elem,
385  const BNDFaceType& bnd, int wLevel);
386 
387  bool levelNeighbor_;
388  bool isLeafItem_;
389 };
390 
392 //
393 // --IterationImpl
394 //
396 template <class InternalIteratorType >
397 class ALU3dGridTreeIterator
398 {
399 public:
400  typedef typename InternalIteratorType :: val_t val_t;
401 
402  // here the items level will do
403  template <class GridImp, int dim, int codim>
404  class GetLevel
405  {
406  public:
407  template <class ItemType>
408  static int getLevel(const GridImp & grid, const ItemType & item, int level )
409  {
410  alugrid_assert ( & item );
411  return (level < 0) ? item.level() : level;
412  }
413  };
414 
415  // level is not needed for codim = 0
416  template <class GridImp, int dim>
417  class GetLevel<GridImp,dim,0>
418  {
419  public:
420  template <class ItemType>
421  static int getLevel(const GridImp & grid, const ItemType & item, int level )
422  {
423  return level;
424  }
425  };
426 
427  template <class GridImp, int dim>
428  class GetLevel<GridImp, dim, dim>
429  {
430  public:
431  template <class ItemType>
432  static int getLevel(const GridImp & grid, const ItemType & item, int level)
433  {
434  return (level < 0) ? grid.getLevelOfLeafVertex(item) : level;
435  }
436  };
437 
438 protected:
439  // set iterator to first item
440  template <class GridImp, class IteratorImp>
441  void firstItem(const GridImp & grid, IteratorImp & it, int level )
442  {
443  InternalIteratorType & iter = it.internalIterator();
444  iter.first();
445  ValidItem<IteratorImp::codimension, GridImp> validate;
446  while(!validate(grid,iter))
447  {
448  iter.next();
449  if(iter.done())
450  {
451  it.removeIter();
452  return ;
453  }
454  }
455  if( ! iter.done() )
456  {
457  alugrid_assert ( iter.size() > 0 );
458  setItem(grid,it,iter,level);
459  }
460  else
461  {
462  it.removeIter();
463  }
464  }
465 
466  // set the iterators entity to actual item
467  template <class GridImp, class IteratorImp>
468  void setItem (const GridImp & grid, IteratorImp & it, InternalIteratorType & iter, int level)
469  {
470  enum { codim = IteratorImp :: codimension };
471  val_t & item = iter.item();
472  alugrid_assert ( item.first || item.second );
473  if( item.first )
474  {
475  it.updateEntityPointer( item.first ,
476  GetLevel<GridImp,GridImp::dimension,codim>::getLevel(grid, *(item.first) , level) );
477  }
478  else
479  it.updateGhostPointer( *item.second );
480  }
481 
482  // increment iterator
483  template <class GridImp, class IteratorImp>
484  void incrementIterator(const GridImp & grid, IteratorImp & it, int level)
485  {
486  // if iter_ is zero, then end iterator
487  InternalIteratorType & iter = it.internalIterator();
488  ValidItem<IteratorImp::codimension, GridImp> validate;
489  do{
490  iter.next();
491 
492  if(iter.done())
493  {
494  it.removeIter();
495  return ;
496  }
497 
498  }while(!(validate(grid,iter) ) );
499 
500  setItem(grid,it,iter,level);
501  return ;
502  }
503 
504 private:
505  // in 2d check if item is valid
506  template <int codim, class GridImp>
507  struct ValidItem
508  {
509  bool operator()(const GridImp & grid, InternalIteratorType & iter)
510  {
511  if(GridImp::dimension ==3 || iter.done()) return true;
512  else if (GridImp::dimension == 2)
513  {
514  typedef typename ALU3dImplTraits<GridImp::elementType, typename GridImp::MPICommunicatorType>::template Codim<GridImp::dimension, codim>::ImplementationType GEOElementType;
515  val_t & item = iter.item();
516  alugrid_assert ( item.first || item.second );
517  if( item.first )
518  {
519  GEOElementType* elem = static_cast<GEOElementType*> (item.first);
520  //an element is valid if the 2d flag is set
521  return elem->is2d();
522  }
523  //if we have a ghost entity, it is the right one, as we did not insert non-2d elements into the ghostlist
524  // see alu3diterators.hh method updateGhostlist
525  else if( item.second )
526  return true;
527  }
528  return false;
529  }
530  };
531 
532  template <class GridImp>
533  struct ValidItem<0, GridImp>
534  {
535  bool operator()(const GridImp & grid, InternalIteratorType & iter)
536  {
537  return true;
538  }
539  };
540 
541 };
542 
543 //**********************************************************************
544 //
545 // --ALU3dGridLevelIterator
546 // --LevelIterator
550 template<int cd, PartitionIteratorType pitype, class GridImp>
552 : public ALU3dGridEntityPointer< cd, GridImp >,
553  public ALU3dGridTreeIterator<typename ALU3DSPACE IteratorSTI<
554  typename ALU3DSPACE IteratorElType< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, typename GridImp::MPICommunicatorType >::val_t > >
555  //ALU3DSPACE ALU3dGridLevelIteratorWrapper< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, pitype, typename GridImp::MPICommunicatorType > >
556 {
557  enum { dim = GridImp::dimension };
558  enum { dimworld = GridImp::dimensionworld };
559 
560  typedef typename GridImp::MPICommunicatorType Comm;
561 
562  friend class ALU3dGridEntity<3,dim,GridImp>;
563  friend class ALU3dGridEntity<2,dim,GridImp>;
564  friend class ALU3dGridEntity<1,dim,GridImp>;
565  friend class ALU3dGridEntity<0,dim,GridImp>;
566  friend class ALU3dGrid< dim, dimworld, GridImp::elementType, Comm >;
567 
568  friend class ALU3dGridTreeIterator<
569  typename ALU3DSPACE IteratorSTI<
570  typename ALU3DSPACE IteratorElType< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, typename GridImp::MPICommunicatorType >::val_t >
571  //ALU3DSPACE ALU3dGridLevelIteratorWrapper< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, pitype, Comm >
572  >;
573  typedef ALU3dGridEntityPointer< cd, GridImp > BaseType;
574 
575 public:
576  typedef typename GridImp::template Codim<cd>::Entity Entity;
577  typedef ALU3dGridVertexList< Comm > VertexListType;
578 
580  typedef ALU3dGridLevelIterator<cd,pitype,GridImp> ThisType;
581  // the wrapper for the original iterator of the ALU3dGrid
582  //typedef typename ALU3DSPACE ALU3dGridLevelIteratorWrapper< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, pitype, Comm > IteratorType;
583 
584  typedef typename ALU3DSPACE IteratorElType< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, Comm >::val_t val_t;
585  typedef typename ALU3DSPACE IteratorSTI< val_t > IteratorType ;
586  typedef IteratorType InternalIteratorType;
587 
589  ALU3dGridLevelIterator () : grid_( nullptr ), iter_(), level_( 0 ) {}
590 
592  ALU3dGridLevelIterator(const GridImp& grid, int level, bool);
593 
595  ALU3dGridLevelIterator(const GridImp& grid, int level);
596 
598  ALU3dGridLevelIterator(const ThisType & org);
599 
600  // destructor
602 
604  void increment ();
605 
607  void releaseEntity () {}
608 
610  ThisType & operator = (const ThisType & org);
611 private:
613  void assign (const ThisType & org);
614 
615  const GridImp &grid () const { alugrid_assert( grid_ ); return *grid_; }
616 
617  // reference to factory class (ie grid)
618  const GridImp *grid_;
619 
620  // the internal iterator
621  std::unique_ptr< IteratorType > iter_ ;
622 
623  // actual level
624  int level_;
625 
626  // deletes iter_
627  void removeIter ();
628 
629  IteratorType & internalIterator ()
630  {
631  alugrid_assert ( iter_ );
632  return *iter_;
633  }
634 };
635 
636 //********************************************************************
637 //
638 // --ALU3dGridLeafIterator
639 // --LeafIterator
640 //
641 //********************************************************************
643 template<int cdim, PartitionIteratorType pitype, class GridImp>
645 : public ALU3dGridEntityPointer< cdim, GridImp >,
646  public ALU3dGridTreeIterator<typename ALU3DSPACE IteratorSTI<
647  typename ALU3DSPACE IteratorElType< (GridImp::dimension == 2 && cdim == 2) ? 3 : cdim, typename GridImp::MPICommunicatorType >::val_t > >
648 {
649  enum { dim = GridImp :: dimension };
650 
651  friend class ALU3dGridEntity<cdim,dim,GridImp>;
652  enum { codim = cdim };
653 
654  typedef typename GridImp::MPICommunicatorType Comm;
655 
656  typedef ALU3dGridEntityPointer< cdim, GridImp > BaseType;
657 
658 public:
659  typedef typename GridImp::template Codim<cdim>::Entity Entity;
660 
661  typedef typename ALU3DSPACE IteratorElType< (GridImp::dimension == 2 && cdim == 2) ? 3 : cdim, Comm >::val_t val_t;
662  typedef typename ALU3DSPACE IteratorSTI< val_t > IteratorType ;
663  friend class ALU3dGridTreeIterator< IteratorType > ;
664 
665  typedef IteratorType InternalIteratorType;
666 
668 
670  ALU3dGridLeafIterator () : grid_( nullptr ), iter_() {}
671 
673  ALU3dGridLeafIterator(const GridImp& grid, int level);
674 
676  ALU3dGridLeafIterator(const GridImp& grid, int level , bool isBegin);
677 
679  ALU3dGridLeafIterator(const ThisType & org);
680 
683 
685  void increment ();
686 
688  void releaseEntity () {}
689 
691  ThisType & operator = (const ThisType & org);
692 
693 private:
694  const GridImp &grid () const { alugrid_assert( grid_ ); return *grid_; }
695 
696  // reference to grid class (ie grid)
697  const GridImp *grid_;
698 
699  // the internal iterator
700  std::unique_ptr< IteratorType > iter_;
701 
703  void assign (const ThisType & org);
704 
705  // deletes iter_
706  void removeIter () ;
707 
708  // return reference to iter_
709  InternalIteratorType & internalIterator ()
710  {
711  alugrid_assert ( iter_ );
712  return *iter_;
713  }
714 };
715 
716 // - HierarchicIteraor
717 // --HierarchicIterator
718 template<class GridImp>
719 class ALU3dGridHierarchicIterator
720 : public ALU3dGridEntityPointer<0,GridImp>
721 // public HierarchicIteratorDefaultImplementation <GridImp,ALU3dGridHierarchicIterator>
722 {
723  typedef ALU3dGridHierarchicIterator<GridImp> ThisType;
724  enum { dim = GridImp::dimension };
725 
726  typedef typename GridImp::MPICommunicatorType Comm;
727 
728  typedef ALU3dImplTraits< GridImp::elementType, Comm > ImplTraits;
729  typedef typename ImplTraits::HElementType HElementType;
730  typedef typename ImplTraits::HBndSegType HBndSegType;
731 
732  template < class PointerType, class CommT >
733  class GhostElementStorage;
734 
736  template < class PointerType >
737  class GhostElementStorage< PointerType, ALUGridNoComm >
738  {
739  public:
740  GhostElementStorage() {}
741  explicit GhostElementStorage( const PointerType& ) {}
742  PointerType& operator * () { PointerType* p = 0; alugrid_assert ( false ); abort(); return *p; }
743  const PointerType* ghost () const { return 0; }
744  PointerType* nextGhost () const { return 0; }
745  PointerType* operator -> () const { return 0; }
746  bool operator != (const PointerType* ) const { return false; }
747  bool operator ! () const { return true ; }
748  GhostElementStorage& operator= (const GhostElementStorage& ) { return *this; }
749  GhostElementStorage& operator= (const PointerType* ) { return *this; }
750  bool valid () const { return false; }
751  };
752 
754  template < class PointerType >
755  class GhostElementStorage< PointerType, ALUGridMPIComm >
756  {
757  private:
758  // pointers to ghost and current ghost
759  const HBndSegType * ghost_;
760  HBndSegType * nextGhost_;
761  public:
762  GhostElementStorage() : ghost_( 0 ), nextGhost_( 0 ) {}
763  explicit GhostElementStorage( const PointerType& gh ) : ghost_( &gh ), nextGhost_( 0 ) {}
764  GhostElementStorage( const GhostElementStorage& org )
765  : ghost_( org.ghost_ ), nextGhost_( org.nextGhost_ ) {}
766 
767  PointerType& operator * () { alugrid_assert ( nextGhost_ ); return *nextGhost_; }
768  const PointerType* ghost () const { return ghost_; }
769  PointerType* nextGhost () const { return nextGhost_; }
770  PointerType* operator -> () { return nextGhost_; }
771  bool operator != (const PointerType* p ) const { return (nextGhost_ != p); }
772  bool operator ! () const { return nextGhost_ == 0; }
773  GhostElementStorage& operator= (const GhostElementStorage& org)
774  {
775  ghost_ = org.ghost_;
776  nextGhost_ = org.nextGhost_;
777  return *this;
778  }
779  GhostElementStorage& operator= (PointerType* p)
780  {
781  nextGhost_ = p;
782  return *this;
783  }
784  bool valid () const { return (ghost_ != 0); }
785  };
786 
787 public:
788  typedef typename GridImp::template Codim<0>::Entity Entity;
789  typedef typename GridImp::ctype ctype;
790 
792  ALU3dGridHierarchicIterator(const HElementType & elem,
793  int maxlevel, bool end );
794 
796  ALU3dGridHierarchicIterator(const HBndSegType& ghost,
797  int maxlevel,
798  bool end);
799 
801  ALU3dGridHierarchicIterator(const ThisType &org);
802 
804  ALU3dGridHierarchicIterator();
805 
807  void increment();
808 
810  void releaseEntity () {}
811 
813  ThisType & operator = (const ThisType & org);
814 
815 private:
816  // assign iterator
817  void assign(const ThisType & org);
818 
820  int getLevel(const HElementType* item) const;
821 
823  int getLevel(const HBndSegType* face) const;
824 
825  // go to next valid element
826  template <class HItemType>
827  HItemType* goNextElement (const HItemType* startElem, HItemType * oldEl);
828 
830  const HElementType * elem_;
831 
832  // pointers to ghost and current ghost
833  GhostElementStorage< HBndSegType, Comm > ghostElem_;
834 
836  int maxlevel_;
837 };
838 
839 
840 } // end namespace Dune
841 
842 #if COMPILE_ALUGRID_INLINE
843  #include "iterator.cc"
844 #endif
845 #endif // header guard
int level() const
ask for level of entities
Definition: entity.hh:510
Definition: entity.hh:48
Definition: faceutility.hh:367
Definition: faceutility.hh:323
Definition: iterator.hh:56
int indexInOutside() const
Definition: iterator_imp.cc:298
NormalType integrationOuterNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:348
NormalType unitOuterNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:385
size_t boundarySegmentIndex() const
return the boundary segment index
Definition: iterator_imp.cc:419
const GEOFaceType & getItem() const
return current face
Definition: iterator.hh:213
EntityImp outside() const
access neighbor
Definition: iterator_imp.cc:237
int boundaryId() const
return information about the Boundary
Definition: iterator_imp.cc:411
int level() const
return level of iterator (level of item)
Definition: iterator_imp.cc:502
Twist twistInInside() const
returns twist of face compared to inner element
Definition: iterator_imp.cc:305
int segmentId() const
return the segment id (non-consecutive)
Definition: iterator_imp.cc:429
const BNDFaceType * ghost_
current pointer to ghost face if iterator was started from ghost element
Definition: iterator.hh:271
NormalType outerNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:356
void increment()
increment iterator
Definition: iterator_imp.cc:181
LocalGeometry geometryInOutside() const
Definition: iterator_imp.cc:338
Geometry geometry() const
Definition: iterator_imp.cc:394
bool equals(const ALU3dGridIntersectionIterator< GridImp > &i) const
The copy constructor.
Definition: iterator_imp.cc:171
EntityImp inside() const
access entity where iteration started
Definition: iterator_imp.cc:254
const GridImp * grid_
pointer to grid implementation
Definition: iterator.hh:274
LocalGeometry geometryInInside() const
Definition: iterator_imp.cc:289
ALU3dGridIntersectionIterator(const bool levelIntersectionIterator=false)
The default Constructor.
Definition: iterator_imp.cc:26
FaceInfoType connector_
Definition: iterator.hh:264
Twist twistInOutside() const
returns twist of face compared to outer element
Definition: iterator_imp.cc:312
bool neighbor() const
return true if across the face an neighbor on leaf exists
Definition: iterator_imp.cc:274
GeometryType type() const
obtain the type of reference element for this intersection
Definition: iterator_imp.cc:403
void assign(const ALU3dGridIntersectionIterator< GridImp > &org)
assignment of iterators
Definition: iterator_imp.cc:145
const IMPLElementType * item_
current element from which we started the intersection iterator
Definition: iterator.hh:268
bool conforming() const
return true if intersection is conforming
Definition: iterator.hh:207
int weight() const
return communication weight
Definition: iterator.hh:216
Dune::Intersection< GridImp, Dune::ALU3dGridIntersectionIterator< GridImp > > Intersection
type of the intersection
Definition: iterator.hh:115
bool boundary() const
return true if intersection is with boundary.
Definition: iterator_imp.cc:268
int indexInInside() const
Definition: iterator_imp.cc:281
Leaf iterator.
Definition: iterator.hh:648
void increment()
prefix increment
Definition: iterator.cc:222
void releaseEntity()
release entity
Definition: iterator.hh:688
ThisType & operator=(const ThisType &org)
assignment of iterators
Definition: iterator.cc:185
ALU3dGridLeafIterator()
default constructor
Definition: iterator.hh:670
~ALU3dGridLeafIterator()
destructor deleting real iterator
Definition: iterator.cc:169
Definition: iterator.hh:556
void increment()
prefix increment
Definition: iterator.cc:117
void releaseEntity()
release entity
Definition: iterator.hh:607
ThisType & operator=(const ThisType &org)
assignment of iterators
Definition: iterator.cc:109
ALU3dGridLevelIterator< cd, pitype, GridImp > ThisType
typedef of my type
Definition: iterator.hh:580
ALU3dGridLevelIterator()
default constructor
Definition: iterator.hh:589
[ provides Dune::Grid ]
Definition: grid.hh:434
Definition: topology.hh:40
Definition: topology.hh:151
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
Class that wraps IntersectionIteratorImp of a grid and gets it's internal object from a object stack ...
Definition: intersectioniteratorwrapper.hh:23
Intersection of a mesh entity of codimension 0 ("element") with a "neighboring" element or with the d...
Definition: intersection.hh:164
Different resources needed by all grid implementations.
topology of a Cartesian grid
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition: iteratorfacades.hh:259
Provides proxy classes for IntersectionsIterators.
constexpr Ghost ghost
PartitionSet for the ghost partition.
Definition: partitionset.hh:284
Dune namespace.
Definition: alignedallocator.hh:13
void assign(T &dst, const T &src, bool mask)
masked Simd assignment (scalar version)
Definition: simd.hh:447
@ conforming
use only conforming bisection refinement
Definition: declaration.hh:25
Definition: alu3dinclude.hh:328
Static tag representing a codimension.
Definition: dimension.hh:24
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (Apr 27, 22:29, 2024)