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 template <
class EntityType>
235 void first(
const EntityType & en,
int wLevel,
const GridImp& grid );
242 void setGhostFace(
const GEOFaceType& newFace);
250 getFace (
const GEOTriangleBndType &bnd,
int index )
const;
254 getFace (
const GEOQuadBndType &bnd,
int index )
const;
258 getFace (
const GEOTetraElementType &elem,
int index )
const;
261 getFace (
const GEOHexaElementType &elem,
int index )
const;
294 template<
class Gr
idImp>
298 enum { dim = GridImp::dimension };
299 enum { dimworld = GridImp::dimensionworld };
301 typedef typename GridImp::MPICommunicatorType Comm;
305 typedef typename ImplTraits::HElementType HElementType ;
306 typedef typename ImplTraits::GEOElementType GEOElementType;
307 typedef typename ImplTraits::IMPLElementType IMPLElementType;
308 typedef typename ImplTraits::GEOFaceType GEOFaceType;
309 typedef typename ImplTraits::NeighbourPairType NeighbourPairType;
310 typedef typename ImplTraits::BNDFaceType BNDFaceType;
314 typedef typename std::conditional<
315 tetra == GridImp::elementType,
323 enum { numVerticesPerFace =
324 GeometryInfoType::numVerticesPerFace };
359 template <
class EntityType>
360 void first(
const EntityType & 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>
553 public ALU3dGridTreeIterator< ALU3DSPACE ALU3dGridLevelIteratorWrapper< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, pitype, typename GridImp::MPICommunicatorType > >
555 enum { dim = GridImp::dimension };
556 enum { dimworld = GridImp::dimensionworld };
558 typedef typename GridImp::MPICommunicatorType
Comm;
564 friend class ALU3dGrid< dim, dimworld, GridImp::elementType,
Comm >;
566 friend class
ALU3dGridTreeIterator< ALU3DSPACE ALU3dGridLevelIteratorWrapper< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, pitype, Comm > >;
576 typedef typename
ALU3DSPACE ALU3dGridLevelIteratorWrapper< (GridImp::dimension == 2 && cd == 2) ? 3 : cd, pitype, Comm >
IteratorType;
607 const GridImp &grid ()
const {
alugrid_assert( grid_ );
return *grid_; }
610 const GridImp *grid_;
613 std::unique_ptr< IteratorType > iter_ ;
635 template<
int cdim, PartitionIteratorType pitype,
class Gr
idImp>
638 public ALU3dGridTreeIterator< ALU3DSPACE ALU3dGridLeafIteratorWrapper< (GridImp::dimension == 2 && cdim == 2) ? 3 : cdim, pitype, typename GridImp::MPICommunicatorType > >
640 enum { dim = GridImp :: dimension };
643 enum { codim = cdim };
645 typedef typename GridImp::MPICommunicatorType Comm;
650 typedef typename GridImp::template Codim<cdim>::Entity
Entity;
652 typedef typename ALU3DSPACE ALU3dGridLeafIteratorWrapper< (GridImp::dimension == 2 && cdim == 2) ? 3 : cdim, pitype, Comm >
IteratorType ;
656 typedef typename ALU3DSPACE IteratorElType< (GridImp::dimension == 2 && cdim == 2) ? 3 : cdim, Comm >::
val_t val_t;
685 const GridImp &grid ()
const {
alugrid_assert( grid_ );
return *grid_; }
688 const GridImp *grid_;
691 std::unique_ptr< IteratorType > iter_;
709 template<
class Gr
idImp>
715 enum { dim = GridImp::dimension };
717 typedef typename GridImp::MPICommunicatorType Comm;
720 typedef typename ImplTraits::HElementType HElementType;
721 typedef typename ImplTraits::HBndSegType HBndSegType;
723 template <
class Po
interType,
class CommT >
724 class GhostElementStorage;
727 template <
class Po
interType >
731 GhostElementStorage() {}
732 explicit GhostElementStorage(
const PointerType& ) {}
733 PointerType& operator * () { PointerType* p = 0;
alugrid_assert (
false ); abort();
return *p; }
734 const PointerType* ghost ()
const {
return 0; }
735 PointerType* nextGhost ()
const {
return 0; }
736 PointerType* operator -> ()
const {
return 0; }
737 bool operator != (
const PointerType* )
const {
return false; }
738 bool operator ! ()
const {
return true ; }
739 GhostElementStorage&
operator= (
const GhostElementStorage& ) {
return *
this; }
740 GhostElementStorage&
operator= (
const PointerType* ) {
return *
this; }
741 bool valid ()
const {
return false; }
745 template <
class Po
interType >
750 const HBndSegType * ghost_;
751 HBndSegType * nextGhost_;
753 GhostElementStorage() : ghost_( 0 ), nextGhost_( 0 ) {}
754 explicit GhostElementStorage(
const PointerType& gh ) : ghost_( &gh ), nextGhost_( 0 ) {}
755 GhostElementStorage(
const GhostElementStorage& org )
756 : ghost_( org.ghost_ ), nextGhost_( org.nextGhost_ ) {}
758 PointerType& operator * () {
alugrid_assert ( nextGhost_ );
return *nextGhost_; }
759 const PointerType* ghost ()
const {
return ghost_; }
760 PointerType* nextGhost ()
const {
return nextGhost_; }
761 PointerType* operator -> () {
return nextGhost_; }
762 bool operator != (
const PointerType* p )
const {
return (nextGhost_ != p); }
763 bool operator ! ()
const {
return nextGhost_ == 0; }
764 GhostElementStorage&
operator= (
const GhostElementStorage& org)
767 nextGhost_ = org.nextGhost_;
770 GhostElementStorage&
operator= (PointerType* p)
775 bool valid ()
const {
return (ghost_ != 0); }
779 typedef typename GridImp::template Codim<0>::Entity
Entity;
780 typedef typename GridImp::ctype
ctype;
784 int maxlevel,
bool end );
805 void assign(
const ThisType & org);
808 int getLevel(
const HElementType* item)
const;
811 int getLevel(
const HBndSegType* face)
const;
814 template <
class HItemType>
815 HItemType* goNextElement (
const HItemType* startElem, HItemType * oldEl);
818 const HElementType * elem_;
821 GhostElementStorage< HBndSegType, Comm > ghostElem_;
#define ALU3DSPACE
Definition: alu3dinclude.hh:24
#define alugrid_assert(EX)
Definition: alugrid_assert.hh:20
Provides proxy classes for IntersectionsIterators.
Definition: alu3dinclude.hh:80
@ tetra
Definition: topology.hh:12
Definition: alu3dinclude.hh:259
Definition: alu3dinclude.hh:345
[ provides Dune::Grid ]
Definition: alugrid/3d/grid.hh:463
Definition: iterator.hh:554
ALU3DSPACE IteratorElType<(GridImp::dimension==2 &&cd==2) ? 3 :cd, Comm >::val_t val_t
Definition: iterator.hh:578
void increment()
prefix increment
Definition: iterator.cc:112
ALU3DSPACE ALU3dGridLevelIteratorWrapper<(GridImp::dimension==2 &&cd==2) ? 3 :cd, pitype, Comm > IteratorType
Definition: iterator.hh:576
void releaseEntity()
release entity
Definition: iterator.hh:599
ThisType & operator=(const ThisType &org)
assignment of iterators
Definition: iterator.cc:104
ALU3dGridLevelIterator< cd, pitype, GridImp > ThisType
typedef of my type
Definition: iterator.hh:574
~ALU3dGridLevelIterator()
Definition: iterator.cc:65
ALU3dGridLevelIterator()
default constructor
Definition: iterator.hh:581
IteratorType InternalIteratorType
Definition: iterator.hh:577
Definition: entity.hh:629
GridImp::MPICommunicatorType Comm
Definition: entity.hh:636
GridImp::template Codim< cd >::Entity Entity
type of Entity
Definition: entity.hh:658
Definition: iterator.hh:713
ALU3dGridHierarchicIterator(const HElementType &elem, int maxlevel, bool end)
the normal Constructor
Definition: iterator.cc:235
GridImp::ctype ctype
Definition: iterator.hh:780
void releaseEntity()
release entity
Definition: iterator.hh:798
GridImp::template Codim< 0 >::Entity Entity
Definition: iterator.hh:779
ThisType & operator=(const ThisType &org)
the assignment operator
Definition: iterator.cc:295
void increment()
increment
Definition: iterator.cc:376
Definition: iterator.hh:56
void increment()
increment iterator
Definition: iterator_imp.cc:182
GridImp::template Codim< 0 >::Entity Entity
Definition: iterator.hh:107
ALU3dGridIntersectionIterator< GridImp > ImplementationType
Definition: iterator.hh:113
void first(const EntityType &en, int wLevel, const GridImp &grid)
Definition: iterator_imp.cc:88
LocalGeometry geometryInInside() const
Definition: iterator_imp.cc:290
LocalGeometryImpl intersectionNeighborLocal_
Definition: iterator.hh:282
NormalType outerNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:338
int outsideLevel() const
Definition: iterator.hh:204
const GEOFaceType & getItem() const
return current face
Definition: iterator.hh:213
int boundaryId() const
return information about the Boundary
Definition: iterator_imp.cc:396
int indexInInside() const
Definition: iterator_imp.cc:282
void done()
Definition: iterator_imp.cc:38
void setInteriorItem(const HElementType &elem, const BNDFaceType &bnd, int wLevel)
Definition: iterator_imp.cc:66
const BNDFaceType * ghost_
current pointer to ghost face if iterator was started from ghost element
Definition: iterator.hh:272
void done(const EntityType &en)
Definition: iterator.hh:224
GridImp::template Codim< 1 >::Geometry Geometry
Definition: iterator.hh:110
const ALU3dImplTraits< tetra, Comm >::GEOFaceType * getFace(const GEOTriangleBndType &bnd, int index) const
Definition: iterator_imp.cc:432
GridImp::Traits::template Codim< 1 >::LocalGeometryImpl LocalGeometryImpl
Definition: iterator.hh:101
EntityImp inside() const
access entity where iteration started
Definition: iterator_imp.cc:255
Geometry geometry() const
Definition: iterator_imp.cc:376
int index_
Definition: iterator.hh:278
int segmentId() const
return the segment id (non-consecutive)
Definition: iterator_imp.cc:414
unsigned int refCount_
Definition: iterator.hh:291
void setFirstItem(const HElementType &elem, int wLevel)
Definition: iterator_imp.cc:49
GeometryImpl intersectionGlobal_
Definition: iterator.hh:280
GeometryInfoType geoProvider_
Definition: iterator.hh:266
IntersectionIteratorType
Definition: iterator.hh:98
@ IntersectionLeaf
Definition: iterator.hh:98
@ IntersectionLevel
Definition: iterator.hh:98
@ IntersectionBoth
Definition: iterator.hh:98
NormalType integrationOuterNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:330
int level() const
return level of iterator (level of item)
Definition: iterator_imp.cc:487
GridImp::template Codim< 1 >::LocalGeometry LocalGeometry
Definition: iterator.hh:111
EntityImp outside() const
access neighbor
Definition: iterator_imp.cc:238
bool boundary() const
return true if intersection is with boundary.
Definition: iterator_imp.cc:269
const GridImp * grid_
pointer to grid implementation
Definition: iterator.hh:275
Twist twistInInside() const
returns twist of face compared to inner element
Definition: iterator_imp.cc:306
Twist twistInOutside() const
returns twist of face compared to outer element
Definition: iterator_imp.cc:313
NormalType unitOuterNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition: iterator_imp.cc:367
LocalGeometry geometryInOutside() const
Definition: iterator_imp.cc:320
void invalidate()
Definition: iterator.hh:289
int innerLevel_
Definition: iterator.hh:277
GridImp::template Codim< 0 >::EntityImp EntityImp
Definition: iterator.hh:108
bool equals(const ALU3dGridIntersectionIterator< GridImp > &i) const
The copy constructor.
Definition: iterator_imp.cc:172
FaceInfoType connector_
Definition: iterator.hh:265
void buildLocalGeometries() const
Definition: iterator_imp.cc:422
void setNewFace(const GEOFaceType &newFace)
Definition: iterator_imp.cc:465
FieldVector< alu3d_ctype, dimworld > NormalType
Definition: iterator.hh:117
NormalType unitOuterNormal_
Definition: iterator.hh:285
Twists::Twist Twist
Definition: iterator.hh:105
void assign(const ALU3dGridIntersectionIterator< GridImp > &org)
assignment of iterators
Definition: iterator_imp.cc:146
LocalGeometryImpl intersectionSelfLocal_
Definition: iterator.hh:281
bool neighbor() const
return true if across the face an neighbor on leaf exists
Definition: iterator_imp.cc:275
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:269
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
GeometryType type() const
obtain the type of reference element for this intersection
Definition: iterator_imp.cc:385
size_t boundarySegmentIndex() const
return the boundary segment index
Definition: iterator_imp.cc:404
ALU3dGridIntersectionIterator(const bool levelIntersectionIterator=false)
The default Constructor.
Definition: iterator_imp.cc:26
int indexInOutside() const
Definition: iterator_imp.cc:299
Leaf iterator.
Definition: iterator.hh:639
ALU3dGridLeafIterator< cdim, pitype, GridImp > ThisType
Definition: iterator.hh:658
GridImp::template Codim< cdim >::Entity Entity
Definition: iterator.hh:650
void increment()
prefix increment
Definition: iterator.cc:216
IteratorType InternalIteratorType
Definition: iterator.hh:655
void releaseEntity()
release entity
Definition: iterator.hh:679
ThisType & operator=(const ThisType &org)
assignment of iterators
Definition: iterator.cc:179
ALU3dGridLeafIterator()
default constructor
Definition: iterator.hh:661
ALU3DSPACE ALU3dGridLeafIteratorWrapper<(GridImp::dimension==2 &&cdim==2) ? 3 :cdim, pitype, Comm > IteratorType
Definition: iterator.hh:652
~ALU3dGridLeafIterator()
destructor deleting real iterator
Definition: iterator.cc:163
ALU3DSPACE IteratorElType<(GridImp::dimension==2 &&cdim==2) ? 3 :cdim, Comm >::val_t val_t
Definition: iterator.hh:656
int level() const
ask for level of entities
Definition: entity.hh:524
int outsideLevel() const
Definition: faceutility_imp.cc:358
@ 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:321
ConformanceState conformanceState() const
Description of conformance on the face.
Definition: faceutility_imp.cc:439
Definition: faceutility.hh:323
Definition: faceutility.hh:367
Definition: iterator.hh:297
void assign(const ThisType &org)
assignment of iterators
Definition: iterator_imp.cc:588
void first(const EntityType &en, int wLevel, const GridImp &grid)
Definition: iterator_imp.cc:515
ALU3dGridLevelIntersectionIterator()
The default Constructor.
Definition: iterator_imp.cc:505
bool conforming() const
return true if intersection is conforming
Definition: iterator.hh:366
void increment()
increment iterator
Definition: iterator_imp.cc:596
bool neighbor() const
return true if across the edge an neighbor on this level exists
Definition: iterator_imp.cc:621
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:39
Class that wraps IntersectionIteratorImp of a grid and gets it's internal object from a object stack ...
Definition: intersectioniteratorwrapper.hh:26