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 >
53template<
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<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;
289template<
class Gr
idImp>
293 enum { dim = GridImp::dimension };
294 enum { dimworld = GridImp::dimensionworld };
296 typedef typename GridImp::MPICommunicatorType Comm;
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;
309 typedef typename std::conditional<
310 tetra == GridImp::elementType,
318 enum { numVerticesPerFace =
319 GeometryInfoType::numVerticesPerFace };
353 template <
class EntityType>
354 void first(
const EntityType & en,
int wLevel,
355 const bool conformingRefinement,
356 const bool ghostCellsEnabled );
369 BaseType :: conforming() : true ;
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);
392template <
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)
546template<
int cd, PartitionIteratorType pitype,
class Gr
idImp>
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;
560 friend class ALU3dGrid< dim, dimworld, GridImp::elementType, 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_ ;
631template<
int cdim, PartitionIteratorType pitype,
class Gr
idImp>
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_;
705template<
class Gr
idImp>
711 enum { dim = GridImp::dimension };
713 typedef typename GridImp::MPICommunicatorType Comm;
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 >
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 >
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_;
Provides proxy classes for IntersectionsIterators.
#define alugrid_assert(EX)
Definition alugrid_assert.hh:20
#define ALU3DSPACE
Definition alu3dinclude.hh:24
Definition alu3dinclude.hh:80
@ tetra
Definition topology.hh:12
Definition alu3dinclude.hh:259
Definition alu3dinclude.hh:345
[ provides Dune::Grid ]
Definition 3d/grid.hh:468
Definition iterator.hh:550
void increment()
prefix increment
Definition iterator.cc:112
ALU3DSPACE ALU3dGridLevelIteratorWrapper<(GridImp::dimension==2 &&cd==2) ? 3 :cd, pitype, Comm > IteratorType
Definition iterator.hh:572
void releaseEntity()
release entity
Definition iterator.hh:595
GridImp::template Codim< cd >::Entity Entity
Definition iterator.hh:566
ALU3dGridVertexList< Comm > VertexListType
Definition iterator.hh:567
ThisType & operator=(const ThisType &org)
assignment of iterators
Definition iterator.cc:104
ALU3dGridLevelIterator< cd, pitype, GridImp > ThisType
typedef of my type
Definition iterator.hh:570
~ALU3dGridLevelIterator()
Definition iterator.cc:65
ALU3dGridLevelIterator()
default constructor
Definition iterator.hh:577
ALU3DSPACE IteratorElType<(GridImp::dimension==2 &&cd==2)?3:cd, Comm >::val_t val_t
Definition iterator.hh:574
IteratorType InternalIteratorType
Definition iterator.hh:573
Definition iterator.hh:709
GridImp::ctype ctype
Definition iterator.hh:776
void releaseEntity()
release entity
Definition iterator.hh:794
GridImp::template Codim< 0 >::Entity Entity
Definition iterator.hh:775
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:179
GridImp::template Codim< 0 >::Entity Entity
Definition iterator.hh:107
ALU3dGridIntersectionIterator< GridImp > ImplementationType
Definition iterator.hh:112
LocalGeometry geometryInInside() const
Definition iterator_imp.cc:287
LocalGeometryImpl intersectionNeighborLocal_
Definition iterator.hh:277
NormalType outerNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition iterator_imp.cc:335
int outsideLevel() const
Definition iterator.hh:200
int boundaryId() const
return information about the Boundary
Definition iterator_imp.cc:397
int indexInInside() const
Definition iterator_imp.cc:279
void done()
Definition iterator_imp.cc:39
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:270
void done(const EntityType &en)
Definition iterator.hh:220
GridImp::template Codim< 1 >::Geometry Geometry
Definition iterator.hh:108
Geometry geometry() const
Definition iterator_imp.cc:377
int index_
Definition iterator.hh:273
const GEOFaceType & getItem() const
return current face
Definition iterator.hh:209
unsigned int refCount_
Definition iterator.hh:286
void setFirstItem(const HElementType &elem, int wLevel)
Definition iterator_imp.cc:49
GeometryImpl intersectionGlobal_
Definition iterator.hh:275
GeometryInfoType geoProvider_
Definition iterator.hh:264
EntityPointerImpl inside() const
access entity where iteration started
Definition iterator_imp.cc:252
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:327
int level() const
return level of iterator (level of item)
Definition iterator_imp.cc:478
GridImp::template Codim< 1 >::LocalGeometry LocalGeometry
Definition iterator.hh:109
bool boundary() const
return true if intersection is with boundary.
Definition iterator_imp.cc:266
Twist twistInInside() const
returns twist of face compared to inner element
Definition iterator_imp.cc:303
Twist twistInOutside() const
returns twist of face compared to outer element
Definition iterator_imp.cc:310
NormalType unitOuterNormal(const FieldVector< alu3d_ctype, dim-1 > &local) const
Definition iterator_imp.cc:368
LocalGeometry geometryInOutside() const
Definition iterator_imp.cc:317
void invalidate()
Definition iterator.hh:284
int innerLevel_
Definition iterator.hh:272
bool equals(const ALU3dGridIntersectionIterator< GridImp > &i) const
The copy constructor.
Definition iterator_imp.cc:169
FaceInfoType connector_
Definition iterator.hh:263
EntityPointerImpl outside() const
access neighbor
Definition iterator_imp.cc:235
void buildLocalGeometries() const
Definition iterator_imp.cc:413
GridImp::template Codim< 0 >::EntityPointerImpl EntityPointerImpl
Definition iterator.hh:110
ALUTwists<(dim==3) ? GridImp::elementType==tetra ? 3 :4 :2, dim-1 > Twists
Definition iterator.hh:104
void setNewFace(const GEOFaceType &newFace)
Definition iterator_imp.cc:456
FieldVector< alu3d_ctype, dimworld > NormalType
Definition iterator.hh:116
const ALU3dImplTraits< tetra, Comm >::GEOFaceType * getFace(const GEOTriangleBndType &bnd, int index) const
Definition iterator_imp.cc:423
NormalType unitOuterNormal_
Definition iterator.hh:280
Twists::Twist Twist
Definition iterator.hh:105
void assign(const ALU3dGridIntersectionIterator< GridImp > &org)
assignment of iterators
Definition iterator_imp.cc:144
GridImp::Traits::template Codim< 1 >::LocalGeometryImpl LocalGeometryImpl
Definition iterator.hh:101
LocalGeometryImpl intersectionSelfLocal_
Definition iterator.hh:276
bool neighbor() const
return true if across the face an neighbor on leaf exists
Definition iterator_imp.cc:272
const IMPLElementType * item_
current element from which we started the intersection iterator
Definition iterator.hh:267
bool conforming() const
return true if intersection is conforming
Definition iterator.hh:203
int weight() const
return communication weight
Definition iterator.hh:212
GridImp::Traits::template Codim< 1 >::GeometryImpl GeometryImpl
Definition iterator.hh:100
Dune::Intersection< GridImp, Dune::ALU3dGridIntersectionIterator< GridImp > > Intersection
type of the intersection
Definition iterator.hh:114
GeometryType type() const
obtain the type of reference element for this intersection
Definition iterator_imp.cc:386
size_t boundarySegmentIndex() const
return the boundary segment index
Definition iterator_imp.cc:405
void first(const EntityType &en, int wLevel, const bool conformingRefinement, const bool ghostCellsEnabled)
Definition iterator_imp.cc:88
int indexInOutside() const
Definition iterator_imp.cc:296
Leaf iterator.
Definition iterator.hh:635
ALU3dGridLeafIterator< cdim, pitype, GridImp > ThisType
Definition iterator.hh:654
GridImp::template Codim< cdim >::Entity Entity
Definition iterator.hh:646
void increment()
prefix increment
Definition iterator.cc:216
ALU3DSPACE IteratorElType<(GridImp::dimension==2 &&cdim==2)?3:cdim, Comm >::val_t val_t
Definition iterator.hh:652
IteratorType InternalIteratorType
Definition iterator.hh:651
void releaseEntity()
release entity
Definition iterator.hh:675
ThisType & operator=(const ThisType &org)
assignment of iterators
Definition iterator.cc:179
ALU3dGridLeafIterator()
default constructor
Definition iterator.hh:657
ALU3DSPACE ALU3dGridLeafIteratorWrapper<(GridImp::dimension==2 &&cdim==2) ? 3 :cdim, pitype, Comm > IteratorType
Definition iterator.hh:648
~ALU3dGridLeafIterator()
destructor deleting real iterator
Definition iterator.cc:163
int level() const
ask for level of entities
Definition entity.hh:524
int outsideLevel() const
Definition faceutility_imp.cc:357
@ CONFORMING
Definition faceutility.hh:48
bool conformingRefinement() const
return true if conforming refinement is enabled
Definition faceutility.hh:138
const GEOFaceType & face() const
Returns the ALU3dGrid face.
Definition faceutility_imp.cc:320
ConformanceState conformanceState() const
Description of conformance on the face.
Definition faceutility_imp.cc:438
Definition faceutility.hh:326
Definition faceutility.hh:370
Definition iterator.hh:292
void first(const EntityType &en, int wLevel, const bool conformingRefinement, const bool ghostCellsEnabled)
Definition iterator_imp.cc:506
void assign(const ThisType &org)
assignment of iterators
Definition iterator_imp.cc:576
ALU3dGridLevelIntersectionIterator()
The default Constructor.
Definition iterator_imp.cc:496
bool conforming() const
return true if intersection is conforming
Definition iterator.hh:362
void increment()
increment iterator
Definition iterator_imp.cc:584
bool neighbor() const
return true if across the edge an neighbor on this level exists
Definition iterator_imp.cc:609
Definition iterator.hh:40
Definition iterator.hh:394
void incrementIterator(const GridImp &grid, IteratorImp &it, int level)
Definition iterator.hh:480
void firstItem(const GridImp &grid, IteratorImp &it, int level)
Definition iterator.hh:437
void setItem(const GridImp &grid, IteratorImp &it, InternalIteratorType &iter, int level)
Definition iterator.hh:464
InternalIteratorType::val_t val_t
Definition iterator.hh:396
Definition iterator.hh:401
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition iterator.hh:404
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition iterator.hh:417
static int getLevel(const GridImp &grid, const ItemType &item, int level)
Definition iterator.hh:428
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