dune-spgrid  2.7
entity.hh
Go to the documentation of this file.
1 #ifndef DUNE_SPGRID_ENTITY_HH
2 #define DUNE_SPGRID_ENTITY_HH
3 
4 #include <utility>
5 
6 #include <dune/geometry/type.hh>
7 
8 #include <dune/grid/common/gridenums.hh>
9 
12 
13 namespace Dune
14 {
15 
16  // Internal Forward Declarations
17  // -----------------------------
18 
19  template< int codim, int dim, class Grid >
20  class SPEntity;
21 
22 
23 
24  // External Forward Declarations
25  // -----------------------------
26 
27  template< class, int >
28  class SPHierarchicIterator;
29 
30 
31 
32  // SPBasicEntity
33  // -------------
34 
35  template< int codim, class Grid >
37  {
39 
40  public:
42  typedef typename EntityInfo::GridLevel GridLevel;
43  typedef typename EntityInfo::Traits Traits;
44 
45  static const int dimension = EntityInfo::dimension;
48 
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;
53 
54  typedef typename Traits::HierarchicIterator HierarchicIterator;
55 
56  protected:
59 
61 
62  public:
64 
65  explicit SPBasicEntity ( const EntityInfo &entityInfo )
66  : entityInfo_( entityInfo )
67  {}
68 
69  int level () const
70  {
71  return gridLevel().level();
72  }
73 
74  bool isLeaf () const
75  {
76  return (level() == entityInfo().gridLevel().grid().maxLevel());
77  }
78 
79  PartitionType partitionType () const
80  {
81  return entityInfo().partitionType();
82  }
83 
84  GeometryType type () const { return GeometryTypes::cube( mydimension ); }
85 
86  Geometry geometry () const
87  {
88  return Geometry( GeometryImpl( entityInfo_ ) );
89  }
90 
91  bool equals ( const This &other ) const
92  {
93  return entityInfo().equals( other.entityInfo() );
94  }
95 
96  EntitySeed seed () const
97  {
98  return EntitySeed( EntitySeedImpl( level(), entityInfo().id(), entityInfo().partitionNumber() ) );
99  }
100 
101  unsigned int subEntities ( unsigned int cd ) const
102  {
103  return gridLevel().template referenceCube< codim >().count( cd-codim );
104  }
105 
106  bool hasFather () const { return ((level() > 0) && entityInfo().hasFather()); }
107 
108  Entity father () const
109  {
111  father.entityInfo().up();
112  return Entity( std::move( father ) );
113  }
114 
115  HierarchicIterator hbegin ( int maxlevel ) const
116  {
117  assert( maxlevel >= level() );
118  return HierarchicIteratorImpl( entityInfo(), maxlevel );
119  }
120 
121  HierarchicIterator hend ( int maxlevel ) const
122  {
123  assert( maxlevel >= level() );
124  return HierarchicIteratorImpl( entityInfo(), level() );
125  }
126 
127  const EntityInfo &entityInfo () const { return entityInfo_; }
128  EntityInfo &entityInfo () { return entityInfo_; }
129 
130  const GridLevel &gridLevel () const { return entityInfo().gridLevel(); }
131 
132  const Grid &grid () const { return gridLevel().grid(); }
133 
134  private:
135  EntityInfo entityInfo_;
136  };
137 
138 
139 
140  // SPEntity
141  // --------
142 
143  template< int codim, int dim, class Grid >
144  class SPEntity
145  : public SPBasicEntity< codim, Grid >
146  {
149 
150  public:
151  typedef typename Base::EntityInfo EntityInfo;
152  typedef typename Base::GridLevel GridLevel;
153 
155 
156  SPEntity () {}
157 
158  explicit SPEntity ( const EntityInfo &entityInfo )
159  : Base( entityInfo )
160  {}
161 
162  SPEntity ( const GridLevel &gridLevel, const MultiIndex &id, unsigned int partitionNumber )
163  : Base( EntityInfo( gridLevel, id, partitionNumber ) )
164  {}
165  };
166 
167 
168 
169  // SPEntity (for codimension 0)
170  // ----------------------------
171 
172  template< int dim, class Grid >
173  class SPEntity< 0, dim, Grid >
174  : public SPBasicEntity< 0, Grid >
175  {
178 
179  public:
180  typedef typename Base::EntityInfo EntityInfo;
181  typedef typename Base::GridLevel GridLevel;
182  typedef typename Base::Traits Traits;
183 
184  static const int dimension = Base::dimension;
185 
186  typedef typename Base::Geometry Geometry;
188 
189  template< int codim >
190  struct Codim
191  {
192  typedef typename Traits::template Codim< codim >::Entity Entity;
193  };
194 
196 
197  protected:
198  typedef typename GridLevel::Mesh Mesh;
199 
200  static const int numFaces = GridLevel::ReferenceCube::numFaces;
201 
202  public:
203  SPEntity () {}
204 
205  explicit SPEntity ( const EntityInfo &entityInfo )
206  : Base( entityInfo )
207  {}
208 
209  SPEntity ( const GridLevel &gridLevel, const MultiIndex &id, unsigned int partitionNumber )
210  : Base( EntityInfo( gridLevel, id, partitionNumber ) )
211  {}
212 
213  using Base::entityInfo;
214  using Base::gridLevel;
215 
216  template< int codim >
217  typename Codim< codim >::Entity subEntity ( int i ) const;
218 
219  bool hasBoundaryIntersections () const;
220 
222  {
223  return gridLevel().geometryInFather( entityInfo().id() );
224  }
225 
226  bool isRegular () const { return true; }
227  bool isNew () const { return false; }
228  bool mightVanish () const { return false; }
229  };
230 
231 
232 
233  // Implementation of SPEntity (for codimension 0)
234  // ----------------------------------------------
235 
236 
237  template< int dim, class Grid >
238  template< int codim >
239  inline typename SPEntity< 0, dim, Grid >::template Codim< codim >::Entity
241  {
243  typedef SPEntity< codim, dimension, Grid > SubEntityImpl;
244 
245  // warning: this is only true for closed partitions
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 ) ) );
251  }
252 
253 
254  template< int dim, class Grid >
256  {
257  const Mesh &globalMesh = gridLevel().globalMesh();
258  const MultiIndex &id = entityInfo().id();
259 
260  bool hasBoundaryIntersections = false;
261  for( int i = 0; i < dimension; ++i )
262  {
263  hasBoundaryIntersections |= (id[ i ] == 2*globalMesh.begin()[ i ] + 1);
264  hasBoundaryIntersections |= (id[ i ] == 2*globalMesh.end()[ i ] - 1);
265  }
266  return hasBoundaryIntersections;
267  }
268 
269 } // namespace Dune
270 
271 #endif // #ifndef DUNE_SPGRID_ENTITY_HH
entity seed for SPGrid
Definition: iostream.hh:7
Definition: entity.hh:146
SPEntity(const GridLevel &gridLevel, const MultiIndex &id, unsigned int partitionNumber)
Definition: entity.hh:162
SPEntity(const EntityInfo &entityInfo)
Definition: entity.hh:158
Base::EntityInfo EntityInfo
Definition: entity.hh:151
GridLevel::MultiIndex MultiIndex
Definition: entity.hh:154
Base::GridLevel GridLevel
Definition: entity.hh:152
SPEntity()
Definition: entity.hh:156
Definition: hierarchiciterator.hh:18
Definition: entity.hh:37
SPGeometry< mydimension, dimension, Grid > GeometryImpl
Definition: entity.hh:57
SPHierarchicIterator< Grid, codimension > HierarchicIteratorImpl
Definition: entity.hh:60
const EntityInfo & entityInfo() const
Definition: entity.hh:127
unsigned int subEntities(unsigned int cd) const
Definition: entity.hh:101
Entity father() const
Definition: entity.hh:108
Traits::template Codim< codimension >::EntitySeed EntitySeed
Definition: entity.hh:50
const GridLevel & gridLevel() const
Definition: entity.hh:130
GeometryType type() const
Definition: entity.hh:84
SPBasicEntity(const EntityInfo &entityInfo)
Definition: entity.hh:65
const Grid & grid() const
Definition: entity.hh:132
SPBasicEntity()
Definition: entity.hh:63
EntityInfo::Traits Traits
Definition: entity.hh:43
Geometry geometry() const
Definition: entity.hh:86
SPEntitySeed< codimension, Grid > EntitySeedImpl
Definition: entity.hh:58
EntityInfo::GridLevel GridLevel
Definition: entity.hh:42
bool hasFather() const
Definition: entity.hh:106
bool isLeaf() const
Definition: entity.hh:74
static const int dimension
Definition: entity.hh:45
static const int codimension
Definition: entity.hh:46
Traits::template Codim< codimension >::Geometry Geometry
Definition: entity.hh:51
HierarchicIterator hbegin(int maxlevel) const
Definition: entity.hh:115
__SPGrid::EntityInfo< Grid, codim > EntityInfo
Definition: entity.hh:41
HierarchicIterator hend(int maxlevel) const
Definition: entity.hh:121
Traits::template Codim< codimension >::LocalGeometry LocalGeometry
Definition: entity.hh:52
bool equals(const This &other) const
Definition: entity.hh:91
Traits::HierarchicIterator HierarchicIterator
Definition: entity.hh:54
int level() const
Definition: entity.hh:69
EntityInfo & entityInfo()
Definition: entity.hh:128
static const int mydimension
Definition: entity.hh:47
EntitySeed seed() const
Definition: entity.hh:96
Traits::template Codim< codimension >::Entity Entity
Definition: entity.hh:49
PartitionType partitionType() const
Definition: entity.hh:79
Definition: entity.hh:175
bool isRegular() const
Definition: entity.hh:226
Codim< codim >::Entity subEntity(int i) const
SPEntity(const GridLevel &gridLevel, const MultiIndex &id, unsigned int partitionNumber)
Definition: entity.hh:209
GridLevel::MultiIndex MultiIndex
Definition: entity.hh:195
Base::EntityInfo EntityInfo
Definition: entity.hh:180
Base::GridLevel GridLevel
Definition: entity.hh:181
bool isNew() const
Definition: entity.hh:227
Base::Geometry Geometry
Definition: entity.hh:186
Base::Traits Traits
Definition: entity.hh:182
Base::LocalGeometry LocalGeometry
Definition: entity.hh:187
bool mightVanish() const
Definition: entity.hh:228
LocalGeometry geometryInFather() const
Definition: entity.hh:221
GridLevel::Mesh Mesh
Definition: entity.hh:198
SPEntity()
Definition: entity.hh:203
SPEntity(const EntityInfo &entityInfo)
Definition: entity.hh:205
Traits::template Codim< codim >::Entity Entity
Definition: entity.hh:192
Definition: entityinfo.hh:24
const GridLevel & gridLevel() const
Definition: entityinfo.hh:66
static const int codimension
Definition: entityinfo.hh:31
const MultiIndex & id() const
Definition: entityinfo.hh:68
PartitionType partitionType() const
Definition: entityinfo.hh:82
static const int dimension
Definition: entityinfo.hh:30
unsigned int partitionNumber() const
Definition: entityinfo.hh:73
bool equals(const This &other) const
Definition: entityinfo.hh:77
GridLevel::Traits Traits
Definition: entityinfo.hh:43
static const int mydimension
Definition: entityinfo.hh:32
entity seed for SPGrid
Definition: entityseed.hh:32
Definition: geometry.hh:87
Definition: gridlevel.hh:35
const ReferenceCube & referenceCube() const
Definition: geometricgridlevel.hh:53
const Mesh & globalMesh() const
Definition: gridlevel.hh:210
int level() const
Definition: gridlevel.hh:83
const Grid & grid() const
Definition: gridlevel.hh:82
LocalGeometry geometryInFather(const MultiIndex &id) const
Definition: gridlevel.hh:287
const MultiIndex & end() const
Definition: mesh.hh:37
const MultiIndex & begin() const
Definition: mesh.hh:36
static const int numFaces
Definition: referencecube.hh:55
const MultiIndex & subId(const int codim, const int i) const
Definition: referencecube.hh:59