Dune Core Modules (2.4.2)

entity.hh
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_ALBERTA_ENTITY_HH
4 #define DUNE_ALBERTA_ENTITY_HH
5 
6 #include <dune/grid/common/entity.hh>
7 
9 #include <dune/grid/albertagrid/entityseed.hh>
10 #include <dune/grid/albertagrid/geometry.hh>
11 
12 #if HAVE_ALBERTA
13 
14 namespace Dune
15 {
16 
17  // Forward Declarations
18  // --------------------
19 
20  template< int codim, class Grid >
21  class AlbertaGridEntityPointer;
22 
23  template< int codim, class Grid, bool leafIterator >
24  class AlbertaGridTreeIterator;
25 
26  template< class Grid >
27  class AlbertaGridHierarchicIterator;
28 
29  template< class Grid >
30  class AlbertaGridLeafIntersection;
31 
32  template< class Grid >
33  class AlbertaGridLeafIntersectionIterator;
34 
35 
36 
37  // AlbertaGridEntity
38  // -----------------
39 
44  template< int codim, int dim, class Grid >
46  : public EntityDefaultImplementation< codim, dim, Grid, AlbertaGridEntity >
47  {
49 
50  enum { dimworld = Grid::dimensionworld };
51  friend class AlbertaGrid< dim, dimworld >;
52  friend class AlbertaGridEntity< 0, dim, Grid >;
53 
54  template< int, class, bool > friend class AlbertaGridTreeIterator;
55  friend class AlbertaGridEntityPointer< codim, Grid >;
56 
57  public:
58  static const int dimension = dim;
59  static const int codimension = codim;
60  static const int mydimension = dimension - codimension;
61 
62  template< int cd >
63  struct Codim
64  {
65  typedef typename Grid::template Codim< cd >::EntityPointer EntityPointer;
66  };
67 
68  typedef typename Grid::template Codim< codim >::Entity Entity;
69  typedef typename Grid::template Codim< codim >::EntitySeed EntitySeed;
70  typedef typename Grid::template Codim< codim >::Geometry Geometry;
71 
72  typedef Alberta::ElementInfo< dimension > ElementInfo;
73 
74  private:
75  typedef typename Grid::Traits::template Codim< codim >::GeometryImpl GeometryImpl;
76 
77  public:
79  explicit AlbertaGridEntity ( const Grid &grid );
80 
82 
84  AlbertaGridEntity ( const Grid &grid, const ElementInfo &elementInfo, int subEntity );
85 
87  int level () const;
88 
91 
93  Geometry geometry () const;
94 
96  GeometryType type () const;
97 
99  EntitySeed seed () const { return EntitySeed( AlbertaGridEntitySeed< codim, Grid >( elementInfo(), subEntity() ) ); }
100 
101  //***********************************************
102  // end of interface methods
103  //***********************************************
104 
106  ALBERTA EL_INFO *getElInfo () const;
107 
108  const ElementInfo &elementInfo () const { return elementInfo_; }
109 
111  bool equals ( const This &other ) const;
112 
113  void clearElement ();
114  void setElement ( const ElementInfo &elementInfo, int subEntity );
115 
116  // same as setElInfo just with a entity given
117  void setEntity ( const This &other );
118 
120  const Grid &grid () const
121  {
122  return *grid_;
123  }
124 
126  int subEntity () const
127  {
128  return subEntity_;
129  }
130 
132  int twist () const
133  {
134  return elementInfo().template twist< codimension >( subEntity() );
135  }
136 
137  private:
138  // grid this entity belong to
139  const Grid *grid_;
140 
141  // ALBERTA element info
142  ElementInfo elementInfo_;
143 
144  // number of the subentity within the element (in ALBERTA numbering)
145  int subEntity_;
146  };
147 
148 
149 
150  // AlbertaGridEntity for codimension 0
151  // -----------------------------------
152 
160  template< int dim, class Grid >
161  class AlbertaGridEntity< 0, dim, Grid >
162  : public EntityDefaultImplementation< 0, dim, Grid, AlbertaGridEntity >
163  {
165 
166  static const int dimworld = Grid::dimensionworld;
167 
168  friend class AlbertaGrid< dim, dimworld >;
169  friend class AlbertaGridLeafIntersection< Grid >;
170  friend class AlbertaGridHierarchicIterator< Grid >;
171  template< int, class, bool > friend class AlbertaGridTreeIterator;
172  friend class AlbertaGridEntityPointer< 0, Grid >;
173 
174  public:
175  static const int dimension = dim;
176  static const int codimension = 0;
177  static const int mydimension = dimension - codimension;
178 
179  template< int codim >
180  struct Codim
181  {
182  typedef typename Grid::template Codim< codim >::EntityPointer
184  typedef typename Grid::template Codim< codim >::Entity
185  Entity;
186  };
187 
188  typedef typename Grid::template Codim< 0 >::Entity Entity;
189  typedef typename Grid::template Codim< 0 >::EntitySeed EntitySeed;
190  typedef typename Grid::template Codim< 0 >::Geometry Geometry;
191  typedef typename Grid::template Codim< 0 >::LocalGeometry LocalGeometry;
192  typedef typename Grid::Traits::template Codim< 0 >::GeometryImpl GeometryImpl;
193 
194  typedef typename Grid::HierarchicIterator HierarchicIterator;
195  typedef typename Grid::template Codim< 0 >::EntityPointer EntityPointer;
196 
197  typedef Dune::AlbertaGridLeafIntersectionIterator< Grid > AlbertaGridLeafIntersectionIterator;
198  typedef AlbertaGridLeafIntersectionIterator AlbertaGridLevelIntersectionIterator;
199 
200  typedef Alberta::ElementInfo< dimension > ElementInfo;
201 
203  explicit AlbertaGridEntity ( const Grid &grid );
204 
206 
208  AlbertaGridEntity ( const Grid &grid, const ElementInfo &elementInfo, int subEntity );
209 
211  int level () const;
212 
214  int boundaryId () const;
215 
217  Geometry geometry () const;
218 
220  GeometryType type () const;
221 
223  EntitySeed seed () const { return EntitySeed( AlbertaGridEntitySeed< 0, Grid >(elementInfo() )); }
224 
231  template< int codim >
232  int count () const
233  {
234  return Alberta::NumSubEntities< dimension, codim >::value;
235  }
236 
245  unsigned int subEntities (unsigned int codim) const
246  {
247  int n = dimension+1;
248  int k = dimension-codim+1;
249 
250  // binomial: n over k
251  int binomial=1;
252  for (int i=n-k+1; i<=n; i++)
253  binomial *= i;
254  for (long i=2; i<=k; i++)
255  binomial /= i;
256 
257  return binomial;
258  }
259 
270  template< int codim >
271  typename Grid::template Codim< codim >::Entity subEntity ( int i ) const;
272 
278  AlbertaGridLeafIntersectionIterator ileafbegin () const;
279 
281  AlbertaGridLeafIntersectionIterator ileafend () const;
282 
283  AlbertaGridLevelIntersectionIterator ilevelbegin () const
284  {
285  if( grid().maxLevel() == 0 )
286  return ileafbegin();
287  else
288  {
289  DUNE_THROW( NotImplemented, "method ilevelbegin not implemented for AlbertaGrid." );
290  return ileafend();
291  }
292  }
293 
294  AlbertaGridLevelIntersectionIterator ilevelend () const
295  {
296  return ileafend();
297  }
298 
300  bool isLeaf () const;
301 
304  Entity father () const;
306  bool hasFather () const
307  {
308  return (this->level()>0);
309  }
310 
319  LocalGeometry geometryInFather () const;
320 
325  HierarchicIterator hbegin (int maxlevel) const;
326 
328  HierarchicIterator hend (int maxlevel) const;
329 
331  bool isNew () const;
332 
334  bool mightVanish () const;
335 
338  bool hasBoundaryIntersections () const ;
339 
342 
344  bool equals ( const This &i ) const;
345 
346  // needed for LevelIterator to compare
347  ALBERTA EL_INFO *getElInfo () const;
348 
349  const ElementInfo &elementInfo () const
350  {
351  return elementInfo_;
352  }
353 
354  void clearElement ();
355  void setElement ( const ElementInfo &elementInfo, int subEntity );
356 
357  // same as setElInfo just with a entity given
358  void setEntity ( const This &other );
359 
361  const Grid &grid () const
362  {
363  return *grid_;
364  }
365 
367  int subEntity () const
368  {
369  return 0;
370  }
371 
373  int twist () const
374  {
375  return elementInfo().template twist< codimension >( subEntity() );
376  }
377 
379  template< int codim >
380  int twist ( int i ) const
381  {
382  return elementInfo().template twist< codim >( grid().generic2alberta( codim, i ) );
383  }
384 
385  private:
387  int nChild () const;
388 
390  const Grid *grid_;
391 
392  // Alberta element info
393  ElementInfo elementInfo_;
394  };
395 
396 } // namespace Dune
397 
398 #endif // #if HAVE_ALBERTA
399 
400 #endif // #ifndef DUNE_ALBERTA_ENTITY_HH
EntityPointer implementation for AlbertaGrid.
Definition: entitypointer.hh:19
EntitySeed seed() const
obtain entity seed
Definition: entity.hh:223
unsigned int subEntities(unsigned int codim) const
Obtain the number of subentities of a given codimension.
Definition: entity.hh:245
int count() const
Definition: entity.hh:232
int twist() const
obtain twist
Definition: entity.hh:373
bool hasFather() const
returns true if father entity exists
Definition: entity.hh:306
int subEntity() const
obtain number of the subentity within the element (in ALBERTA numbering)
Definition: entity.hh:367
int twist(int i) const
obtain twist of a subentity
Definition: entity.hh:380
const Grid & grid() const
obtain a reference to the grid
Definition: entity.hh:361
Definition: entity.hh:47
const Grid & grid() const
obtain a reference to the grid
Definition: entity.hh:120
int twist() const
obtain twist
Definition: entity.hh:132
ALBERTA EL_INFO * getElInfo() const
needed for the LevelIterator and LeafIterator
Definition: entity.cc:60
int level() const
level of this element
Definition: entity.cc:92
EntitySeed seed() const
obtain entity seed
Definition: entity.hh:99
PartitionType partitionType() const
return partition type of this entity
Definition: entity.cc:38
Geometry geometry() const
geometry of this entity
Definition: entity.cc:101
int subEntity() const
obtain number of the subentity within the element (in ALBERTA numbering)
Definition: entity.hh:126
GeometryType type() const
type of geometry of this entity
Definition: entity.cc:112
bool equals(const This &other) const
equality of entities
Definition: entity.cc:46
Definition: hierarchiciterator.hh:29
Definition: treeiterator.hh:182
[ provides Dune::Grid ]
Definition: agrid.hh:140
Default Implementations for EntityImp.
Definition: entity.hh:740
GridImp::template Codim< cd >::EntityPointer EntityPointer
The corresponding entity seed (for storage of entities)
Definition: entity.hh:755
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:25
Grid abstract base class.
Definition: grid.hh:388
GridFamily::Traits::HierarchicIterator HierarchicIterator
A type that is a model of Dune::HierarchicIterator A type of iterator that allows to examine,...
Definition: grid.hh:512
@ dimensionworld
The dimension of the world the grid lives in.
Definition: grid.hh:408
Default exception for dummy implementations.
Definition: exceptions.hh:288
provides a wrapper for ALBERTA's el_info structure
#define DUNE_THROW(E, m)
Definition: exceptions.hh:243
PartitionType
Attributes used in the generic overlap model.
Definition: gridenums.hh:28
int binomial(int upper, int lower)
calculate
Definition: simplex.cc:292
Dune namespace.
Definition: alignment.hh:10
Static tag representing a codimension.
Definition: dimension.hh:22
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 9, 22:29, 2024)