1#ifndef DUNE_SPGRID_ENTITY_HH
2#define DUNE_SPGRID_ENTITY_HH
8#include <dune/grid/common/gridenums.hh>
11#include <dune/grid/spgrid/geometry.hh>
19 template<
int codim,
int dim,
class Gr
id >
27 template<
class,
int >
28 class SPHierarchicIterator;
35 template<
int codim,
class Gr
id >
38 typedef SPBasicEntity< codim, Grid > This;
41 typedef __SPGrid::EntityInfo< Grid, codim > EntityInfo;
42 typedef typename EntityInfo::GridLevel GridLevel;
43 typedef typename EntityInfo::Traits Traits;
45 static const int dimension = EntityInfo::dimension;
46 static const int codimension = EntityInfo::codimension;
47 static const int mydimension = EntityInfo::mydimension;
49 typedef typename Traits::template Codim< codimension >::Entity Entity;
50 typedef typename Traits::template Codim< codimension >::EntitySeed EntitySeed;
51 typedef typename Traits::template Codim< codimension >::Geometry Geometry;
52 typedef typename Traits::template Codim< codimension >::LocalGeometry LocalGeometry;
54 typedef typename Traits::HierarchicIterator HierarchicIterator;
57 typedef SPGeometry< mydimension, dimension, Grid > GeometryImpl;
58 typedef SPEntitySeed< codimension, Grid > EntitySeedImpl;
60 typedef SPHierarchicIterator< Grid, codimension > HierarchicIteratorImpl;
65 explicit SPBasicEntity (
const EntityInfo &entityInfo )
66 : entityInfo_( entityInfo )
71 return gridLevel().level();
76 return (level() == entityInfo().gridLevel().grid().maxLevel());
81 return entityInfo().partitionType();
86 Geometry geometry ()
const
88 return Geometry( GeometryImpl( entityInfo_ ) );
91 bool equals (
const This &other )
const
93 return entityInfo().equals( other.entityInfo() );
96 EntitySeed seed ()
const
98 return EntitySeed( EntitySeedImpl( level(), entityInfo().
id(), entityInfo().partitionNumber() ) );
101 unsigned int subEntities (
unsigned int cd )
const
103 return gridLevel().template referenceCube< codim >().count( cd-codim );
106 bool hasFather ()
const {
return ((level() > 0) && entityInfo().hasFather()); }
108 Entity father ()
const
110 SPEntity< codimension, dimension, Grid > father( entityInfo() );
111 father.entityInfo().up();
112 return Entity( std::move( father ) );
115 HierarchicIterator hbegin (
int maxlevel )
const
117 assert( maxlevel >= level() );
118 return HierarchicIteratorImpl( entityInfo(), maxlevel );
121 HierarchicIterator hend (
int maxlevel )
const
123 assert( maxlevel >= level() );
124 return HierarchicIteratorImpl( entityInfo(), level() );
127 const EntityInfo &entityInfo ()
const {
return entityInfo_; }
128 EntityInfo &entityInfo () {
return entityInfo_; }
130 const GridLevel &gridLevel ()
const {
return entityInfo().gridLevel(); }
132 const Grid &grid ()
const {
return gridLevel().grid(); }
135 EntityInfo entityInfo_;
143 template<
int codim,
int dim,
class Gr
id >
145 :
public SPBasicEntity< codim, Grid >
147 typedef SPEntity< codim, dim, Grid > This;
148 typedef SPBasicEntity< codim, Grid > Base;
151 typedef typename Base::EntityInfo EntityInfo;
152 typedef typename Base::GridLevel GridLevel;
154 typedef typename GridLevel::MultiIndex MultiIndex;
158 explicit SPEntity (
const EntityInfo &entityInfo )
162 SPEntity (
const GridLevel &gridLevel,
const MultiIndex &
id,
unsigned int partitionNumber )
163 : Base( EntityInfo( gridLevel, id, partitionNumber ) )
172 template<
int dim,
class Gr
id >
173 class SPEntity< 0, dim, Grid >
174 :
public SPBasicEntity< 0, Grid >
176 typedef SPEntity< 0, dim, Grid > This;
177 typedef SPBasicEntity< 0, Grid > Base;
180 typedef typename Base::EntityInfo EntityInfo;
181 typedef typename Base::GridLevel GridLevel;
182 typedef typename Base::Traits Traits;
184 static const int dimension = Base::dimension;
186 typedef typename Base::Geometry Geometry;
187 typedef typename Base::LocalGeometry LocalGeometry;
189 template<
int codim >
192 typedef typename Traits::template Codim< codim >::Entity Entity;
195 typedef typename GridLevel::MultiIndex MultiIndex;
198 typedef typename GridLevel::Mesh Mesh;
200 static const int numFaces = GridLevel::ReferenceCube::numFaces;
205 explicit SPEntity (
const EntityInfo &entityInfo )
209 SPEntity (
const GridLevel &gridLevel,
const MultiIndex &
id,
unsigned int partitionNumber )
210 : Base( EntityInfo( gridLevel, id, partitionNumber ) )
213 using Base::entityInfo;
214 using Base::gridLevel;
216 template<
int codim >
217 typename Codim< codim >::Entity subEntity (
int i )
const;
219 bool hasBoundaryIntersections ()
const;
221 LocalGeometry geometryInFather ()
const
223 return gridLevel().geometryInFather( entityInfo().
id() );
226 bool isRegular ()
const {
return true; }
227 bool isNew ()
const {
return false; }
228 bool mightVanish ()
const {
return false; }
237 template<
int dim,
class Gr
id >
238 template<
int codim >
239 inline typename SPEntity< 0, dim, Grid >::template Codim< codim >::Entity
240 SPEntity< 0, dim, Grid >::subEntity (
int i )
const
242 typedef typename SPEntity< 0, dim, Grid >::template Codim< codim >::Entity SubEntity;
243 typedef SPEntity< codim, dimension, Grid > SubEntityImpl;
246 const unsigned int partitionNumber = entityInfo().partitionNumber();
247 MultiIndex
id = entityInfo().id();
248 id += gridLevel().referenceCube().subId( codim, i );
249 __SPGrid::EntityInfo< Grid, codim > subInfo( gridLevel(),
id, partitionNumber );
250 return SubEntity( SubEntityImpl( std::move( subInfo ) ) );
254 template<
int dim,
class Gr
id >
255 inline bool SPEntity< 0, dim, Grid >::hasBoundaryIntersections ()
const
257 const Mesh &globalMesh = gridLevel().globalMesh();
258 const MultiIndex &
id = entityInfo().id();
260 bool hasBoundaryIntersections =
false;
261 for(
int i = 0; i < dimension; ++i )
263 hasBoundaryIntersections |= (
id[ i ] == 2*globalMesh.begin()[ i ] + 1);
264 hasBoundaryIntersections |= (
id[ i ] == 2*globalMesh.end()[ i ] - 1);
266 return hasBoundaryIntersections;
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:132
constexpr GeometryType cube(unsigned int dim)
Returns a GeometryType representing a hypercube of dimension dim.
Definition: type.hh:472
constexpr auto equals(T1 &&t1, T2 &&t2)
Equality comparison.
Definition: hybridutilities.hh:402
Dune namespace.
Definition: alignedallocator.hh:13
A unique label for each type of element that can occur in a grid.