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 >
41 class ALU3dGridGeometricFaceInfo;
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,
90 enum { numVerticesPerFace =
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,
322 enum { numVerticesPerFace =
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>
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>
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>
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
696 template <
class Po
interType >
697 class GhostElementStorage< PointerType, MPI_Comm >
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 );
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"