Go to the documentation of this file. 1 #ifndef DUNE_ALU3DGRIDITERATOR_HH
2 #define DUNE_ALU3DGRIDITERATOR_HH
8 #include <dune/grid/common/grid.hh>
21 template<
int cd,
int dim,
class Gr
idImp>
22 class ALU3dGridEntity;
23 template<
int cd, PartitionIteratorType pitype,
class Gr
idImp >
24 class ALU3dGridLevelIterator;
25 template<
int cd,
class Gr
idImp >
26 class ALU3dGridEntityPointer;
27 template<
int mydim,
int coorddim,
class Gr
idImp>
28 class ALU3dGridGeometry;
29 template<
class Gr
idImp>
30 class ALU3dGridHierarchicIterator;
31 template<
class Gr
idImp>
32 class ALU3dGridIntersectionIterator;
33 template<
int codim, PartitionIteratorType pitype,
class Gr
idImp>
34 class ALU3dGridLeafIterator;
35 template<
int,
int, ALU3dGr
idElementType,
class >
37 template<
int,
int, ALU3dGr
idElementType,
class >
38 class ALU3dGridFaceInfo;
39 template< ALU3dGr
idElementType,
class >
53 template<
class Gr
idImp>
57 enum { dim = GridImp::dimension };
58 enum { dimworld = GridImp::dimensionworld };
60 typedef typename GridImp::MPICommunicatorType Comm;
62 typedef ALU3dImplTraits< GridImp::elementType, Comm > ImplTraits;
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;
79 typedef typename std::conditional<
80 tetra == GridImp::elementType,
81 ALU3dGridGeometricFaceInfoTetra< dim, dimworld, Comm >,
82 ALU3dGridGeometricFaceInfoHexa< dim, dimworld, Comm > >
::type GeometryInfoType;
84 typedef ElementTopologyMapping<GridImp::elementType> ElementTopo;
85 typedef FaceTopologyMapping<GridImp::elementType> FaceTopo;
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)};
92 typedef ALU3dGridIntersectionIterator<GridImp> ThisType;
100 typedef typename GridImp::Traits::template Codim< 1 >::GeometryImpl
GeometryImpl;
105 typedef typename Twists::Twist
Twist;
107 typedef typename GridImp::template Codim<0>::Entity
Entity;
108 typedef typename GridImp::template Codim<1>::Geometry
Geometry;
114 typedef Dune::Intersection< GridImp, Dune::ALU3dGridIntersectionIterator< GridImp > >
Intersection;
164 GeometryType
type ()
const;
214 return this->
getItem().weight();
220 template<
class EntityType >
void done (
const EntityType &en ) {
done(); }
223 void setFirstItem(
const HElementType & elem,
int wLevel);
227 const BNDFaceType& bnd,
int wLevel);
230 template <
class EntityType>
231 void first(
const EntityType & en,
int wLevel,
232 const bool conformingRefinement,
233 const bool ghostCellsEnabled );
240 void setGhostFace(
const GEOFaceType& newFace);
248 getFace (
const GEOTriangleBndType &bnd,
int index )
const;
252 getFace (
const GEOQuadBndType &bnd,
int index )
const;
256 getFace (
const GEOTetraElementType &elem,
int index )
const;
259 getFace (
const GEOHexaElementType &elem,
int index )
const;
289 template<
class Gr
idImp>
293 enum { dim = GridImp::dimension };
294 enum { dimworld = GridImp::dimensionworld };
296 typedef typename GridImp::MPICommunicatorType Comm;
298 typedef ALU3dImplTraits< GridImp::elementType, Comm > ImplTraits;
300 typedef typename ImplTraits::HElementType HElementType ;
301 typedef typename ImplTraits::GEOElementType GEOElementType;
302 typedef typename ImplTraits::IMPLElementType IMPLElementType;
303 typedef typename ImplTraits::GEOFaceType GEOFaceType;
304 typedef typename ImplTraits::NeighbourPairType NeighbourPairType;
305 typedef typename ImplTraits::BNDFaceType BNDFaceType;
307 typedef ALU3dGridFaceInfo< dim, dimworld, GridImp::elementType, Comm > FaceInfoType;
309 typedef typename std::conditional<
310 tetra == GridImp::elementType,
311 ALU3dGridGeometricFaceInfoTetra< dim, dimworld, Comm >,
312 ALU3dGridGeometricFaceInfoHexa< dim, dimworld, Comm > >
::type GeometryInfoType;
314 typedef ElementTopologyMapping<GridImp::elementType> ElementTopo;
315 typedef FaceTopologyMapping<GridImp::elementType> FaceTopo;
317 enum { numFaces = (dim==3) ? EntityCount<GridImp::elementType>::numFaces : (GridImp::elementType==
tetra ? 3 : 4) };
318 enum { numVerticesPerFace =
319 GeometryInfoType::numVerticesPerFace };
320 enum { numVertices = (dim==3) ? EntityCount<GridImp::elementType>::numVertices : (GridImp::elementType==
tetra ? 3 : 4)};
322 typedef ALU3dGridIntersectionIterator<GridImp> BaseType;
323 typedef ALU3dGridLevelIntersectionIterator<GridImp> ThisType;
353 template <
class EntityType>
354 void first(
const EntityType & en,
int wLevel,
355 const bool conformingRefinement,
356 const bool ghostCellsEnabled );
374 void setNewFace(
const GEOFaceType& newFace);
377 void setFirstItem(
const HElementType & elem,
int wLevel);
380 void setInteriorItem(
const HElementType & elem,
381 const BNDFaceType& bnd,
int wLevel);
392 template <
class InternalIteratorType >
396 typedef typename InternalIteratorType :: val_t
val_t;
399 template <
class Gr
idImp,
int codim>
403 template <
class ItemType>
404 static int getLevel(
const GridImp & grid,
const ItemType & item,
int level )
407 return (level < 0) ? item.level() : level;
412 template <
class Gr
idImp>
416 template <
class ItemType>
417 static int getLevel(
const GridImp & grid,
const ItemType & item,
int level )
423 template <
class Gr
idImp>
427 template <
class ItemType>
428 static int getLevel(
const GridImp & grid,
const ItemType & item,
int level)
430 return (level < 0) ? grid.getLevelOfLeafVertex(item) : level;
436 template <
class Gr
idImp,
class IteratorImp>
437 void firstItem(
const GridImp & grid, IteratorImp & it,
int level )
439 InternalIteratorType & iter = it.internalIterator();
441 ValidItem<IteratorImp::codimension, GridImp> validate;
442 while(!validate(grid,iter))
463 template <
class Gr
idImp,
class IteratorImp>
464 void setItem (
const GridImp & grid, IteratorImp & it, InternalIteratorType & iter,
int level)
466 enum { codim = IteratorImp :: codimension };
467 val_t & item = iter.item();
471 it.updateEntityPointer( item.first ,
475 it.updateGhostPointer( *item.second );
479 template <
class Gr
idImp,
class IteratorImp>
483 InternalIteratorType & iter = it.internalIterator();
484 ValidItem<IteratorImp::codimension, GridImp> validate;
494 }
while(!(validate(grid,iter) ) );
502 template <
int codim,
class Gr
idImp>
505 bool operator()(
const GridImp & grid, InternalIteratorType & iter)
507 if(GridImp::dimension ==3 || iter.done())
return true;
508 else if (GridImp::dimension == 2)
511 val_t & item = iter.item();
515 GEOElementType* elem = static_cast<GEOElementType*> (item.first);
521 else if( item.second )
528 template <
class Gr
idImp>
529 struct ValidItem<0, GridImp>
531 bool operator()(
const GridImp & grid, InternalIteratorType & iter)
546 template<
int cd, PartitionIteratorType pitype,
class Gr
idImp>
547 class ALU3dGridLevelIterator
548 :
public ALU3dGridEntityPointer< cd, GridImp >,
549 public ALU3dGridTreeIterator< ALU3DSPACE ALU3dGridLevelIteratorWrapper< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, pitype, typename GridImp::MPICommunicatorType > >
551 enum { dim = GridImp::dimension };
552 enum { dimworld = GridImp::dimensionworld };
554 typedef typename GridImp::MPICommunicatorType Comm;
562 friend class
ALU3dGridTreeIterator< ALU3DSPACE ALU3dGridLevelIteratorWrapper< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, pitype, Comm > >;
572 typedef typename
ALU3DSPACE ALU3dGridLevelIteratorWrapper< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, pitype, Comm >
IteratorType;
603 const GridImp &grid ()
const {
alugrid_assert( grid_ );
return *grid_; }
606 const GridImp *grid_;
609 std::unique_ptr< IteratorType > iter_ ;
631 template<
int cdim, PartitionIteratorType pitype,
class Gr
idImp>
632 class ALU3dGridLeafIterator
633 :
public ALU3dGridEntityPointer< cdim, GridImp >,
634 public ALU3dGridTreeIterator< ALU3DSPACE ALU3dGridLeafIteratorWrapper< (GridImp::dimension == 2 && cdim == 2) ? 3 : cdim, pitype, typename GridImp::MPICommunicatorType > >
636 enum { dim = GridImp :: dimension };
639 enum { codim = cdim };
641 typedef typename GridImp::MPICommunicatorType Comm;
646 typedef typename GridImp::template Codim<cdim>::Entity
Entity;
648 typedef typename ALU3DSPACE ALU3dGridLeafIteratorWrapper< (GridImp::dimension == 2 && cdim == 2) ? 3 : cdim, pitype, Comm >
IteratorType ;
652 typedef typename ALU3DSPACE IteratorElType< (GridImp::dimension == 2 && cdim == 2) ? 3 : cdim, Comm >::
val_t val_t;
681 const GridImp &grid ()
const {
alugrid_assert( grid_ );
return *grid_; }
684 const GridImp *grid_;
687 std::unique_ptr< IteratorType > iter_;
705 template<
class Gr
idImp>
706 class ALU3dGridHierarchicIterator
707 :
public ALU3dGridEntityPointer<0,GridImp>
710 typedef ALU3dGridHierarchicIterator<GridImp> ThisType;
711 enum { dim = GridImp::dimension };
713 typedef typename GridImp::MPICommunicatorType Comm;
715 typedef ALU3dImplTraits< GridImp::elementType, Comm > ImplTraits;
716 typedef typename ImplTraits::HElementType HElementType;
717 typedef typename ImplTraits::HBndSegType HBndSegType;
719 template <
class Po
interType,
class CommT >
720 class GhostElementStorage;
723 template <
class Po
interType >
724 class GhostElementStorage< PointerType, ALUGridNoComm >
727 GhostElementStorage() {}
728 explicit GhostElementStorage(
const PointerType& ) {}
729 PointerType& operator * () { PointerType* p = 0;
alugrid_assert (
false ); abort();
return *p; }
730 const PointerType* ghost ()
const {
return 0; }
731 PointerType* nextGhost ()
const {
return 0; }
732 PointerType* operator -> ()
const {
return 0; }
733 bool operator != (
const PointerType* )
const {
return false; }
734 bool operator ! ()
const {
return true ; }
735 GhostElementStorage&
operator= (
const GhostElementStorage& ) {
return *
this; }
736 GhostElementStorage&
operator= (
const PointerType* ) {
return *
this; }
737 bool valid ()
const {
return false; }
741 template <
class Po
interType >
742 class GhostElementStorage< PointerType, ALUGridMPIComm >
746 const HBndSegType * ghost_;
747 HBndSegType * nextGhost_;
749 GhostElementStorage() : ghost_( 0 ), nextGhost_( 0 ) {}
750 explicit GhostElementStorage(
const PointerType& gh ) : ghost_( &gh ), nextGhost_( 0 ) {}
751 GhostElementStorage(
const GhostElementStorage& org )
752 : ghost_( org.ghost_ ), nextGhost_( org.nextGhost_ ) {}
754 PointerType& operator * () {
alugrid_assert ( nextGhost_ );
return *nextGhost_; }
755 const PointerType* ghost ()
const {
return ghost_; }
756 PointerType* nextGhost ()
const {
return nextGhost_; }
757 PointerType* operator -> () {
return nextGhost_; }
758 bool operator != (
const PointerType* p )
const {
return (nextGhost_ != p); }
759 bool operator ! ()
const {
return nextGhost_ == 0; }
760 GhostElementStorage&
operator= (
const GhostElementStorage& org)
763 nextGhost_ = org.nextGhost_;
766 GhostElementStorage&
operator= (PointerType* p)
771 bool valid ()
const {
return (ghost_ != 0); }
775 typedef typename GridImp::template Codim<0>::Entity
Entity;
776 typedef typename GridImp::ctype
ctype;
780 int maxlevel,
bool end );
801 void assign(
const ThisType & org);
804 int getLevel(
const HElementType* item)
const;
807 int getLevel(
const HBndSegType* face)
const;
810 template <
class HItemType>
811 HItemType* goNextElement (
const HItemType* startElem, HItemType * oldEl);
814 const HElementType * elem_;
817 GhostElementStorage< HBndSegType, Comm > ghostElem_;
ALU3dGridIntersectionIterator< GridImp > ImplementationType
Definition: iterator.hh:112
ALU3DSPACE IteratorElType<(GridImp::dimension==2 &&cdim==2) ? 3 :cdim, Comm >::val_t val_t
Definition: iterator.hh:652
Definition: 3d/grid.hh:68
Definition: iterator.hh:393
const ALU3dImplTraits< tetra, Comm >::GEOFaceType * getFace(const GEOTriangleBndType &bnd, int index) const
Definition: iterator_imp.cc:422
int outsideLevel() const
Definition: faceutility_imp.cc:357
void releaseEntity()
release entity
Definition: iterator.hh:675
ThisType & operator=(const ThisType &org)
assignment of iterators
Definition: iterator.cc:178
GitterType::Geometric::hexa_GEO GEOElementType
Definition: alu3dinclude.hh:310
GridImp::template Codim< cdim >::Entity Entity
Definition: iterator.hh:646
void releaseEntity()
release entity
Definition: iterator.hh:794
const GEOFaceType & face() const
Returns the ALU3dGrid face.
Definition: faceutility_imp.cc:320
void increment()
prefix increment
Definition: iterator.cc:111
GridImp::Traits::template Codim< 1 >::LocalGeometryImpl LocalGeometryImpl
Definition: iterator.hh:101
Definition: alu3dinclude.hh:344
Twist twistInOutside() const
returns twist of face compared to outer element
Definition: iterator_imp.cc:309
GridImp::ctype ctype
Definition: iterator.hh:776
int innerLevel_
Definition: iterator.hh:272
void assign(const ALU3dGridIntersectionIterator< GridImp > &org)
assignment of iterators
Definition: iterator_imp.cc:143
bool neighbor() const
return true if across the edge an neighbor on this level exists
Definition: iterator_imp.cc:607
NormalType unitOuterNormal_
Definition: iterator.hh:280
Definition: iterator.hh:40
GridImp::MPICommunicatorType Comm
Definition: entity.hh:636
unsigned int refCount_
Definition: iterator.hh:286
NormalType outerNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:334
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition: iterator.hh:428
Definition: alu3dinclude.hh:259
void firstItem(const GridImp &grid, IteratorImp &it, int level)
Definition: iterator.hh:437
Definition: topology.hh:12
EntityPointerImpl inside() const
access entity where iteration started
Definition: iterator_imp.cc:251
void first(const EntityType &en, int wLevel, const bool conformingRefinement, const bool ghostCellsEnabled)
Definition: iterator_imp.cc:504
ALU3dGridLevelIterator()
default constructor
Definition: iterator.hh:577
ThisType & operator=(const ThisType &org)
the assignment operator
Definition: iterator.cc:293
ConformanceState conformanceState() const
Description of conformance on the face.
Definition: faceutility_imp.cc:438
Definition: iterator.hh:98
NormalType integrationOuterNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:326
Geometry geometry() const
Definition: iterator_imp.cc:376
GridImp::template Codim< 0 >::Entity Entity
Definition: iterator.hh:107
Definition: iterator.hh:400
ThisType & operator=(const ThisType &org)
assignment of iterators
Definition: iterator.cc:103
Leaf iterator.
Definition: entity.hh:34
InternalIteratorType ::val_t val_t
Definition: iterator.hh:396
Class that wraps IntersectionIteratorImp of a grid and gets it's internal object from a object stack ...
Definition: intersectioniteratorwrapper.hh:25
void setItem(const GridImp &grid, IteratorImp &it, InternalIteratorType &iter, int level)
Definition: iterator.hh:464
Twists::Twist Twist
Definition: iterator.hh:105
GridImp::template Codim< 1 >::LocalGeometry LocalGeometry
Definition: iterator.hh:109
void increment()
increment iterator
Definition: iterator_imp.cc:178
ALU3DSPACE ALU3dGridLeafIteratorWrapper<(GridImp::dimension==2 &&cdim==2) ? 3 :cdim, pitype, Comm > IteratorType
Definition: iterator.hh:648
IteratorType InternalIteratorType
Definition: iterator.hh:651
~ALU3dGridLeafIterator()
destructor deleting real iterator
Definition: iterator.cc:162
void increment()
increment
Definition: iterator.cc:374
GeometryInfoType geoProvider_
Definition: iterator.hh:264
void setInteriorItem(const HElementType &elem, const BNDFaceType &bnd, int wLevel)
Definition: iterator_imp.cc:65
ALU3dGridIntersectionIterator(const bool levelIntersectionIterator=false)
The default Constructor.
Definition: iterator_imp.cc:27
ALU3DSPACE ALU3dGridLevelIteratorWrapper<(GridImp::dimension==2 &&cd==2) ? 3 :cd, pitype, Comm > IteratorType
Definition: iterator.hh:572
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition: iterator.hh:404
size_t boundarySegmentIndex() const
return the boundary segment index
Definition: iterator_imp.cc:404
void setFirstItem(const HElementType &elem, int wLevel)
Definition: iterator_imp.cc:48
bool equals(const ALU3dGridIntersectionIterator< GridImp > &i) const
The copy constructor.
Definition: iterator_imp.cc:168
Definition: faceutility.hh:48
ALU3DSPACE IteratorElType<(GridImp::dimension==2 &&cd==2) ? 3 :cd, Comm >::val_t val_t
Definition: iterator.hh:574
const BNDFaceType * ghost_
current pointer to ghost face if iterator was started from ghost element
Definition: iterator.hh:270
#define alugrid_assert(EX)
Definition: alugrid_assert.hh:20
Definition: iterator.hh:98
int weight() const
return communication weight
Definition: iterator.hh:212
void increment()
prefix increment
Definition: iterator.cc:215
void buildLocalGeometries() const
Definition: iterator_imp.cc:412
bool conformingRefinement() const
return true if conforming refinement is enabled
Definition: faceutility.hh:138
~ALU3dGridLevelIterator()
Definition: iterator.cc:64
bool neighbor() const
return true if across the face an neighbor on leaf exists
Definition: iterator_imp.cc:271
LocalGeometry geometryInInside() const
Definition: iterator_imp.cc:286
void releaseEntity()
release entity
Definition: iterator.hh:595
int level() const
return level of iterator (level of item)
Definition: iterator_imp.cc:477
GitterType::Geometric::tetra_GEO GEOElementType
Definition: alu3dinclude.hh:271
bool boundary() const
return true if intersection is with boundary.
Definition: iterator_imp.cc:265
[ provides Dune::Grid ]
Definition: communication.hh:37
LocalGeometry geometryInOutside() const
Definition: iterator_imp.cc:316
GridImp::template Codim< 0 >::EntityPointerImpl EntityPointerImpl
Definition: iterator.hh:110
ALU3dGridLevelIntersectionIterator()
The default Constructor.
Definition: iterator_imp.cc:494
int level() const
ask for level of entities
Definition: entity.hh:524
void incrementIterator(const GridImp &grid, IteratorImp &it, int level)
Definition: iterator.hh:480
Dune::Intersection< GridImp, Dune::ALU3dGridIntersectionIterator< GridImp > > Intersection
type of the intersection
Definition: iterator.hh:114
LocalGeometryImpl intersectionSelfLocal_
Definition: iterator.hh:276
GeometryImpl intersectionGlobal_
Definition: iterator.hh:275
#define ALU3DSPACE
Definition: alu3dinclude.hh:24
GridImp::Traits::template Codim< 1 >::GeometryImpl GeometryImpl
Definition: iterator.hh:100
ALU3dGridHierarchicIterator(const HElementType &elem, int maxlevel, bool end)
the normal Constructor
Definition: iterator.cc:233
void increment()
increment iterator
Definition: iterator_imp.cc:582
int index_
Definition: iterator.hh:273
NormalType unitOuterNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:367
void done(const EntityType &en)
Definition: iterator.hh:220
ALU3dGridLeafIterator< cdim, pitype, GridImp > ThisType
Definition: iterator.hh:654
bool conforming() const
return true if intersection is conforming
Definition: iterator.hh:362
Twist twistInInside() const
returns twist of face compared to inner element
Definition: iterator_imp.cc:302
GitterImplType::Objects::Hbnd3Default BNDFaceType
Definition: alu3dinclude.hh:275
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition: iterator.hh:417
GridImp::template Codim< 0 >::Entity Entity
Definition: iterator.hh:775
const IMPLElementType * item_
current element from which we started the intersection iterator
Definition: iterator.hh:267
FieldVector< alu3d_ctype, dimworld > NormalType
Definition: iterator.hh:116
bool conforming() const
return true if intersection is conforming
Definition: iterator.hh:203
IntersectionIteratorType
Definition: iterator.hh:98
LocalGeometryImpl intersectionNeighborLocal_
Definition: iterator.hh:277
int indexInOutside() const
Definition: iterator_imp.cc:295
void setNewFace(const GEOFaceType &newFace)
Definition: iterator_imp.cc:455
IteratorType InternalIteratorType
Definition: iterator.hh:573
EntityPointerImpl outside() const
access neighbor
Definition: iterator_imp.cc:234
GeometryType type() const
obtain the type of reference element for this intersection
Definition: iterator_imp.cc:385
GridImp::template Codim< 1 >::Geometry Geometry
Definition: iterator.hh:108
FaceInfoType connector_
Definition: iterator.hh:263
void first(const EntityType &en, int wLevel, const bool conformingRefinement, const bool ghostCellsEnabled)
Definition: iterator_imp.cc:87
int boundaryId() const
return information about the Boundary
Definition: iterator_imp.cc:396
int outsideLevel() const
Definition: iterator.hh:200
Definition: alu3dinclude.hh:79
GridImp::template Codim< cd >::Entity Entity
type of Entity
Definition: entity.hh:658
Definition: iterator.hh:98
ALU3dGridLeafIterator()
default constructor
Definition: iterator.hh:657
int indexInInside() const
Definition: iterator_imp.cc:278
void done()
Definition: iterator_imp.cc:38
ALU3dGridLevelIterator< cd, pitype, GridImp > ThisType
typedef of my type
Definition: iterator.hh:570
void assign(const ThisType &org)
assignment of iterators
Definition: iterator_imp.cc:574
GitterImplType::Objects::Hbnd4Default BNDFaceType
Definition: alu3dinclude.hh:314
const GEOFaceType & getItem() const
return current face
Definition: iterator.hh:209
void invalidate()
Definition: iterator.hh:284
Provides proxy classes for IntersectionsIterators.