4 #ifndef DUNE_ALU3DGRIDITERATOR_HH
5 #define DUNE_ALU3DGRIDITERATOR_HH
22 template<
int cd,
int dim,
class Gr
idImp>
23 class ALU3dGridEntity;
24 template<
int cd, PartitionIteratorType pitype,
class Gr
idImp >
25 class ALU3dGridLevelIterator;
26 template<
int cd,
class Gr
idImp >
27 class ALU3dGridEntityPointer;
28 template<
int mydim,
int coorddim,
class Gr
idImp>
29 class ALU3dGridGeometry;
30 template<
class Gr
idImp>
31 class ALU3dGridHierarchicIterator;
32 template<
class Gr
idImp>
33 class ALU3dGridIntersectionIterator;
34 template<
int codim, PartitionIteratorType pitype,
class Gr
idImp>
35 class ALU3dGridLeafIterator;
36 template< ALU3dGr
idElementType,
class >
38 template< ALU3dGr
idElementType,
class >
39 class ALU3dGridFaceInfo;
40 template< ALU3dGr
idElementType,
class >
54 template<
class Gr
idImp>
58 enum { dim = GridImp::dimension };
59 enum { dimworld = GridImp::dimensionworld };
61 typedef typename GridImp::MPICommunicatorType Comm;
63 typedef ALU3dImplTraits< GridImp::elementType, Comm > ImplTraits;
65 typedef typename ImplTraits::HElementType HElementType ;
66 typedef typename ImplTraits::HBndSegType HBndSegType;
67 typedef typename ImplTraits::GEOElementType GEOElementType;
68 typedef typename ImplTraits::IMPLElementType IMPLElementType;
69 typedef typename ImplTraits::GEOFaceType GEOFaceType;
70 typedef typename ImplTraits::NeighbourPairType NeighbourPairType;
71 typedef typename ImplTraits::BNDFaceType BNDFaceType;
79 typedef typename std::auto_ptr< FaceInfoType > FaceInfoPointer;
81 typedef typename conditional<
82 tetra == GridImp::elementType,
83 ALU3dGridGeometricFaceInfoTetra< Comm >,
84 ALU3dGridGeometricFaceInfoHexa< Comm > >
::type GeometryInfoType;
86 typedef ElementTopologyMapping<GridImp::elementType> ElementTopo;
87 typedef FaceTopologyMapping<GridImp::elementType> FaceTopo;
89 enum { numFaces = EntityCount<GridImp::elementType>::numFaces };
90 enum { numVerticesPerFace =
91 EntityCount<GridImp::elementType>::numVerticesPerFace };
92 enum { numVertices = EntityCount<GridImp::elementType>::numVertices };
94 typedef ALU3dGridIntersectionIterator<GridImp> ThisType;
102 typedef typename GridImp::Traits::template Codim< 1 >::GeometryImpl
GeometryImpl;
108 typedef typename GridImp::template Codim<0>::Entity
Entity;
109 typedef typename GridImp::template Codim<1>::Geometry
Geometry;
125 int wLevel,
bool end=
false);
228 template<
class EntityType >
void done (
const EntityType &en ) {
done(); }
231 void setFirstItem(
const HElementType & elem,
int wLevel);
235 const BNDFaceType& bnd,
int wLevel);
238 template <
class EntityType>
239 void first(
const EntityType & en,
int wLevel);
246 void setGhostFace(
const GEOFaceType& newFace);
254 getFace (
const GEOTriangleBndType &bnd,
int index )
const;
258 getFace (
const GEOQuadBndType &bnd,
int index )
const;
262 getFace (
const GEOTetraElementType &elem,
int index )
const;
265 getFace (
const GEOHexaElementType &elem,
int index )
const;
292 template<
class Gr
idImp>
296 enum { dim = GridImp::dimension };
297 enum { dimworld = GridImp::dimensionworld };
299 typedef typename GridImp::MPICommunicatorType Comm;
301 typedef ALU3dImplTraits< GridImp::elementType, Comm > ImplTraits;
303 typedef typename ImplTraits::HElementType HElementType ;
304 typedef typename ImplTraits::GEOElementType GEOElementType;
305 typedef typename ImplTraits::IMPLElementType IMPLElementType;
306 typedef typename ImplTraits::GEOFaceType GEOFaceType;
307 typedef typename ImplTraits::NeighbourPairType NeighbourPairType;
308 typedef typename ImplTraits::BNDFaceType BNDFaceType;
311 typedef typename std::auto_ptr< FaceInfoType > FaceInfoPointer;
313 typedef typename conditional<
314 tetra == GridImp::elementType,
315 ALU3dGridGeometricFaceInfoTetra< Comm >,
316 ALU3dGridGeometricFaceInfoHexa< Comm > >
::type GeometryInfoType;
318 typedef ElementTopologyMapping<GridImp::elementType> ElementTopo;
319 typedef FaceTopologyMapping<GridImp::elementType> FaceTopo;
321 enum { numFaces = EntityCount<GridImp::elementType>::numFaces };
322 enum { numVerticesPerFace =
323 EntityCount<GridImp::elementType>::numVerticesPerFace };
324 enum { numVertices = EntityCount<GridImp::elementType>::numVertices };
326 typedef ALU3dGridIntersectionIterator<GridImp> BaseType;
327 typedef ALU3dGridLevelIntersectionIterator<GridImp> ThisType;
353 int wLevel,
bool end=
false);
367 template <
class EntityType>
368 void first(
const EntityType & en,
int wLevel);
385 void setNewFace(
const GEOFaceType& newFace);
388 void setFirstItem(
const HElementType & elem,
int wLevel);
391 void setInteriorItem(
const HElementType & elem,
392 const BNDFaceType& bnd,
int wLevel);
403 template <
class InternalIteratorType >
407 typedef typename InternalIteratorType :: val_t
val_t;
410 template <
class Gr
idImp,
int codim>
414 template <
class ItemType>
415 static int getLevel(
const GridImp & grid,
const ItemType & item,
int level )
418 return (level < 0) ? item.level() : level;
423 template <
class Gr
idImp>
427 template <
class ItemType>
428 static int getLevel(
const GridImp & grid,
const ItemType & item,
int level )
434 template <
class Gr
idImp>
438 template <
class ItemType>
439 static int getLevel(
const GridImp & grid,
const ItemType & item,
int level)
441 return (level < 0) ? grid.getLevelOfLeafVertex(item) : level;
447 template <
class Gr
idImp,
class IteratorImp>
448 void firstItem(
const GridImp & grid, IteratorImp & it,
int level )
450 InternalIteratorType & iter = it.internalIterator();
454 assert( iter.size() > 0 );
464 template <
class Gr
idImp,
class IteratorImp>
465 void setItem (
const GridImp & grid, IteratorImp & it, InternalIteratorType & iter,
int level)
467 enum { codim = IteratorImp :: codimension };
468 val_t & item = iter.item();
469 assert( item.first || item.second );
472 it.updateEntityPointer( item.first ,
473 GetLevel<GridImp,codim>::getLevel(grid, *(item.first) , level) );
476 it.updateGhostPointer( *item.second );
480 template <
class Gr
idImp,
class IteratorImp>
484 InternalIteratorType & iter = it.internalIterator();
506 template<
int cd, PartitionIteratorType pitype,
class Gr
idImp>
507 class ALU3dGridLevelIterator
508 :
public ALU3dGridEntityPointer< cd, GridImp >,
509 public ALU3dGridTreeIterator< ALU3DSPACE ALU3dGridLevelIteratorWrapper< cd, pitype, typename GridImp::MPICommunicatorType > >
511 enum { dim = GridImp::dimension };
512 enum { dimworld = GridImp::dimensionworld };
514 typedef typename GridImp::MPICommunicatorType Comm;
587 template<
int cdim, PartitionIteratorType pitype,
class Gr
idImp>
588 class ALU3dGridLeafIterator
589 :
public ALU3dGridEntityPointer< cdim, GridImp >,
590 public ALU3dGridTreeIterator< ALU3DSPACE ALU3dGridLeafIteratorWrapper< cdim, pitype, typename GridImp::MPICommunicatorType > >
592 enum { dim = GridImp :: dimension };
595 enum { codim = cdim };
597 typedef typename GridImp::MPICommunicatorType Comm;
602 typedef typename GridImp::template Codim<cdim>::Entity
Entity;
659 template<
class Gr
idImp>
660 class ALU3dGridHierarchicIterator
661 :
public ALU3dGridEntityPointer<0,GridImp>
664 typedef ALU3dGridHierarchicIterator<GridImp> ThisType;
665 enum { dim = GridImp::dimension };
667 typedef typename GridImp::MPICommunicatorType Comm;
669 typedef ALU3dImplTraits< GridImp::elementType, Comm > ImplTraits;
670 typedef typename ImplTraits::HElementType HElementType;
671 typedef typename ImplTraits::HBndSegType HBndSegType;
673 template <
class Po
interType,
class CommT >
674 class GhostElementStorage;
677 template <
class Po
interType >
678 class GhostElementStorage< PointerType, No_Comm >
681 GhostElementStorage() {}
682 explicit GhostElementStorage(
const PointerType& ) {}
683 PointerType& operator * () { PointerType* p = 0; assert(
false ); abort();
return *p; }
684 const PointerType* ghost ()
const {
return 0; }
685 PointerType* nextGhost ()
const {
return 0; }
686 PointerType* operator -> ()
const {
return 0; }
687 bool operator != (
const PointerType* )
const {
return false; }
688 bool operator ! ()
const {
return true ; }
689 GhostElementStorage&
operator= (
const GhostElementStorage& ) {
return *
this; }
690 GhostElementStorage&
operator= (
const PointerType* ) {
return *
this; }
691 bool valid ()
const {
return false; }
694 #if ALU3DGRID_PARALLEL
695 template <
class Po
interType >
697 class GhostElementStorage< PointerType, MPI_Comm >
701 const HBndSegType * ghost_;
702 HBndSegType * nextGhost_;
704 GhostElementStorage() : ghost_( 0 ), nextGhost_( 0 ) {}
705 explicit GhostElementStorage(
const PointerType& gh ) : ghost_( &gh ), nextGhost_( 0 ) {}
706 GhostElementStorage(
const GhostElementStorage& org )
707 : ghost_( org.ghost_ ), nextGhost_( org.nextGhost_ ) {}
709 PointerType& operator * () { assert( nextGhost_ );
return *nextGhost_; }
710 const PointerType* ghost ()
const {
return ghost_; }
711 PointerType* nextGhost ()
const {
return nextGhost_; }
712 PointerType* operator -> () {
return nextGhost_; }
713 bool operator != (
const PointerType* p )
const {
return (nextGhost_ != p); }
714 bool operator ! ()
const {
return nextGhost_ == 0; }
715 GhostElementStorage&
operator= (
const GhostElementStorage& org)
718 nextGhost_ = org.nextGhost_;
721 GhostElementStorage&
operator= (PointerType* p)
726 bool valid ()
const {
return (ghost_ != 0); }
733 typedef typename GridImp::template Codim<0>::Entity
Entity;
734 typedef typename GridImp::ctype
ctype;
738 const HElementType & elem,
739 int maxlevel,
bool end );
743 const HBndSegType& ghost,
764 void assign(
const ThisType & org);
767 int getLevel(
const HElementType* item)
const;
770 int getLevel(
const HBndSegType* face)
const;
773 template <
class HItemType>
774 HItemType* goNextElement (
const HItemType* startElem, HItemType * oldEl);
777 const HElementType * elem_;
780 GhostElementStorage< HBndSegType, Comm > ghostElem_;
789 #include "iterator_imp.cc"
Entity & dereference() const
dereference Entity, faster then the entity pointersmethod
Definition: iterator.cc:459
GridImp::GridObjectFactoryType FactoryType
Definition: alugrid/3d/iterator.hh:731
int indexInInside() const
Definition: alugrid/3d/grid.hh:68
GridImp::Traits::template Codim< 1 >::GeometryImpl GeometryImpl
Definition: alugrid/3d/iterator.hh:102
ThisType & operator=(const ThisType &org)
assignment of iterators
Definition: iterator.cc:200
GitterType::Geometric::hexa_GEO GEOElementType
Definition: alu3dinclude.hh:260
ALU3dGridHierarchicIterator(const FactoryType &factory, const HElementType &elem, int maxlevel, bool end)
the normal Constructor
Definition: iterator.cc:275
EntityPointer inside() const
access entity where iteration started
void increment()
prefix increment
Definition: iterator.cc:238
LocalGeometry geometryInInside() const
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition: alugrid/3d/iterator.hh:428
ALU3DSPACE ALU3dGridLeafIteratorWrapper< cdim, pitype, Comm > IteratorType
Definition: alugrid/3d/iterator.hh:604
int boundaryId() const
return information about the Boundary
GridImp::template Codim< cd >::Entity Entity
type of Entity
Definition: alugrid/3d/entity.hh:712
ThisType & operator=(const ThisType &org)
assignment of iterators
Definition: iterator.cc:103
Definition: alugrid/3d/entity.hh:32
void increment()
prefix increment
Definition: iterator.cc:111
GridImp::template Codim< 1 >::Geometry Geometry
Definition: alugrid/3d/iterator.hh:109
InternalIteratorType::val_t val_t
Definition: alugrid/3d/iterator.hh:407
ALU3dGridIntersectionIterator< GridImp > ImplementationType
Definition: alugrid/3d/iterator.hh:112
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:178
void setFirstItem(const HElementType &elem, int wLevel)
GridImp::template Codim< cdim >::Entity Entity
Definition: alugrid/3d/iterator.hh:602
[ provides Dune::Grid ]
Definition: alugrid/3d/entity.hh:36
void first(const EntityType &en, int wLevel)
void increment()
increment
Definition: iterator.cc:428
int twistInOutside() const
returns twist of face compared to outer element
void assign(const ALU3dGridIntersectionIterator< GridImp > &org)
assignment of iterators
const GEOFaceType & getItem() const
return current face
Definition: alugrid/3d/iterator.hh:223
void increment()
increment iterator
Entity & dereference() const
dereference Entity, faster then the entity pointersmethod
Definition: iterator.cc:119
void releaseEntity()
release entity
Definition: alugrid/3d/iterator.hh:556
const FactoryType & factory_
Definition: alugrid/3d/iterator.hh:273
FaceInfoType connector_
Definition: alugrid/3d/iterator.hh:269
Definition: topology.hh:13
int twistInSelf() const
returns twist of face compared to inner element
Definition: alugrid/3d/iterator.hh:188
bool boundary() const
return true if intersection is with boundary.
GitterImplType::Objects::Hbnd4Default BNDFaceType
Definition: alu3dinclude.hh:264
int level() const
return level of iterator (level of item)
Class that wraps IntersectionIteratorImp of a grid and gets it's internal object from a object stack ...
Definition: intersectioniteratorwrapper.hh:18
void releaseEntity()
release entity
Definition: alugrid/3d/iterator.hh:757
int level() const
ask for level of entities
Definition: alugrid/3d/entity.hh:26
ALUMemoryProvider< ThisType > StorageType
Definition: alugrid/3d/iterator.hh:119
const GEOFaceType & face() const
Returns the ALU3dGrid face.
GeometryImpl intersectionNeighborLocal_
Definition: alugrid/3d/iterator.hh:286
#define ALU3DSPACE
Definition: alu3dinclude.hh:26
NormalType unitOuterNormal_
Definition: alugrid/3d/iterator.hh:289
GridImp::GridObjectFactoryType FactoryType
Definition: alugrid/3d/entity.hh:613
ALU3dGridEntityPointer< 0, GridImp > EntityPointer
Definition: alugrid/3d/iterator.hh:117
GeometryInfoType geoProvider_
Definition: alugrid/3d/iterator.hh:270
void incrementIterator(const GridImp &grid, IteratorImp &it, int level)
Definition: alugrid/3d/iterator.hh:481
GridImp::Traits::template Codim< 1 >::LocalGeometryImpl LocalGeometryImpl
Definition: alugrid/3d/iterator.hh:103
int twistInInside() const
returns twist of face compared to inner element
Definition: alugrid/3d/iterator.hh:100
void increment()
increment iterator
void assign(const ThisType &org)
assignment of iterators
GitterImplType::Objects::Hbnd3Default BNDFaceType
Definition: alu3dinclude.hh:217
void setItem(const GridImp &grid, IteratorImp &it, InternalIteratorType &iter, int level)
Definition: alugrid/3d/iterator.hh:465
ConformanceState conformanceState() const
Description of conformance on the face.
GridImp::GridObjectFactoryType FactoryType
Definition: alugrid/3d/iterator.hh:345
const ALU3dImplTraits< tetra, Comm >::GEOFaceType * getFace(const GEOTriangleBndType &bnd, int index) const
Definition: alu3dinclude.hh:201
void setInteriorItem(const HElementType &elem, const BNDFaceType &bnd, int wLevel)
ALU3dGridIntersectionIterator(const FactoryType &factory, HElementType *el, int wLevel, bool end=false)
IteratorType InternalIteratorType
Definition: alugrid/3d/iterator.hh:607
bool neighbor() const
return true if across the face an neighbor on leaf exists
GridImp::GridObjectFactoryType FactoryType
Definition: alugrid/3d/entity.hh:706
ALU3DSPACE ALU3dGridLevelIteratorWrapper< cd, pitype, Comm > IteratorType
Definition: alugrid/3d/iterator.hh:533
bool conforming() const
return true if intersection is conforming
Definition: alugrid/3d/iterator.hh:374
ALUMemoryProvider< ThisType > StorageType
Definition: alugrid/3d/iterator.hh:347
Entity & dereference() const
dereference Entity, faster then the entity pointersmethod
Definition: iterator.cc:247
GeometryImpl intersectionSelfLocal_
Definition: alugrid/3d/iterator.hh:285
int innerLevel_
Definition: alugrid/3d/iterator.hh:281
Definition: alugrid/3d/iterator.hh:100
GridImp::template Codim< 1 >::LocalGeometry LocalGeometry
Definition: alugrid/3d/iterator.hh:110
GeometryImpl intersectionGlobal_
Definition: alugrid/3d/iterator.hh:284
void first(const EntityType &en, int wLevel)
ALU3dGridLevelIntersectionIterator(const FactoryType &factory, HElementType *el, int wLevel, bool end=false)
size_t boundarySegmentIndex() const
return the boundary segment index
bool neighbor() const
return true if across the edge an neighbor on this level exists
Leaf iterator.
Definition: alugrid/3d/entity.hh:34
const BNDFaceType * ghost_
current pointer to ghost face if iterator was started from ghost element
Definition: alugrid/3d/iterator.hh:279
void buildLocalGeometries() const
GridImp::template Codim< 0 >::Entity Entity
Definition: alugrid/3d/iterator.hh:108
int twistInNeighbor() const
returns twist of face compared to outer element
Definition: alugrid/3d/iterator.hh:191
void done(const EntityType &en)
Definition: alugrid/3d/iterator.hh:228
Geometry geometry() const
ALU3dGridLeafIterator(const FactoryType &factory, int level)
Constructor for end iterators.
Definition: iterator.cc:143
NormalType & unitOuterNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Provides proxy classes for IntersectionsIterators.
organize the memory management for entitys used by the NeighborIterator
Definition: alugrid/2d/grid.hh:69
Definition: alu3dinclude.hh:296
Definition: alugrid/3d/entity.hh:24
void releaseEntity()
release entity
Definition: alugrid/3d/iterator.hh:631
IntersectionIteratorType
Definition: alugrid/3d/iterator.hh:100
Intersection of a mesh entities of codimension 0 ("elements") with a "neighboring" element or with th...
Definition: albertagrid/dgfparser.hh:26
GeometryType type() const
obtain the type of reference element for this intersection
GitterType::Geometric::tetra_GEO GEOElementType
Definition: alu3dinclude.hh:213
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition: alugrid/3d/iterator.hh:415
GridImp::MPICommunicatorType Comm
Definition: alugrid/3d/entity.hh:686
int index_
Definition: alugrid/3d/iterator.hh:282
Different resources needed by all grid implementations.
const IMPLElementType * item_
current element from which we started the intersection iterator
Definition: alugrid/3d/iterator.hh:276
int outsideLevel() const
Definition: alugrid/3d/iterator.hh:214
Dune::Intersection< GridImp, Dune::ALU3dGridIntersectionIterator< GridImp > > Intersection
type of the intersection
Definition: alugrid/3d/iterator.hh:114
bool equals(const ALU3dGridIntersectionIterator< GridImp > &i) const
The copy constructor.
GridImp::GridObjectFactoryType FactoryType
Definition: alugrid/3d/iterator.hh:600
LocalGeometry geometryInOutside() const
int indexInOutside() const
void firstItem(const GridImp &grid, IteratorImp &it, int level)
Definition: alugrid/3d/iterator.hh:448
FieldVector< alu3d_ctype, dimworld > NormalType
Definition: alugrid/3d/iterator.hh:116
ALU3DSPACE IteratorElType< cd, Comm >::val_t val_t
Definition: alugrid/3d/iterator.hh:535
~ALU3dGridLeafIterator()
destructor deleting real iterator
Definition: iterator.cc:180
Definition: alugrid/3d/entity.hh:22
GridImp::ctype ctype
Definition: alugrid/3d/iterator.hh:734
ALU3dGridLevelIterator< cd, pitype, GridImp > ThisType
typedef of my type
Definition: alugrid/3d/iterator.hh:531
Definition: faceutility.hh:48
Definition: alugrid/3d/iterator.hh:411
EntityPointer outside() const
access neighbor
NormalType & outerNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
ALU3DSPACE IteratorElType< cdim, Comm >::val_t val_t
Definition: alugrid/3d/iterator.hh:608
Definition: alugrid/3d/entity.hh:583
bool conformingRefinement() const
return true if conforming refinement is enabled
Definition: faceutility.hh:140
NormalType & integrationOuterNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
ALU3dGridLeafIterator< cdim, pitype, GridImp > ThisType
Definition: alugrid/3d/iterator.hh:610
IteratorType InternalIteratorType
Definition: alugrid/3d/iterator.hh:534
void setNewFace(const GEOFaceType &newFace)
GridImp::template Codim< cd >::Entity Entity
type of Entity
Definition: alugrid/3d/entity.hh:619
ThisType & operator=(const ThisType &org)
the assignment operator
Definition: iterator.cc:347
GridImp::template Codim< 0 >::Entity Entity
Definition: alugrid/3d/iterator.hh:733
Definition: alugrid/3d/iterator.hh:100
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition: alugrid/3d/iterator.hh:439
GridImp::GridObjectFactoryType FactoryType
Definition: alugrid/3d/iterator.hh:106
bool conforming() const
return true if intersection is conforming
Definition: alugrid/3d/iterator.hh:217
Definition: alugrid/3d/iterator.hh:404
Definition: alugrid/3d/iterator.hh:41