3 #ifndef DUNE_GEOGRID_ENTITY_HH 4 #define DUNE_GEOGRID_ENTITY_HH 6 #include <dune/geometry/referenceelements.hh> 31 template< int codim, class Grid, bool fake = !(Capabilities::hasHostEntity< Grid, codim >::v) >
46 template<
int codim,
int dim,
class Gr
id >
54 template<
class Gr
id >
57 template<
class Gr
id,
class HostIntersectionIterator >
72 template<
int codim,
class Gr
id >
75 typedef typename std::remove_const< Grid >::type::Traits Traits;
81 static const int codimension = codim;
84 static const int dimension = Traits::dimension;
86 static const int mydimension = dimension - codimension;
88 static const int dimensionworld = Traits::dimensionworld;
91 static const bool fake =
false;
98 typedef typename Traits::ctype
ctype;
102 typedef typename Traits::template Codim< codimension >::Geometry
Geometry;
106 typedef typename Traits::HostGrid HostGrid;
107 typedef typename Traits::CoordFunction CoordFunction;
113 typedef typename HostGrid::template Codim< codimension >::Entity
HostEntity;
117 typedef typename Traits::template Codim< codimension >::EntitySeed
EntitySeed;
120 typedef typename HostGrid::template Codim< 0 >::Entity
HostElement;
123 typedef typename Traits::template Codim< codim >::GeometryImpl
GeometryImpl;
126 typedef typename HostGrid::template Codim< codimension >::Geometry HostGeometry;
141 : hostEntity_( grid.hostGrid().entity( grid.getRealImplementation(seed).hostEntitySeed() ) )
146 : hostEntity_( hostElement.template subEntity<codim>(i) )
151 EntityBase (
const GeometryImpl &geo,
const HostEntity &hostEntity )
152 : hostEntity_( hostEntity )
153 , grid_( &geo.grid() )
157 EntityBase (
const GeometryImpl &geo, HostEntity&& hostEntity )
158 : hostEntity_(
std::move( hostEntity ) )
159 , grid_( &geo.grid() )
164 : hostEntity_( hostEntity )
169 : hostEntity_(
std::move( hostEntity ) )
175 : hostEntity_( other.hostEntity_ )
176 , grid_( other.grid_ )
181 : hostEntity_(
std::move( other.hostEntity_ ) )
182 , grid_( other.grid_ )
183 , geo_(
std::move( other.geo_ ) )
190 hostEntity_ = other.hostEntity_;
198 hostEntity_ = std::move( other.hostEntity_ );
199 grid_ = std::move( other.grid_ );
200 geo_ = std::move( other.geo_ );
207 return hostEntity_ == other.hostEntity_;
220 return hostEntity().type();
226 return hostEntity().level();
232 return hostEntity().partitionType();
253 CoordVector coords( hostEntity(), grid().coordFunction() );
254 geo_ = GeometryImpl( grid(), type(), coords );
256 return Geometry( geo_ );
261 return hostEntity().subEntities( cc );
272 const Grid &
grid ()
const { assert( grid_ );
return *grid_; }
284 void initialize (
const HostEntity &hostEntity ) { hostEntity_ = hostEntity; }
293 template<
class HostIndexSet >
294 typename HostIndexSet::IndexType
295 index (
const HostIndexSet &indexSet )
const 297 return indexSet.template index< codimension >( hostEntity() );
309 template<
class HostIndexSet >
310 typename HostIndexSet::IndexType
311 subIndex (
const HostIndexSet &indexSet,
int i,
unsigned int cd )
const 313 return indexSet.subIndex( hostEntity(), i, cd );
323 template<
class HostIndexSet >
326 return indexSet.contains( hostEntity() );
336 template<
class HostIdSet >
337 typename HostIdSet::IdType
id (
const HostIdSet &idSet )
const 339 return idSet.template id< codimension >( hostEntity() );
344 HostEntity hostEntity_;
346 mutable GeometryImpl geo_;
361 template<
int codim,
class Gr
id >
364 typedef typename std::remove_const< Grid >::type::Traits Traits;
370 static const int codimension = codim;
373 static const int dimension = Traits::dimension;
375 static const int mydimension = dimension - codimension;
377 static const int dimensionworld = Traits::dimensionworld;
380 static const bool fake =
true;
386 typedef typename Traits::ctype
ctype;
390 typedef typename Traits::template Codim< codimension >::Geometry
Geometry;
394 typedef typename Traits::HostGrid HostGrid;
395 typedef typename Traits::CoordFunction CoordFunction;
401 typedef typename HostGrid::template Codim< codimension >::Entity
HostEntity;
405 typedef typename Traits::template Codim< codimension >::EntitySeed
EntitySeed;
408 typedef typename HostGrid::template Codim< 0 >::Entity
HostElement;
411 typedef typename Traits::template Codim< codimension >::GeometryImpl
GeometryImpl;
414 typedef typename HostGrid::template Codim< 0 >::Geometry HostGeometry;
429 EntityBase(
const Grid& grid,
const HostElement& hostElement,
unsigned int subEntity)
430 : hostElement_(hostElement)
431 , subEntity_(subEntity)
436 : hostElement_( grid.hostGrid().entity( grid.getRealImplementation(seed).hostElementSeed() ) )
437 , subEntity_( grid.getRealImplementation(seed).subEntity() )
442 : hostElement_( other.hostElement_ )
443 , subEntity_( other.subEntity_ )
449 : hostElement_(
std::move( other.hostElement_ ) )
450 , subEntity_(
std::move( other.subEntity_ ) )
451 , grid_(
std::move( other.grid_ ) )
452 , geo_(
std::move( other.geo_ ) )
462 DUNE_THROW(Dune::Exception,
"GeometryGrid: Cannot create fake entity of codim " << codimension <<
" from real host entity.");
469 hostElement_ = other.hostElement_;
470 subEntity_ = other.subEntity_;
478 hostElement_ = std::move( other.hostElement_ );
479 subEntity_ = std::move( other.subEntity_ );
480 grid_ = std::move( other.grid_ );
481 geo_ = std::move( other.geo_ );
488 const bool thisEnd = (subEntity() < 0);
489 const bool otherEnd = (other.subEntity() < 0);
490 if( thisEnd || otherEnd )
491 return thisEnd && otherEnd;
493 const int lvl = level();
494 if( lvl != other.level() )
497 const typename Traits::HostGrid::Traits::LevelIndexSet &indexSet
498 = grid().hostGrid().levelIndexSet( lvl );
500 const HostElement &thisElement = hostElement();
501 assert( indexSet.contains( thisElement ) );
502 const HostElement &otherElement = other.hostElement();
503 assert( indexSet.contains( otherElement ) );
505 const int thisIndex = indexSet.subIndex( thisElement, subEntity(), codimension );
506 const int otherIndex = indexSet.subIndex( otherElement, other.subEntity(), codimension );
507 return (thisIndex == otherIndex);
519 const ReferenceElement< ctype, dimension > &refElement
520 = ReferenceElements< ctype, dimension >::general( hostElement().type() );
521 return refElement.type( subEntity_, codimension );
527 return hostElement().level();
533 const ReferenceElement< ctype, dimension > &refElement
534 = ReferenceElements< ctype, dimension >::general( hostElement().type() );
540 const int numVertices = refElement.size( subEntity_, codimension, dimension );
541 for(
int i = 1; i < numVertices; ++i )
543 PartitionType vtxType = vertexPartitionType( refElement, i );
546 if( type != vtxType )
571 CoordVector coords( hostElement(), subEntity_, grid().coordFunction() );
572 geo_ = GeometryImpl( grid(), type(), coords );
574 return Geometry( geo_ );
579 const ReferenceElement< ctype, dimension > &refElement
580 = ReferenceElements< ctype, dimension >::general( hostElement().type() );
581 return refElement.size( subEntity_, codimension, cc );
591 const Grid &
grid ()
const { assert( grid_ );
return *grid_; }
595 DUNE_THROW( NotImplemented,
"HostGrid has no entities of codimension " << codimension <<
"." );
612 void initialize (
const HostElement &hostElement ) { hostElement_ = hostElement; }
621 template<
class HostIndexSet >
622 typename HostIndexSet::IndexType
index (
const HostIndexSet &indexSet )
const 624 return indexSet.subIndex( hostElement(), subEntity_, codimension );
636 template<
class HostIndexSet >
637 typename HostIndexSet::IndexType
638 subIndex (
const HostIndexSet &indexSet,
int i,
unsigned int cd )
const 640 const ReferenceElement< ctype, dimension > &refElement
641 = ReferenceElements< ctype, dimension >::general( hostElement().type() );
642 const int j = refElement.subEntity( subEntity_, codimension, i, codimension+cd );
643 return indexSet.subIndex( hostElement(), j, codimension+cd );
653 template<
class HostIndexSet >
656 return indexSet.contains( hostElement() );
666 template<
class HostIdSet >
667 typename HostIdSet::IdType
id (
const HostIdSet &idSet )
const 669 return idSet.subId( hostElement(), subEntity_, codimension );
675 vertexPartitionType (
const ReferenceElement< ctype, dimension > &refElement,
int i )
const 677 const int j = refElement.subEntity( subEntity_, codimension, i, dimension );
678 return hostElement().template subEntity< dimension >( j ).partitionType();
682 HostElement hostElement_;
683 unsigned int subEntity_;
685 mutable GeometryImpl geo_;
693 template<
int codim,
int dim,
class Gr
id >
707 Entity (
const Grid &grid,
const EntitySeed &seed ) : Base( grid, seed ) {}
709 Entity (
const Grid &grid,
const HostEntity &hostEntity ) : Base( grid, hostEntity ) {}
710 Entity (
const Grid &grid, HostEntity&& hostEntity ) : Base( grid,
std::move( hostEntity ) ) {}
712 Entity (
const Grid &grid,
const HostElement &hostEntity,
int i ) : Base( grid, hostEntity, i ) {}
721 template<
int dim,
class Gr
id >
727 typedef typename std::remove_const< Grid >::type::Traits Traits;
729 typedef typename Traits::HostGrid HostGrid;
735 static const int codimension = Base::codimension;
738 static const int dimension = Base::dimension;
740 static const int mydimension = Base::mydimension;
742 static const int dimensionworld = Base::dimensionworld;
745 static const bool fake = Base::fake;
751 typedef typename Traits::template Codim< codimension >::LocalGeometry
LocalGeometry;
771 using Base::hostEntity;
775 Entity (
const Grid &grid,
const HostEntity &hostEntity ) : Base( grid, hostEntity ) {}
776 Entity (
const Grid &grid, HostEntity&& hostEntity ) : Base( grid,
std::move( hostEntity ) ) {}
777 Entity (
const GeometryImpl &geo,
const HostEntity& hostEntity ) : Base( geo, hostEntity ) {}
778 Entity (
const GeometryImpl &geo, HostEntity &&hostEntity ) : Base( geo,
std::move( hostEntity ) ) {}
780 Entity (
const Grid &grid,
const EntitySeed &seed ) : Base( grid, seed ) {}
782 Entity (
const Grid &grid,
const HostEntity &hostEntity,
int i ) : Base( grid, hostEntity )
787 template<
int codim >
788 typename Grid::template Codim< codim >::Entity
791 typedef typename Traits::template Codim< codim >::EntityImpl EntityImpl;
792 return EntityImpl( grid(), hostEntity(), i );
798 return LevelIntersectionIteratorImpl( *
this, hostEntity().ilevelbegin() );
804 return LevelIntersectionIteratorImpl( *
this, hostEntity().ilevelend() );
810 return LeafIntersectionIteratorImpl( *
this, hostEntity().ileafbegin() );
816 return LeafIntersectionIteratorImpl( *
this, hostEntity().ileafend() );
821 return hostEntity().hasBoundaryIntersections();
826 return hostEntity().isLeaf();
831 return Entity( grid(), hostEntity().father() );
836 return hostEntity().hasFather();
841 return hostEntity().geometryInFather();
844 HierarchicIterator
hbegin (
int maxLevel )
const 847 return HierarchicIteratorImpl( grid(), hostEntity().hbegin( maxLevel ) );
850 HierarchicIterator
hend (
int maxLevel )
const 853 return HierarchicIteratorImpl( grid(), hostEntity().hend( maxLevel ) );
858 return hostEntity().isRegular();
863 return hostEntity().isNew();
868 return hostEntity().mightVanish();
876 #endif // #ifndef DUNE_GEOGRID_ENTITY_HH EntityBase(const Grid &grid, const EntitySeed &seed)
Definition: geometrygrid/entity.hh:435
bool mightVanish() const
Definition: geometrygrid/entity.hh:866
Definition: cornerstorage.hh:20
all entities lying in the overlap zone
Definition: gridenums.hh:31
unsigned int subEntities(unsigned int cc) const
Definition: geometrygrid/entity.hh:577
HostGrid::template Codim< codimension >::Entity HostEntity
type of corresponding host entity
Definition: geometrygrid/entity.hh:114
Traits::template Codim< codimension >::LocalGeometry LocalGeometry
type of corresponding local geometry
Definition: geometrygrid/entity.hh:752
HierarchicIterator hbegin(int maxLevel) const
Definition: geometrygrid/entity.hh:844
DUNE-conform implementation of the entityThis class merely changes the template parameters of the ent...
Definition: geometrygrid/entity.hh:47
LeafIntersectionIterator ileafend() const
Definition: geometrygrid/entity.hh:813
Traits::template Codim< codim >::GeometryImpl GeometryImpl
Definition: geometrygrid/entity.hh:123
Base::EntitySeed EntitySeed
Definition: geometrygrid/entity.hh:703
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:178
Entity(const GeometryImpl &geo, HostEntity &&hostEntity)
Definition: geometrygrid/entity.hh:778
EntitySeed seed() const
return EntitySeed of host grid entity
Definition: geometrygrid/entity.hh:585
unsigned int subEntities(unsigned int cc) const
Definition: geometrygrid/entity.hh:259
Traits::LevelIntersectionIterator LevelIntersectionIterator
type of level intersection iterator
Definition: geometrygrid/entity.hh:761
Entity(const Grid &grid, const HostElement &hostEntity, int i)
Definition: geometrygrid/entity.hh:712
PartitionType
Attributes used in the generic overlap model.
Definition: gridenums.hh:28
EntityBase(const EntityBase &other)
Definition: geometrygrid/entity.hh:441
PartitionType partitionType() const
obtain the partition type of this entity
Definition: geometrygrid/entity.hh:230
Definition: geometrygrid/entity.hh:58
Dune::Entity< 0, dim, Grid, Dune::GeoGrid::Entity > EntityFacade
Definition: geometrygrid/entity.hh:754
int level() const
obtain the level of this entity
Definition: geometrygrid/entity.hh:224
HostGrid::template Codim< codimension >::Entity HostEntity
type of corresponding host entity
Definition: geometrygrid/entity.hh:402
Base::HostElement HostElement
Definition: geometrygrid/entity.hh:766
const Grid & grid() const
Definition: geometrygrid/entity.hh:272
Entity(const GeometryImpl &geo, const HostEntity &hostEntity)
Definition: geometrygrid/entity.hh:777
LocalGeometry geometryInFather() const
Definition: geometrygrid/entity.hh:839
EntityBase(const Grid &grid, const HostElement &hostElement, unsigned int subEntity)
Definition: geometrygrid/entity.hh:429
EntityBase()
Definition: geometrygrid/entity.hh:422
on boundary between interior and overlap
Definition: gridenums.hh:30
EntityBase(const Grid &grid, const HostEntity &hostEntity)
Definition: geometrygrid/entity.hh:163
Traits::HierarchicIterator HierarchicIterator
type of hierarchic iterator
Definition: geometrygrid/entity.hh:757
Traits::template Codim< codimension >::Geometry Geometry
type of corresponding geometry
Definition: geometrygrid/entity.hh:102
Base::HostEntity HostEntity
Definition: geometrygrid/entity.hh:765
LevelIntersectionIterator ilevelbegin() const
Definition: geometrygrid/entity.hh:795
bool hasBoundaryIntersections() const
Definition: geometrygrid/entity.hh:819
bool isContained(const HostIndexSet &indexSet) const
check whether the entity is contained in a host index set
Definition: geometrygrid/entity.hh:654
Base::HostEntity HostEntity
Definition: geometrygrid/entity.hh:700
EntityBase(EntityBase &&other)
Definition: geometrygrid/entity.hh:448
HierarchicIterator hend(int maxLevel) const
Definition: geometrygrid/entity.hh:850
EntityBase(const GeometryImpl &geo, HostEntity &&hostEntity)
Definition: geometrygrid/entity.hh:157
Entity()
Definition: geometrygrid/entity.hh:773
HostIdSet::IdType id(const HostIdSet &idSet) const
obtain the entity's id from a host IdSet
Definition: geometrygrid/entity.hh:667
bool isContained(const HostIndexSet &indexSet) const
check whether the entity is contained in a host index set
Definition: geometrygrid/entity.hh:324
Traits::ctype ctype
coordinate type of the grid
Definition: geometrygrid/entity.hh:387
Base::GeometryImpl GeometryImpl
Definition: geometrygrid/entity.hh:702
int subEntity() const
Definition: geometrygrid/entity.hh:603
Traits::template Codim< codimension >::Geometry Geometry
type of corresponding geometry
Definition: geometrygrid/entity.hh:390
on boundary between overlap and ghost
Definition: gridenums.hh:32
HostIndexSet::IndexType subIndex(const HostIndexSet &indexSet, int i, unsigned int cd) const
obtain the index of a subentity from a host IndexSet
Definition: geometrygrid/entity.hh:638
Entity()
Definition: geometrygrid/entity.hh:705
HostIndexSet::IndexType index(const HostIndexSet &indexSet) const
obtain the entity's index from a host IndexSet
Definition: geometrygrid/entity.hh:622
Geometry geometry() const
Definition: geometrygrid/entity.hh:249
EntityBase(const Grid &grid, const HostElement &hostElement, int i)
Definition: geometrygrid/entity.hh:145
bool equals(const EntityBase &other) const
compare two entities
Definition: geometrygrid/entity.hh:486
const Grid & grid() const
Definition: geometrygrid/entity.hh:591
Entity(const Grid &grid, HostEntity &&hostEntity)
Definition: geometrygrid/entity.hh:776
LeafIntersectionIterator ileafbegin() const
Definition: geometrygrid/entity.hh:807
Entity(const Grid &grid, const HostEntity &hostEntity)
Definition: geometrygrid/entity.hh:709
Traits::LeafIntersectionIterator LeafIntersectionIterator
type of leaf intersection iterator
Definition: geometrygrid/entity.hh:759
Geometry geometry() const
Definition: geometrygrid/entity.hh:567
Entity(const Grid &grid, const EntitySeed &seed)
Definition: geometrygrid/entity.hh:707
LevelIntersectionIterator ilevelend() const
Definition: geometrygrid/entity.hh:801
EntityBase(const Grid &grid, const EntitySeed &seed)
Definition: geometrygrid/entity.hh:140
bool hasFather() const
Definition: geometrygrid/entity.hh:834
void initialize(const HostEntity &hostEntity)
initiliaze an entity
Definition: geometrygrid/entity.hh:284
Include standard header files.
Definition: agrid.hh:59
EntityBase()
Definition: geometrygrid/entity.hh:134
actual implementation of the entity
Definition: geometrygrid/entity.hh:32
bool isRegular() const
Definition: geometrygrid/entity.hh:856
EntityBase(const EntityBase &other)
Definition: geometrygrid/entity.hh:174
const HostEntity & hostEntity() const
Definition: geometrygrid/entity.hh:593
Grid::template Codim< codim >::Entity subEntity(int i) const
Definition: geometrygrid/entity.hh:789
GeometryType type() const
obtain the name of the corresponding reference element
Definition: geometrygrid/entity.hh:517
Base::HostElement HostElement
Definition: geometrygrid/entity.hh:701
Entity(const Grid &grid, const HostEntity &hostEntity, int i)
Definition: geometrygrid/entity.hh:782
Entity(const Grid &grid, const EntitySeed &seed)
Definition: geometrygrid/entity.hh:780
HostGrid::template Codim< 0 >::Entity HostElement
type of host elements, i.e., of host entities of codimension 0
Definition: geometrygrid/entity.hh:408
Wrapper class for entities.
Definition: common/entity.hh:64
EntityFacade father() const
Definition: geometrygrid/entity.hh:829
void initialize(const HostElement &hostElement)
initiliaze an entity
Definition: geometrygrid/entity.hh:612
int level() const
obtain the level of this entity
Definition: geometrygrid/entity.hh:525
Traits::template Codim< codimension >::EntitySeed EntitySeed
type of corresponding entity seed
Definition: geometrygrid/entity.hh:405
GeometryType type() const
obtain the name of the corresponding reference element
Definition: geometrygrid/entity.hh:218
HostIndexSet::IndexType subIndex(const HostIndexSet &indexSet, int i, unsigned int cd) const
obtain the index of a subentity from a host IndexSet
Definition: geometrygrid/entity.hh:311
PartitionType partitionType() const
obtain the partition type of this entity
Definition: geometrygrid/entity.hh:531
Entity(const Grid &grid, const HostEntity &hostEntity)
Definition: geometrygrid/entity.hh:775
const HostEntity & hostEntity() const
Definition: geometrygrid/entity.hh:274
HostIdSet::IdType id(const HostIdSet &idSet) const
obtain the entity's id from a host IdSet
Definition: geometrygrid/entity.hh:337
EntityBase(EntityBase &&other)
Definition: geometrygrid/entity.hh:180
EntityBase(const Grid &grid, const HostEntity &hostEntity)
Definition: geometrygrid/entity.hh:460
bool isNew() const
Definition: geometrygrid/entity.hh:861
bool equals(const EntityBase &other) const
compare two entities
Definition: geometrygrid/entity.hh:205
EntitySeedImp Implementation
Export the implementation type.
Definition: common/entityseed.hh:31
Entity(const Grid &grid, HostEntity &&hostEntity)
Definition: geometrygrid/entity.hh:710
const HostElement & hostElement() const
Definition: geometrygrid/entity.hh:598
Grid abstract base classThis class is the base class for all grid implementations. Although no virtual functions are used we call it abstract since its methods do not contain an implementation but forward to the methods of the derived class via the Barton-Nackman trick.
Definition: common/grid.hh:373
Base::EntitySeed EntitySeed
Definition: geometrygrid/entity.hh:768
Traits::ctype ctype
coordinate type of the grid
Definition: geometrygrid/entity.hh:99
bool isLeaf() const
Definition: geometrygrid/entity.hh:824
EntityBase(const Grid &grid, HostEntity &&hostEntity)
Definition: geometrygrid/entity.hh:168
Different resources needed by all grid implementations.
Definition: geometrygrid/entity.hh:55
Base::GeometryImpl GeometryImpl
Definition: geometrygrid/entity.hh:767
HostGrid::template Codim< 0 >::Entity HostElement
type of host elements, i.e., of host entities of codimension 0
Definition: geometrygrid/entity.hh:120
HostIndexSet::IndexType index(const HostIndexSet &indexSet) const
obtain the entity's index from a host IndexSet
Definition: geometrygrid/entity.hh:295
Traits::template Codim< codimension >::GeometryImpl GeometryImpl
Definition: geometrygrid/entity.hh:411
EntityBase(const GeometryImpl &geo, const HostEntity &hostEntity)
Definition: geometrygrid/entity.hh:151
EntitySeed seed() const
return EntitySeed of host grid entity
Definition: geometrygrid/entity.hh:265
Traits::template Codim< codimension >::EntitySeed EntitySeed
type of corresponding entity seed
Definition: geometrygrid/entity.hh:117