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;
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,
88 enum { numVerticesPerFace =
89 GeometryInfoType::numVerticesPerFace };
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<0>::EntityImp
EntityImp;
110 typedef typename GridImp::template Codim<1>::Geometry
Geometry;
115 typedef Dune::Intersection< GridImp, Dune::ALU3dGridIntersectionIterator< GridImp > >
Intersection;
168 GeometryType
type ()
const;
218 return this->
getItem().weight();
224 template<
class EntityType >
void done (
const EntityType &en ) {
done(); }
227 void setFirstItem(
const HElementType & elem,
int wLevel);
231 const BNDFaceType& bnd,
int wLevel);
234 void first(
const EntityImp& en,
int wLevel,
const GridImp& grid );
241 void setGhostFace(
const GEOFaceType& newFace);
249 getFace (
const GEOTriangleBndType &bnd,
int index )
const;
253 getFace (
const GEOQuadBndType &bnd,
int index )
const;
257 getFace (
const GEOTetraElementType &elem,
int index )
const;
260 getFace (
const GEOHexaElementType &elem,
int index )
const;
293 template<
class Gr
idImp>
297 enum { dim = GridImp::dimension };
298 enum { dimworld = GridImp::dimensionworld };
300 typedef typename GridImp::MPICommunicatorType Comm;
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;
313 typedef typename std::conditional<
314 tetra == GridImp::elementType,
322 enum { numVerticesPerFace =
323 GeometryInfoType::numVerticesPerFace };
360 void first(
const EntityImp& en,
int wLevel,
const GridImp& grid );
378 void setNewFace(
const GEOFaceType& newFace);
381 void setFirstItem(
const HElementType & elem,
int wLevel);
384 void setInteriorItem(
const HElementType & elem,
385 const BNDFaceType& bnd,
int wLevel);
396 template <
class InternalIteratorType >
400 typedef typename InternalIteratorType :: val_t
val_t;
403 template <
class Gr
idImp,
int dim,
int codim>
407 template <
class ItemType>
408 static int getLevel(
const GridImp & grid,
const ItemType & item,
int level )
411 return (level < 0) ? item.level() : level;
416 template <
class Gr
idImp,
int dim>
420 template <
class ItemType>
421 static int getLevel(
const GridImp & grid,
const ItemType & item,
int level )
427 template <
class Gr
idImp,
int dim>
431 template <
class ItemType>
432 static int getLevel(
const GridImp & grid,
const ItemType & item,
int level)
434 return (level < 0) ? grid.getLevelOfLeafVertex(item) : level;
440 template <
class Gr
idImp,
class IteratorImp>
441 void firstItem(
const GridImp & grid, IteratorImp & it,
int level )
443 InternalIteratorType & iter = it.internalIterator();
445 ValidItem<IteratorImp::codimension, GridImp> validate;
446 while(!validate(grid,iter))
467 template <
class Gr
idImp,
class IteratorImp>
468 void setItem (
const GridImp & grid, IteratorImp & it, InternalIteratorType & iter,
int level)
470 enum { codim = IteratorImp :: codimension };
471 val_t & item = iter.item();
475 it.updateEntityPointer( item.first ,
479 it.updateGhostPointer( *item.second );
483 template <
class Gr
idImp,
class IteratorImp>
487 InternalIteratorType & iter = it.internalIterator();
488 ValidItem<IteratorImp::codimension, GridImp> validate;
498 }
while(!(validate(grid,iter) ) );
506 template <
int codim,
class Gr
idImp>
509 bool operator()(
const GridImp & grid, InternalIteratorType & iter)
511 if(GridImp::dimension ==3 || iter.done())
return true;
512 else if (GridImp::dimension == 2)
515 val_t & item = iter.item();
519 GEOElementType* elem =
static_cast<GEOElementType*
> (item.first);
525 else if( item.second )
532 template <
class Gr
idImp>
533 struct ValidItem<0, GridImp>
535 bool operator()(
const GridImp & grid, InternalIteratorType & iter)
550 template<
int cd, PartitionIteratorType pitype,
class Gr
idImp>
554 typename ALU3DSPACE IteratorElType< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, typename GridImp::MPICommunicatorType >::val_t > >
557 enum { dim = GridImp::dimension };
558 enum { dimworld = GridImp::dimensionworld };
560 typedef typename GridImp::MPICommunicatorType
Comm;
566 friend class ALU3dGrid< dim, dimworld, GridImp::elementType,
Comm >;
569 typename ALU3DSPACE IteratorSTI<
570 typename ALU3DSPACE IteratorElType< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, typename GridImp::MPICommunicatorType >::val_t >
615 const GridImp &grid ()
const {
alugrid_assert( grid_ );
return *grid_; }
618 const GridImp *grid_;
621 std::unique_ptr< IteratorType > iter_ ;
643 template<
int cdim, PartitionIteratorType pitype,
class Gr
idImp>
647 typename ALU3DSPACE IteratorElType< (GridImp::dimension == 2 && cdim == 2) ? 3 : cdim, typename GridImp::MPICommunicatorType >::val_t > >
649 enum { dim = GridImp :: dimension };
652 enum { codim = cdim };
654 typedef typename GridImp::MPICommunicatorType Comm;
659 typedef typename GridImp::template Codim<cdim>::Entity
Entity;
661 typedef typename ALU3DSPACE IteratorElType< (GridImp::dimension == 2 && cdim == 2) ? 3 : cdim, Comm >::
val_t val_t;
694 const GridImp &grid ()
const {
alugrid_assert( grid_ );
return *grid_; }
697 const GridImp *grid_;
700 std::unique_ptr< IteratorType > iter_;
718 template<
class Gr
idImp>
724 enum { dim = GridImp::dimension };
726 typedef typename GridImp::MPICommunicatorType Comm;
729 typedef typename ImplTraits::HElementType HElementType;
730 typedef typename ImplTraits::HBndSegType HBndSegType;
732 template <
class Po
interType,
class CommT >
733 class GhostElementStorage;
736 template <
class Po
interType >
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; }
754 template <
class Po
interType >
759 const HBndSegType * ghost_;
760 HBndSegType * nextGhost_;
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_ ) {}
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)
776 nextGhost_ = org.nextGhost_;
779 GhostElementStorage&
operator= (PointerType* p)
784 bool valid ()
const {
return (ghost_ != 0); }
788 typedef typename GridImp::template Codim<0>::Entity
Entity;
789 typedef typename GridImp::ctype
ctype;
793 int maxlevel,
bool end );
817 void assign(
const ThisType & org);
820 int getLevel(
const HElementType* item)
const;
823 int getLevel(
const HBndSegType* face)
const;
826 template <
class HItemType>
827 HItemType* goNextElement (
const HItemType* startElem, HItemType * oldEl);
830 const HElementType * elem_;
833 GhostElementStorage< HBndSegType, Comm > ghostElem_;
842 #if COMPILE_ALUGRID_INLINE
#define ALU3DSPACE
Definition: alu3dinclude.hh:7
#define alugrid_assert(EX)
Definition: alugrid_assert.hh:20
Provides proxy classes for IntersectionsIterators.
Definition: alu3dinclude.hh:63
@ tetra
Definition: topology.hh:12
Definition: alu3dinclude.hh:242
Definition: alu3dinclude.hh:328
[ provides Dune::Grid ]
Definition: 3d/grid.hh:429
Definition: iterator.hh:556
ALU3DSPACE IteratorElType<(GridImp::dimension==2 &&cd==2) ? 3 :cd, Comm >::val_t val_t
Definition: iterator.hh:584
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()
Definition: iterator.cc:70
ALU3DSPACE IteratorSTI< val_t > IteratorType
Definition: iterator.hh:585
ALU3dGridLevelIterator()
default constructor
Definition: iterator.hh:589
IteratorType InternalIteratorType
Definition: iterator.hh:586
Definition: entity.hh:620
GridImp::MPICommunicatorType Comm
Definition: entity.hh:627
GridImp::template Codim< cd >::Entity Entity
type of Entity
Definition: entity.hh:649
Definition: iterator.hh:722
GridImp::ctype ctype
Definition: iterator.hh:789
void releaseEntity()
release entity
Definition: iterator.hh:810
GridImp::template Codim< 0 >::Entity Entity
Definition: iterator.hh:788
ALU3dGridHierarchicIterator()
the default Constructor
Definition: iterator.cc:241
ThisType & operator=(const ThisType &org)
the assignment operator
Definition: iterator.cc:312
void increment()
increment
Definition: iterator.cc:393
Definition: iterator.hh:56
GridImp::template Codim< 0 >::Entity Entity
Definition: iterator.hh:107
ALU3dGridIntersectionIterator< GridImp > ImplementationType
Definition: iterator.hh:113
int indexInOutside() const
Definition: iterator_imp.cc:298
LocalGeometryImpl intersectionNeighborLocal_
Definition: iterator.hh:281
NormalType integrationOuterNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:329
int outsideLevel() const
Definition: iterator.hh:204
NormalType unitOuterNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:366
size_t boundarySegmentIndex() const
return the boundary segment index
Definition: iterator_imp.cc:400
void setInteriorItem(const HElementType &elem, const BNDFaceType &bnd, int wLevel)
Definition: iterator_imp.cc:66
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:392
int level() const
return level of iterator (level of item)
Definition: iterator_imp.cc:483
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:410
const BNDFaceType * ghost_
current pointer to ghost face if iterator was started from ghost element
Definition: iterator.hh:271
void done(const EntityType &en)
Definition: iterator.hh:224
GridImp::template Codim< 1 >::Geometry Geometry
Definition: iterator.hh:110
GridImp::Traits::template Codim< 1 >::LocalGeometryImpl LocalGeometryImpl
Definition: iterator.hh:101
int index_
Definition: iterator.hh:277
unsigned int refCount_
Definition: iterator.hh:290
NormalType outerNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:337
void increment()
increment iterator
Definition: iterator_imp.cc:181
void setFirstItem(const HElementType &elem, int wLevel)
Definition: iterator_imp.cc:49
GeometryImpl intersectionGlobal_
Definition: iterator.hh:279
GeometryInfoType geoProvider_
Definition: iterator.hh:265
void done()
Definition: iterator_imp.cc:38
LocalGeometry geometryInOutside() const
Definition: iterator_imp.cc:319
IntersectionIteratorType
Definition: iterator.hh:98
@ IntersectionLeaf
Definition: iterator.hh:98
@ IntersectionLevel
Definition: iterator.hh:98
@ IntersectionBoth
Definition: iterator.hh:98
Geometry geometry() const
Definition: iterator_imp.cc:375
GridImp::template Codim< 1 >::LocalGeometry LocalGeometry
Definition: iterator.hh:111
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
void first(const EntityImp &en, int wLevel, const GridImp &grid)
Definition: iterator_imp.cc:87
void invalidate()
Definition: iterator.hh:288
int innerLevel_
Definition: iterator.hh:276
const ALU3dImplTraits< tetra, Comm >::GEOFaceType * getFace(const GEOTriangleBndType &bnd, int index) const
Definition: iterator_imp.cc:428
GridImp::template Codim< 0 >::EntityImp EntityImp
Definition: iterator.hh:108
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:384
FieldVector< alu3d_ctype, dimworld > NormalType
Definition: iterator.hh:117
void assign(const ALU3dGridIntersectionIterator< GridImp > &org)
assignment of iterators
Definition: iterator_imp.cc:145
NormalType unitOuterNormal_
Definition: iterator.hh:284
Twists::Twist Twist
Definition: iterator.hh:105
LocalGeometryImpl intersectionSelfLocal_
Definition: iterator.hh:280
GridImp::Traits::template Codim< 1 >::GeometryImpl GeometryImpl
Definition: iterator.hh:100
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
void buildLocalGeometries() const
Definition: iterator_imp.cc:418
int indexInInside() const
Definition: iterator_imp.cc:281
void setNewFace(const GEOFaceType &newFace)
Definition: iterator_imp.cc:461
Leaf iterator.
Definition: iterator.hh:648
ALU3dGridLeafIterator< cdim, pitype, GridImp > ThisType
Definition: iterator.hh:667
GridImp::template Codim< cdim >::Entity Entity
Definition: iterator.hh:659
ALU3DSPACE IteratorSTI< val_t > IteratorType
Definition: iterator.hh:662
void increment()
prefix increment
Definition: iterator.cc:222
IteratorType InternalIteratorType
Definition: iterator.hh:665
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
ALU3DSPACE IteratorElType<(GridImp::dimension==2 &&cdim==2) ? 3 :cdim, Comm >::val_t val_t
Definition: iterator.hh:661
int level() const
ask for level of entities
Definition: entity.hh:515
int outsideLevel() const
Definition: faceutility_imp.cc:359
@ CONFORMING
Definition: faceutility.hh:49
bool conformingRefinement() const
return true if conforming refinement is enabled
Definition: faceutility.hh:139
const GEOFaceType & face() const
Returns the ALU3dGrid face.
Definition: faceutility_imp.cc:322
ConformanceState conformanceState() const
Description of conformance on the face.
Definition: faceutility_imp.cc:440
Definition: faceutility.hh:323
Definition: faceutility.hh:367
Definition: iterator.hh:296
void increment()
increment iterator
Definition: iterator_imp.cc:591
ALU3dGridLevelIntersectionIterator()
The default Constructor.
Definition: iterator_imp.cc:501
bool neighbor() const
return true if across the edge an neighbor on this level exists
Definition: iterator_imp.cc:616
void first(const EntityImp &en, int wLevel, const GridImp &grid)
Definition: iterator_imp.cc:510
void assign(const ThisType &org)
assignment of iterators
Definition: iterator_imp.cc:583
bool conforming() const
return true if intersection is conforming
Definition: iterator.hh:366
Definition: iterator.hh:40
Definition: iterator.hh:398
void incrementIterator(const GridImp &grid, IteratorImp &it, int level)
Definition: iterator.hh:484
InternalIteratorType ::val_t val_t
Definition: iterator.hh:400
void firstItem(const GridImp &grid, IteratorImp &it, int level)
Definition: iterator.hh:441
void setItem(const GridImp &grid, IteratorImp &it, InternalIteratorType &iter, int level)
Definition: iterator.hh:468
Definition: iterator.hh:405
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition: iterator.hh:408
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition: iterator.hh:421
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition: iterator.hh:432
Definition: topology.hh:15
Definition: topology.hh:40
Definition: topology.hh:151
type of class for specialization of serial ALUGrid (No_Comm as communicator)
Definition: declaration.hh:31
type of class for specialization of parallel ALUGrid (MPI_Comm as communicator)
Definition: declaration.hh:43
Class that wraps IntersectionIteratorImp of a grid and gets it's internal object from a object stack ...
Definition: intersectioniteratorwrapper.hh:23