Dune Core Modules (2.4.2)

entity_inline.hh
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
4 
5 #include "geometry.hh"
6 #include "grid.hh"
7 
8 namespace Dune {
9 
10  template<int cd, int dim, class GridImp>
12  reset( int l )
13  {
14  item_ = 0;
15  level_ = l;
16  twist_ = 0;
17  face_ = -1;
18  }
19 
20  template<int cd, int dim, class GridImp>
23  {
24  item_ = 0;
25  geo_.invalidate();
26  }
27 
28  template<int cd, int dim, class GridImp>
31  {
32  return (item_ == org.item_);
33  }
34 
35  template<int cd, int dim, class GridImp>
37  {
38  return gIndex_;
39  }
40 
41  template<int cd, int dim, class GridImp>
43  {
44  return level_;
45  }
46 
47  template<int cd, int dim, class GridImp>
49  partitionType () const
50  {
51  return partitionType_;
52  }
53 
54  template<int cd, int dim, class GridImp>
55  inline GeometryType
57  {
58  return geo_.type();
59  }
60 
62  //
63  // --Entity0
64  // --Codim0Entity
65  //
67  template<int dim, class GridImp>
70  {
71  item_ = 0;
72  ghost_ = 0;
73  geo_.invalidate();
74  }
75 
76  template<int dim, class GridImp>
78  reset (int walkLevel )
79  {
80  item_ = 0;
81  ghost_ = 0;
82  level_ = -1;
83  isLeaf_ = false;
84 
85  // reset geometry information
86  geo_.invalidate();
87  }
88 
89  // works like assignment
90  template<int dim, class GridImp>
91  inline void
93  {
94  item_ = org.item_;
95  ghost_ = org.ghost_;
96  level_ = org.level_;
97  isLeaf_ = org.isLeaf_;
98 
99  // reset geometry information
100  geo_.invalidate();
101  }
102 
103  template<int dim, class GridImp>
104  inline void
105  ALU3dGridEntity<0,dim,GridImp>::
106  setElement(const EntitySeed& key )
107  {
108  if( ! key.isGhost() )
109  setElement( *key.interior() );
110  else
111  setGhost( *key.ghost() );
112  }
113 
114  template<int dim, class GridImp>
115  inline void
117  setElement(HElementType & element)
118  {
119  item_ = static_cast<IMPLElementType *> (&element);
120  assert( item_ );
121  // make sure this method is not called for ghosts
122  assert( ! item_->isGhost() );
123  ghost_ = 0;
124  level_ = (*item_).level();
125  isLeaf_ = ((*item_).down() == 0);
126 
127  // reset geometry information
128  geo_.invalidate();
129  }
130 
131  template<int dim, class GridImp>
132  inline void
134  {
135  // use element as ghost
136  item_ = static_cast<IMPLElementType *> ( ghost.getGhost().first );
137 
138  // method getGhost can return 0, but then is something wrong
139  assert(item_);
140  assert(item_->isGhost());
141 
142  level_ = item_->level();
143  // remember pointer to ghost face
144  ghost_ = static_cast<BNDFaceType *> (&ghost);
145  assert( ghost_ );
146 
147  BNDFaceType * dwn = static_cast<BNDFaceType *> (ghost.down());
148  if ( ! dwn ) isLeaf_ = true;
149  else
150  {
151  assert( ghost.level() == level_ );
152  if(dwn->ghostLevel() == level_)
153  isLeaf_ = true;
154  else
155  isLeaf_ = false;
156  }
157  // check wether ghost is leaf or not, ghost leaf means
158  // that this is the ghost that we want in the leaf iterator
159  // not necessarily is real leaf element
160  // see Intersection Iterator, same story
161 
162  // reset geometry information
163  geo_.invalidate();
164  }
165 
166  template<int dim, class GridImp>
167  inline int
169  {
170  return level_;
171  }
172 
173  template<int dim, class GridImp>
175  equals (const ALU3dGridEntity<0,dim,GridImp> &org ) const
176  {
177  return (item_ == org.item_);
178  }
179 
180  template<int dim, class GridImp>
181  inline GeometryType
183  {
184  return geo_.type();
185  }
186 
187  template<int dim, class GridImp>
189  {
190  assert( item_ );
191  return (*item_).getIndex();
192  }
193 
194  template<int dim, class GridImp>
195  template<int cc>
197  {
198  return grid().referenceElement().size(cc);
199  }
200 
201  template<int dim, class GridImp>
202  inline unsigned int ALU3dGridEntity<0,dim,GridImp> :: subEntities (unsigned int codim) const
203  {
204  return grid().referenceElement().size(codim);
205  }
206 
207  template<int dim, class GridImp>
209  partitionType () const
210  {
211  assert( item_ );
212  // make sure we really got a ghost
213  assert( (isGhost()) ? item_->isGhost() : true );
214  return (isGhost() ? GhostEntity : InteriorEntity);
215  }
216 
217  template<int dim, class GridImp>
219  {
220  return isLeaf_;
221  }
222 
223  template<int dim, class GridImp>
224  inline ALU3dGridHierarchicIterator<GridImp>
226  {
227  assert(item_ != 0);
228  // if isGhost is true the end iterator will be returned
229  if( isGhost() )
230  {
231  return ALU3dGridHierarchicIterator<GridImp>(factory_,*ghost_,maxlevel, isLeaf() );
232  }
233  return ALU3dGridHierarchicIterator<GridImp>(factory_,*item_,maxlevel, isLeaf() );
234  }
235 
236  template<int dim, class GridImp>
237  inline ALU3dGridHierarchicIterator<GridImp> ALU3dGridEntity<0,dim,GridImp> :: hend (int maxlevel) const
238  {
239  assert(item_ != 0);
240  return ALU3dGridHierarchicIterator<GridImp> (factory_, *item_, maxlevel, true);
241  }
242 
243  template<int dim, class GridImp>
244  inline typename ALU3dGridEntity<0,dim,GridImp> :: ALU3dGridLeafIntersectionIteratorType
246  {
247  assert(item_ != 0);
248  return ALU3dGridIntersectionIteratorType (*this, this->level(), false);
249  }
250 
251  template<int dim, class GridImp>
252  inline typename ALU3dGridEntity<0,dim,GridImp> :: ALU3dGridLeafIntersectionIteratorType
254  {
255  assert(item_ != 0);
256  return ALU3dGridLeafIntersectionIteratorType (*this, this->level(), true);
257  }
258 
259  template<int dim, class GridImp>
260  inline typename ALU3dGridEntity<0,dim,GridImp> :: ALU3dGridLevelIntersectionIteratorType
262  {
263  assert(item_ != 0);
264  // disable level intersection iterator for conforming refinement
265  return ALU3dGridLevelIntersectionIteratorType (*this, this->level(), grid().conformingRefinement() );
266  }
267 
268  template<int dim, class GridImp>
269  inline typename ALU3dGridEntity<0,dim,GridImp> :: ALU3dGridLevelIntersectionIteratorType
271  {
272  assert(item_ != 0);
273  return ALU3dGridLevelIntersectionIteratorType (*this, this->level(), true);
274  }
275 
276  // Adaptation methods
277  template<int dim, class GridImp>
279  {
280  assert( item_ );
281  return item_->hasBeenRefined();
282  }
283 
284  template<int dim, class GridImp>
286  {
287  assert( item_ );
288  return ((*item_).requestrule() == coarse_element_t);
289  }
290 
291  //*******************************************************************
292  //
293  // --EntityPointer
294  // --EnPointer
295  //
296  //*******************************************************************
297  template<int codim, class GridImp >
299  ALU3dGridEntityPointerBase(const FactoryType& factory,
300  const HElementType &item)
301  : factory_(factory)
302  , seed_( item )
303  , entity_( 0 )
304  {}
305 
306  template<int codim, class GridImp >
308  ALU3dGridEntityPointerBase(const FactoryType& factory,
309  const HBndSegType & ghostFace )
310  : factory_(factory)
311  , seed_( ghostFace )
312  , entity_ ( factory_.template getNewEntity<codim> ( ghostFace.level() ))
313  {
314  // sets entity and item pointer
315  updateGhostPointer( const_cast<HBndSegType &> (ghostFace) );
316  }
317 
318  template<int codim, class GridImp >
320  ALU3dGridEntityPointerBase(const FactoryType& factory,
321  const ALU3dGridEntitySeedType& key )
322  : factory_(factory)
323  , seed_( key )
324  , entity_ ( 0 )
325  {}
326 
327  // constructor Level,Leaf and HierarchicIterator
328  template<int codim, class GridImp >
330  ALU3dGridEntityPointerBase(const FactoryType& factory, int level )
331  : factory_(factory)
332  , seed_()
333  , entity_ ( factory_.template getNewEntity<codim> ( level ) )
334  {
335  // this needs to be called
336  // have to investigate why
337  entityImp().reset(level);
338  }
339 
340 
341  template<int codim, class GridImp >
343  ALU3dGridEntityPointerBase(const FactoryType& factory,
344  const HElementType &item,
345  const int level,
346  const int twist,
347  const int duneFace )
348  : factory_(factory)
349  , seed_( item, level, twist, duneFace )
350  , entity_( 0 )
351  {}
352 
353  template<int codim, class GridImp >
356  : factory_(org.factory_)
357  , seed_( org.seed_ )
358  , entity_( 0 )
359  {
360  // if entity exists then copy entity
361  getEntity( org );
362  }
363 
364  template<int codim, class GridImp >
366  getEntity(const ALU3dGridEntityPointerType & org)
367  {
368  // if entity existed for original pointer then copy
369  if( org.entity_ )
370  {
371  assert( entity_ == 0 );
372  entity_ = factory_.template getNewEntity<codim> ();
373  // set entity right away
374  entityImp().setEntity( org.entityImp() );
375  }
376  }
377 
378  template<int codim, class GridImp >
379  inline ALU3dGridEntityPointerBase<codim,GridImp> &
382  {
383  clone( org );
384  return *this;
385  }
386 
387  template<int codim, class GridImp >
388  inline void
390  clone (const ALU3dGridEntityPointerType & org)
391  {
392  assert( &factory_ == &org.factory_ );
393 
394  // set item
395  seed_ = org.seed_;
396 
397  HElementType* item = seed_.item();
398 
399  if( item )
400  {
401  // if no entity check org entity
402  // if no org entity then nothing is done
403  if( !entity_ )
404  {
405  getEntity(org);
406  }
407  else
408  {
409  // in case of ghost element use different set method
410  if( item->isGhost() )
411  {
412  // on ghosts entity pointers entity always exists
413  assert( org.entity_ );
414  entityImp().setEntity( org.entityImp() );
415  }
416  else
417  {
418  // otherwise item is set
419  entityImp().setElement( seed_ );
420  }
421  }
422  }
423  else
424  {
425  this->done();
426  }
427  return ;
428  }
429 
430  template<int codim, class GridImp >
433  {
434  this->done();
435  }
436 
437  template<int codim, class GridImp >
439  {
440  seed_.clear();
441  // free entity
442  freeEntity();
443  }
444 
445  template<int codim, class GridImp >
447  {
448  // sets entity pointer in the status of an empty entity
449  if( entity_ )
450  {
451  entityImp().removeElement();
452  factory_.template freeEntity<codim> ( (EntityObject *) entity_ );
453  entity_ = 0;
454  }
455  }
456 
457  template<int codim, class GridImp >
460  {
461  // check equality of underlying items
462  return (seed_.equals( i.seed_ ));
463  }
464 
465  template<int codim, class GridImp >
468  {
469  // don't dereference empty entity pointer
470  assert( seed_.item() );
471  if( ! entity_ )
472  {
473  entity_ = factory_.template getNewEntity<codim> ();
474  entityImp().setElement( seed_ );
475  }
476  assert( seed_.item() == & entityImp().getItem() );
477  return (*entity_);
478  }
479 
480  template<int codim, class GridImp >
482  {
483  assert( seed_.item() );
484  return seed_.item()->level();
485  }
486 
487  template<int codim, class GridImp >
489  updateGhostPointer( HBndSegType & ghostFace )
490  {
491  assert( entity_ );
492  entityImp().setGhost( ghostFace );
493  // inside the method setGhost the method getGhost of the ghostFace is
494  // called and set as item
495  seed_.set( ghostFace );
496  }
497 
498  template<int codim, class GridImp >
499  inline void ALU3dGridEntityPointerBase<codim,GridImp>::
500  updateEntityPointer( HElementType * item , int )
501  {
502  seed_.set( *item );
503  if( item && entity_ )
504  {
505  entityImp().setElement( seed_ );
506  }
507  }
508 
510  //
511  // specialisation for higher codims
512  //
514 
515  template<int codim, class GridImp >
516  inline ALU3dGridEntityPointer<codim,GridImp> ::
517  ALU3dGridEntityPointer(const FactoryType& factory,
518  const int level,
519  const HElementType &item,
520  const int twist,
521  const int duneFace )
522  : ALU3dGridEntityPointerBase<codim,GridImp> (factory,item,level,twist,duneFace)
523  {}
524 
525  template<int codim, class GridImp >
526  inline ALU3dGridEntityPointer<codim,GridImp> ::
527  ALU3dGridEntityPointer(const ALU3dGridEntityPointerType & org)
528  : ALU3dGridEntityPointerBase<codim,GridImp>(org)
529  {}
530 
531  template<int codim, class GridImp >
532  inline ALU3dGridEntityPointer<codim,GridImp> &
533  ALU3dGridEntityPointer<codim,GridImp>::
534  operator = (const ALU3dGridEntityPointerType & org)
535  {
536  // clone pointer
537  clone(org);
538  return *this;
539  }
540 
541  template<int codim, class GridImp >
542  inline void
543  ALU3dGridEntityPointer<codim,GridImp> ::
544  clone (const ALU3dGridEntityPointerType & org)
545  {
546  // copy key
547  seed_ = org.seed_;
548 
549  assert( &factory_ == &org.factory_ );
550 
551  // if entity exists, just remove item pointer
552  if( seed_.item() )
553  {
554  if( ! entity_ )
555  getEntity(org);
556  else
557  entityImp().setElement( seed_ );
558  }
559  else
560  this->done();
561  return ;
562  }
563 
564  template<int codim, class GridImp >
565  inline typename ALU3dGridEntityPointer<codim,GridImp>::Entity &
566  ALU3dGridEntityPointer<codim,GridImp>::dereference () const
567  {
568  // don't dereference empty entity pointer
569  assert( seed_.item() );
570  if( ! entity_ )
571  {
572  entity_ = factory_.template getNewEntity<codim> ();
573  entityImp().setElement( seed_ );
574  }
575  assert( seed_.item() == & entityImp().getItem() );
576  return (*entity_);
577  }
578 
579  template<int codim, class GridImp >
580  inline int ALU3dGridEntityPointer<codim,GridImp>::level () const
581  {
582  return seed_.level();
583  }
584 
585  template<int codim, class GridImp >
586  inline void ALU3dGridEntityPointer<codim,GridImp>::
587  updateEntityPointer( HElementType * item, int level)
588  {
589  seed_.set( *item, level );
590  if( item && entity_ )
591  {
592  entityImp().setElement( seed_ );
593  }
594  }
595 
596 
597 } // end namespace Dune
Definition: entity.hh:469
GridImp::template Codim< codimension >::Entity Entity
type of Entity
Definition: entity.hh:491
void freeEntity()
put entity to entity stack
Definition: entity_inline.hh:446
~ALU3dGridEntityPointerBase()
Destructor.
Definition: entity_inline.hh:432
int level() const
ask for level of entities
Definition: entity_inline.hh:481
ALU3dGridEntityPointerBase(const FactoryType &factory, const HElementType &item)
Constructor for EntityPointer that points to an element.
Definition: entity_inline.hh:299
bool equals(const ALU3dGridEntityPointerType &i) const
equality
Definition: entity_inline.hh:459
ALU3dGridEntitySeed< codimension, GridImp > ALU3dGridEntitySeedType
type of entity seed
Definition: entity.hh:503
Entity & dereference() const
dereferencing
Definition: entity_inline.hh:467
ThisType & operator=(const ThisType &org)
assignment operator
Definition: entity_inline.hh:381
void done()
has to be called when iterator is finished
Definition: entity_inline.hh:438
Definition: entity.hh:47
GeometryType type() const
type of geometry of this entity
Definition: entity_inline.hh:56
void setEntity(const ALU3dGridEntity< cd, dim, GridImp > &org)
set item from other entity, mainly for copy constructor of entity pointer
void removeElement()
reset item pointer to NULL
Definition: entity_inline.hh:22
int level() const
level of this element
Definition: entity_inline.hh:42
PartitionType partitionType() const
return partition type of this entity ( see grid.hh )
Definition: entity_inline.hh:49
void setGhost(const HBndSegType &ghost)
setGhost is not valid for this codim
void reset(int l)
reset item pointer to NULL
Definition: entity_inline.hh:12
const GridImp & grid() const
return reference to grid
Definition: entity.hh:147
bool equals(const ALU3dGridEntity< cd, dim, GridImp > &org) const
compare 2 elements by comparing the item pointers
Definition: entity_inline.hh:30
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:25
Class that wraps IntersectionIteratorImp of a grid and gets it's internal object from a object stack ...
Definition: intersectioniteratorwrapper.hh:233
Class that wraps IntersectionIteratorImp of a grid and gets it's internal object from a object stack ...
Definition: intersectioniteratorwrapper.hh:328
A few common exception classes.
PartitionType
Attributes used in the generic overlap model.
Definition: gridenums.hh:28
@ InteriorEntity
all interior entities
Definition: gridenums.hh:29
@ GhostEntity
ghost entities
Definition: gridenums.hh:33
Dune namespace.
Definition: alignment.hh:10
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 16, 22:29, 2024)