13
//**********************************************************************
18
//**********************************************************************
21
//! level of this element
22
template<int cd, int dim, class GridImp>
23
inline int ALU2dGridEntity<cd, dim, GridImp> ::
27
level_ = item_->level();
29
level_ = item_->level() + 1;
35
// forward declararion of struct ElementWrapper
36
template <int codim, int dim, class GridImp>
37
struct ElementWrapper;
40
template<int cd, int dim, class GridImp>
41
inline bool ALU2dGridEntity<cd, dim, GridImp> :: equals(const ALU2dGridEntity<cd, dim, GridImp> &org) const {
42
return ElementWrapper<cd,dim, GridImp>::isTheSame (*item_, face_, *org.item_, org.face_);
46
template<int cd, int dim, class GridImp>
47
inline ALU2dGridEntity<cd, dim, GridImp> ::
48
ALU2dGridEntity(const FactoryType& factory, int level)
49
: factory_( factory ),
57
template<int cd, int dim, class GridImp>
58
inline void ALU2dGridEntity<cd,dim,GridImp>:: setElement(const ElementType &element, int face, int level) const {
59
item_= const_cast<ElementType *> (&element);
67
template<int cd, int dim, class GridImp>
68
inline void ALU2dGridEntity<cd,dim,GridImp>:: setElement( const EntitySeed& seed ) const
70
setElement( *(seed.item()), seed.face(), seed.level() );
73
//! set item pointer to NULL
74
template<int cd, int dim, class GridImp>
75
inline void ALU2dGridEntity<cd,dim,GridImp> :: removeElement() {
81
template<int cd, int dim, class GridImp>
82
inline ALU2dGridEntity<cd, dim, GridImp> ::
83
ALU2dGridEntity(const ALU2dGridEntity<cd,dim,GridImp> & org)
84
: factory_( org.factory_ ),
90
//! geometry of this entity
91
template< int cd, int dim, class GridImp >
92
inline typename ALU2dGridEntity< cd, dim, GridImp >::Geometry
93
ALU2dGridEntity< cd, dim, GridImp >::geometry () const
95
if( !geoObj_.valid() )
96
geoObj_.buildGeom( *item_,face_ );
98
assert( geoObj_.valid() );
99
return Geometry( geoObj_ );
102
//! geometry type of geometry of this entity
103
template<int cd, int dim, class GridImp>
105
ALU2dGridEntity<cd, dim, GridImp> :: type () const
107
return geoObj_.type();
110
template<int cd, int dim, class GridImp>
111
inline int ALU2dGridEntity<cd,dim,GridImp > :: getIndex() const
15
//**********************************************************************
20
//**********************************************************************
23
//! level of this element
24
template<int cd, int dim, class GridImp>
25
inline int ALU2dGridEntity<cd, dim, GridImp> ::
29
level_ = item_->level();
31
level_ = item_->level() + 1;
37
// forward declararion of struct ElementWrapper
38
template <int codim, int dim, class GridImp>
39
struct ElementWrapper;
42
template<int cd, int dim, class GridImp>
43
inline bool ALU2dGridEntity<cd, dim, GridImp> :: equals(const ALU2dGridEntity<cd, dim, GridImp> &org) const {
44
return ElementWrapper<cd,dim, GridImp>::isTheSame (*item_, face_, *org.item_, org.face_);
48
template<int cd, int dim, class GridImp>
49
inline ALU2dGridEntity<cd, dim, GridImp> ::
50
ALU2dGridEntity(const FactoryType& factory, int level)
51
: factory_( factory ),
58
template<int cd, int dim, class GridImp>
59
inline void ALU2dGridEntity<cd,dim,GridImp>:: setElement(const ElementType &element, int face, int level) const {
60
item_= const_cast<ElementType *> (&element);
68
template<int cd, int dim, class GridImp>
69
inline void ALU2dGridEntity<cd,dim,GridImp>:: setElement( const EntitySeed& seed ) const
71
setElement( *(seed.item()), seed.face(), seed.level() );
74
//! set item pointer to NULL
75
template<int cd, int dim, class GridImp>
76
inline void ALU2dGridEntity<cd,dim,GridImp> :: removeElement() {
82
template<int cd, int dim, class GridImp>
83
inline ALU2dGridEntity<cd, dim, GridImp> ::
84
ALU2dGridEntity(const ALU2dGridEntity<cd,dim,GridImp> & org)
85
: factory_( org.factory_ ),
91
//! geometry of this entity
92
template< int cd, int dim, class GridImp >
93
inline typename ALU2dGridEntity< cd, dim, GridImp >::Geometry
94
ALU2dGridEntity< cd, dim, GridImp >::geometry () const
96
if( !geoObj_.valid() )
97
geoObj_.buildGeom( *item_,face_ );
99
assert( geoObj_.valid() );
100
return Geometry( geoObj_ );
103
//! geometry type of geometry of this entity
104
template<int cd, int dim, class GridImp>
106
ALU2dGridEntity<cd, dim, GridImp> :: type () const
108
return geoObj_.type();
111
template<int cd, int dim, class GridImp>
112
inline int ALU2dGridEntity<cd,dim,GridImp > :: getIndex() const
113
114
assert(item_ != 0);
114
115
return ElementWrapper<cd, dim, GridImp>::getElemIndex (grid(), *item_, face_);
118
\brief Id of the boundary which is associated with
119
the entity, returns 0 for inner entities, arbitrary int otherwise
122
template<int cd, int dim, class GridImp>
123
inline int ALU2dGridEntity<cd,dim,GridImp> :: boundaryId() const {
124
int isBoundary=0, i=0;
119
\brief Id of the boundary which is associated with
120
the entity, returns 0 for inner entities, arbitrary int otherwise
123
template<int cd, int dim, class GridImp>
124
inline int ALU2dGridEntity<cd,dim,GridImp> :: boundaryId() const {
125
int isBoundary=0, i=0;
125
126
while(!isBoundary && i<dim) {
126
127
if (item_->nbbnd(i)!=0)
127
isBoundary = item_->nbbnd(i)->type();
128
isBoundary = item_->nbbnd(i)->type();
130
131
return isBoundary;
133
//**********************************************************************
138
//**********************************************************************
140
//! Constructor creating empty Entity
141
template<int dim, class GridImp>
142
inline ALU2dGridEntity<0,dim,GridImp> ::
143
ALU2dGridEntity(const FactoryType& factory, int level)
144
: factory_( factory )
151
template<int dim, class GridImp>
152
inline ALU2dGridEntity<0, dim, GridImp> ::
153
ALU2dGridEntity(const ALU2dGridEntity<0,dim,GridImp> & org)
154
: factory_( org.factory_ ),
160
//! level of this element
161
template<int dim, class GridImp>
162
inline int ALU2dGridEntity<0,dim,GridImp> :: level () const {
164
return (*item_).level();
167
//! geometry of this entity
168
template< int dim, class GridImp >
169
inline typename ALU2dGridEntity< 0, dim, GridImp >::Geometry
170
ALU2dGridEntity< 0, dim, GridImp >::geometry () const
172
assert( item_ != 0 );
173
if( !geoObj_.valid() )
174
geoObj_.buildGeom( *item_ );
176
assert( geoObj_.valid() );
177
return Geometry( geoObj_ );
180
//! geometry type of geometry of this entity
181
template<int dim, class GridImp>
183
ALU2dGridEntity<0, dim, GridImp> :: type () const
185
return geoObj_.type();
188
//! returns true if Entity is leaf (i.e. has no children)
189
template<int dim, class GridImp>
190
inline bool ALU2dGridEntity<0,dim,GridImp> :: isLeaf () const {
194
//! Inter-level access to father element on coarser grid.
195
//! Assumes that meshes are nested.
196
template<int dim, class GridImp>
197
inline typename ALU2dGridEntity<0, dim, GridImp> :: EntityPointer ALU2dGridEntity<0,dim,GridImp> :: father () const {
198
// don't request for father on macro level
200
return EntityPointer(factory_, *(item_->father()));
203
template<int dim, class GridImp>
204
inline int ALU2dGridEntity<0, dim, GridImp> :: nChild() const
207
return item_->childNr();
210
template< int dim, class GridImp >
211
inline typename ALU2dGridEntity< 0, dim, GridImp >::LocalGeometry
212
ALU2dGridEntity< 0, dim, GridImp >::geometryInFather () const
214
assert( level() > 0 );
216
const GeometryType myType = type();
217
// we need to storages in case of cube grid,
218
// one for quadrilaterals and one for triangles
219
if( (GridImp::elementType != ALU2DSPACE triangle) && myType.isCube() )
221
assert( grid().nonConform() );
222
static ALULocalGeometryStorage< GridImp, LocalGeometryImpl, 4 > geoms( myType, true );
223
return LocalGeometry( geoms[ nChild() ] );
227
if( grid().nonConform() )
229
static ALULocalGeometryStorage< GridImp, LocalGeometryImpl, 4 > geoms( myType, true );
230
return LocalGeometry( geoms[ nChild() ] );
234
static ALULocalGeometryStorage< GridImp, LocalGeometryImpl, 2 > geoms( myType, false );
235
return LocalGeometry( geoms[ nChild() ] );
240
template<int dim, class GridImp>
241
inline int ALU2dGridEntity<0,dim,GridImp> :: getIndex() const {
243
return (*item_).getIndex();
246
// forward declararion of struct ElementWrapper
247
//template <int codim, int dim, class GridImp>
248
// struct ElementWrapper;
250
template<int dim, class GridImp>
252
inline int ALU2dGridEntity<0,dim,GridImp> :: getSubIndex(int i) const {
254
return ElementWrapper<cc, dim, GridImp>::subIndex (grid(), *item_,i);
257
//! Provide access to mesh entity i of given codimension. Entities
258
//! are numbered 0 ... count<cc>()-1
259
template<int dim, class GridImp>
261
inline typename ALU2dGridEntity<0,dim,GridImp > ::template Codim<cc> :: EntityPointer
262
ALU2dGridEntity<0,dim,GridImp> :: entity (int i) const {
264
return ElementWrapper<cc,dim, GridImp>::subEntity (factory(), *item_, i);
267
template<int dim, class GridImp>
269
inline int ALU2dGridEntity<0,dim,GridImp> :: subBoundaryId ( int i ) const {
271
return ElementWrapper<cc, dim, GridImp>::subBoundary (grid(), *item_,i);
274
template<int dim, class GridImp>
275
inline int ALU2dGridEntity<0,dim,GridImp> :: subIndex(int i, unsigned int codim) const
277
assert( item_ != 0 );
134
//**********************************************************************
139
//**********************************************************************
141
//! Constructor creating empty Entity
142
template<int dim, class GridImp>
143
inline ALU2dGridEntity<0,dim,GridImp> ::
144
ALU2dGridEntity(const FactoryType& factory, int level)
145
: factory_( factory )
151
template<int dim, class GridImp>
152
inline ALU2dGridEntity<0, dim, GridImp> ::
153
ALU2dGridEntity(const ALU2dGridEntity<0,dim,GridImp> & org)
154
: factory_( org.factory_ ),
159
//! level of this element
160
template<int dim, class GridImp>
161
inline int ALU2dGridEntity<0,dim,GridImp> :: level () const {
163
return (*item_).level();
166
//! geometry of this entity
167
template< int dim, class GridImp >
168
inline typename ALU2dGridEntity< 0, dim, GridImp >::Geometry
169
ALU2dGridEntity< 0, dim, GridImp >::geometry () const
171
assert( item_ != 0 );
172
if( !geoObj_.valid() )
173
geoObj_.buildGeom( *item_ );
175
assert( geoObj_.valid() );
176
return Geometry( geoObj_ );
179
//! geometry type of geometry of this entity
180
template<int dim, class GridImp>
182
ALU2dGridEntity<0, dim, GridImp> :: type () const
184
return geoObj_.type();
187
//! returns true if Entity is leaf (i.e. has no children)
188
template<int dim, class GridImp>
189
inline bool ALU2dGridEntity<0,dim,GridImp> :: isLeaf () const {
193
//! Inter-level access to father element on coarser grid.
194
//! Assumes that meshes are nested.
195
template<int dim, class GridImp>
196
inline typename ALU2dGridEntity<0, dim, GridImp> :: EntityPointer ALU2dGridEntity<0,dim,GridImp> :: father () const {
197
// don't request for father on macro level
199
return EntityPointer(factory_, *(item_->father()));
202
template<int dim, class GridImp>
203
inline int ALU2dGridEntity<0, dim, GridImp> :: nChild() const
206
return item_->childNr();
209
template< int dim, class GridImp >
210
inline typename ALU2dGridEntity< 0, dim, GridImp >::LocalGeometry
211
ALU2dGridEntity< 0, dim, GridImp >::geometryInFather () const
213
assert( level() > 0 );
215
const GeometryType myType = type();
216
// we need to storages in case of cube grid,
217
// one for quadrilaterals and one for triangles
218
if( (GridImp::elementType != ALU2DSPACE triangle) && myType.isCube() )
220
assert( grid().nonConform() );
221
typedef ALULocalGeometryStorage< GridImp, LocalGeometryImpl, 4 > GeometryStorage;
222
return LocalGeometry( GeometryStorage::geom( myType, true, nChild() ) );
226
if( grid().nonConform() )
228
typedef ALULocalGeometryStorage< GridImp, LocalGeometryImpl, 4 > GeometryStorage;
229
return LocalGeometry( GeometryStorage::geom( myType, true, nChild() ) );
233
typedef ALULocalGeometryStorage< GridImp, LocalGeometryImpl, 2 > GeometryStorage;
234
return LocalGeometry( GeometryStorage::geom( myType, false, nChild() ) );
239
template<int dim, class GridImp>
240
inline int ALU2dGridEntity<0,dim,GridImp> :: getIndex() const {
242
return (*item_).getIndex();
245
// forward declararion of struct ElementWrapper
246
//template <int codim, int dim, class GridImp>
247
// struct ElementWrapper;
249
template<int dim, class GridImp>
251
inline int ALU2dGridEntity<0,dim,GridImp> :: getSubIndex(int i) const {
253
return ElementWrapper<cc, dim, GridImp>::subIndex (grid(), *item_,i);
256
//! Provide access to mesh entity i of given codimension. Entities
257
//! are numbered 0 ... count<cc>()-1
258
template<int dim, class GridImp>
260
inline typename ALU2dGridEntity<0,dim,GridImp > ::template Codim<cc> :: EntityPointer
261
ALU2dGridEntity<0,dim,GridImp> :: entity (int i) const {
263
return ElementWrapper<cc,dim, GridImp>::subEntity (factory(), *item_, i);
266
template<int dim, class GridImp>
268
inline int ALU2dGridEntity<0,dim,GridImp> :: subBoundaryId ( int i ) const {
270
return ElementWrapper<cc, dim, GridImp>::subBoundary (grid(), *item_,i);
273
template<int dim, class GridImp>
274
inline int ALU2dGridEntity<0,dim,GridImp> :: subIndex(int i, unsigned int codim) const
276
assert( item_ != 0 );
282
281
return ElementWrapper<0, dim, GridImp>::subIndex (grid(), *item_, j);
284
// also apply mapping to generic ref elem by switching edges
285
if( item_->numvertices() == 3 )
283
// also apply mapping to generic ref elem by switching edges
284
if( item_->numvertices() == 3 )
288
switch (i) { case 0: j=2;break;
293
// j = ((i^2)>>1) | ((i&1)<<1);
287
switch (i) { case 0 : j=2;break;
291
// j = ((i^2)>>1) | ((i&1)<<1);
294
292
return ElementWrapper<1, dim, GridImp>::subIndex (grid(), *item_, j);
296
if( item_->numvertices() == 4 )
297
switch (i) { case 0: j=0;break;
294
if( item_->numvertices() == 4 )
295
switch (i) { case 0 : j=0;break;
302
299
return ElementWrapper<2, dim, GridImp>::subIndex (grid(), *item_, j);
309
//***************************************************************
310
// Interface for Adaptation
311
//***************************************************************
312
//! marks an element for refCount refines. if refCount is negative the
313
//! element is coarsend -refCount times
314
//! mark returns true if element was marked, otherwise false
315
template<int dim, class GridImp>
316
inline bool ALU2dGridEntity<0,dim,GridImp> :: mark( int refCount ) const
318
if( !isLeaf() ) return false;
320
// if this assertion is thrown then you try to mark a non leaf entity
321
// which is leads to unpredictable results
324
// mark for coarsening
327
if(level() <= 0) return false;
328
item_->ALU2DSPACE Refco_el::mark(ALU2DSPACE Refco::crs);
332
// mark for refinement
335
item_->ALU2DSPACE Refco_el::mark(ALU2DSPACE Refco::ref);
340
item_->ALU2DSPACE Refco_el::mark(ALU2DSPACE Refco::none);
344
template<int dim, class GridImp>
345
inline int ALU2dGridEntity<0,dim,GridImp> :: getMark() const
348
if(item_->ALU2DSPACE Refco_el::is(ALU2DSPACE Refco::ref)) return 1;
349
if(item_->ALU2DSPACE Refco_el::is(ALU2DSPACE Refco::crs)) return -1;
350
assert( item_->ALU2DSPACE Refco_el::is(ALU2DSPACE Refco::none) );
354
/*! private methods, but public because of datahandle and template
355
arguments of these methods
357
template<int dim, class GridImp>
358
inline void ALU2dGridEntity<0,dim,GridImp> ::
359
setElement(const HElementType &element, int face, int level) const
361
item_= const_cast<HElementType *> (&element);
362
isLeaf_ = ((*item_).down() == 0);
364
geoObj_.invalidate();
367
template<int dim, class GridImp>
368
inline void ALU2dGridEntity<0,dim,GridImp> ::
369
setElement(const EntitySeed& seed ) const
371
setElement( *(seed.item()) );//, seed.face(), seed.level() );
375
//! set actual walk level
376
template<int dim, class GridImp>
377
inline void ALU2dGridEntity<0,dim,GridImp> :: reset ( int l )
382
geoObj_.invalidate();
385
//! set item pointer to NULL
386
template<int dim, class GridImp>
387
inline void ALU2dGridEntity<0,dim,GridImp> :: removeElement() {
389
geoObj_.invalidate();
392
//! compare 2 entities, which means compare the item pointers
393
template<int dim, class GridImp>
394
inline bool ALU2dGridEntity<0,dim,GridImp> :: equals ( const ALU2dGridEntity<0,dim,GridImp> & org ) const {
395
return (item_ == org.item_);
399
//**********************************************************************
404
//**********************************************************************
406
//! has to be called when iterator is finished
407
template<int cd, class GridImp>
408
inline void ALU2dGridEntityPointer<cd, GridImp> :: done()
410
// sets entity pointer in the status of an empty entity
413
entityImp().removeElement();
414
factory_.template freeEntity< cd > ( entity_ );
420
template<int cd, class GridImp>
421
inline bool ALU2dGridEntityPointer<cd, GridImp> :: equals(const ALU2dGridEntityPointer<cd, GridImp> & i) const
423
return seed_ == i.seed_;
426
//! update underlying item pointer and set entity
427
template<int cd, class GridImp>
428
inline void ALU2dGridEntityPointer<cd, GridImp> :: updateEntityPointer(ElementType * item, int face, int level)
431
seed_.set( *item, level, face );
435
entityImp().setElement( seed_ );
439
//! Constructor for EntityPointer that points to an element
440
template<int cd, class GridImp>
441
inline ALU2dGridEntityPointer<cd, GridImp>::
442
ALU2dGridEntityPointer(const FactoryType& factory,
443
const ElementType& item, int face, int level)
444
: factory_( factory )
445
, seed_( item, level, face )
449
//! Constructor for EntityPointer that points to an element
450
template<int cd, class GridImp>
451
inline ALU2dGridEntityPointer<cd, GridImp>::
452
ALU2dGridEntityPointer(const EntityImp& entity)
453
: factory_( entity.factory() )
454
, seed_( entity.getItem(), entity.level(), entity.getFace() )
458
//! Constructor for EntityPointer that points to an element
459
template<int cd, class GridImp>
460
inline ALU2dGridEntityPointer<cd, GridImp>::
461
ALU2dGridEntityPointer(const FactoryType& factory, const EntitySeed& seed)
462
: factory_( factory )
306
//***************************************************************
307
// Interface for Adaptation
308
//***************************************************************
309
//! marks an element for refCount refines. if refCount is negative the
310
//! element is coarsend -refCount times
311
//! mark returns true if element was marked, otherwise false
312
template<int dim, class GridImp>
313
inline bool ALU2dGridEntity<0,dim,GridImp> :: mark( int refCount ) const
315
if( !isLeaf() ) return false;
317
// if this assertion is thrown then you try to mark a non leaf entity
318
// which is leads to unpredictable results
321
// mark for coarsening
324
if(level() <= 0) return false;
325
item_->ALU2DSPACE Refco_el::mark(ALU2DSPACE Refco::crs);
329
// mark for refinement
332
item_->ALU2DSPACE Refco_el::mark(ALU2DSPACE Refco::ref);
337
item_->ALU2DSPACE Refco_el::mark(ALU2DSPACE Refco::none);
341
template<int dim, class GridImp>
342
inline int ALU2dGridEntity<0,dim,GridImp> :: getMark() const
345
if(item_->ALU2DSPACE Refco_el::is(ALU2DSPACE Refco::ref)) return 1;
346
if(item_->ALU2DSPACE Refco_el::is(ALU2DSPACE Refco::crs)) return -1;
347
assert( item_->ALU2DSPACE Refco_el::is(ALU2DSPACE Refco::none) );
351
/*! private methods, but public because of datahandle and template
352
arguments of these methods
354
template<int dim, class GridImp>
355
inline void ALU2dGridEntity<0,dim,GridImp> ::
356
setElement(const HElementType &element, int face, int level) const
358
item_= const_cast<HElementType *> (&element);
359
isLeaf_ = ((*item_).down() == 0);
361
geoObj_.invalidate();
364
template<int dim, class GridImp>
365
inline void ALU2dGridEntity<0,dim,GridImp> ::
366
setElement(const EntitySeed& seed ) const
368
setElement( *(seed.item()) ); //, seed.face(), seed.level() );
372
//! set actual walk level
373
template<int dim, class GridImp>
374
inline void ALU2dGridEntity<0,dim,GridImp> :: reset ( int l )
379
geoObj_.invalidate();
382
//! set item pointer to NULL
383
template<int dim, class GridImp>
384
inline void ALU2dGridEntity<0,dim,GridImp> :: removeElement() {
386
geoObj_.invalidate();
389
//! compare 2 entities, which means compare the item pointers
390
template<int dim, class GridImp>
391
inline bool ALU2dGridEntity<0,dim,GridImp> :: equals ( const ALU2dGridEntity<0,dim,GridImp> & org ) const {
392
return (item_ == org.item_);
396
//**********************************************************************
401
//**********************************************************************
403
//! has to be called when iterator is finished
404
template<int cd, class GridImp>
405
inline void ALU2dGridEntityPointer<cd, GridImp> :: done()
407
// sets entity pointer in the status of an empty entity
410
entityImp().removeElement();
411
factory_.template freeEntity< cd > ( entity_ );
417
template<int cd, class GridImp>
418
inline bool ALU2dGridEntityPointer<cd, GridImp> :: equals(const ALU2dGridEntityPointer<cd, GridImp> & i) const
420
return seed_ == i.seed_;
423
//! update underlying item pointer and set entity
424
template<int cd, class GridImp>
425
inline void ALU2dGridEntityPointer<cd, GridImp> :: updateEntityPointer(ElementType * item, int face, int level)
428
seed_.set( *item, level, face );
432
entityImp().setElement( seed_ );
436
//! Constructor for EntityPointer that points to an element
437
template<int cd, class GridImp>
438
inline ALU2dGridEntityPointer<cd, GridImp>::
439
ALU2dGridEntityPointer(const FactoryType& factory,
440
const ElementType& item, int face, int level)
441
: factory_( factory )
442
, seed_( item, level, face )
446
//! Constructor for EntityPointer that points to an element
447
template<int cd, class GridImp>
448
inline ALU2dGridEntityPointer<cd, GridImp>::
449
ALU2dGridEntityPointer(const EntityImp& entity)
450
: factory_( entity.factory() )
451
, seed_( entity.getItem(), entity.level(), entity.getFace() )
455
//! Constructor for EntityPointer that points to an element
456
template<int cd, class GridImp>
457
inline ALU2dGridEntityPointer<cd, GridImp>::
458
ALU2dGridEntityPointer(const FactoryType& factory, const EntitySeed& seed)
459
: factory_( factory )
467
464
//! Constructor for EntityPointer init of Level- and LeafIterator
468
template<int cd, class GridImp>
469
inline ALU2dGridEntityPointer<cd, GridImp>:: ALU2dGridEntityPointer(const FactoryType& factory)
470
: factory_( factory )
465
template<int cd, class GridImp>
466
inline ALU2dGridEntityPointer<cd, GridImp>:: ALU2dGridEntityPointer(const FactoryType& factory)
467
: factory_( factory )
475
472
//! Copy Constructor
476
template<int cd, class GridImp>
477
inline ALU2dGridEntityPointer<cd, GridImp>:: ALU2dGridEntityPointer(const ThisType & org)
478
: factory_( org.factory_ )
484
template<int cd, class GridImp>
485
inline ALU2dGridEntityPointer<cd, GridImp>::~ALU2dGridEntityPointer()
491
template<int cd, class GridImp>
492
inline typename ALU2dGridEntityPointer<cd, GridImp>::Entity &
493
ALU2dGridEntityPointer<cd, GridImp>:: dereference() const
497
entity_ = factory_.template getNewEntity<cd> (level());
498
entityImp().setElement( seed_ );
504
//! ask for level of entities
505
template<int cd, class GridImp>
506
inline int ALU2dGridEntityPointer<cd, GridImp>:: level () const
508
assert( seed_.level() >= 0 );
509
return seed_.level();
512
template<int cd, class GridImp>
513
inline typename ALU2dGridEntityPointer<cd, GridImp>:: ThisType &
514
ALU2dGridEntityPointer<cd, GridImp>:: operator = (const typename ALU2dGridEntityPointer<cd, GridImp>::ThisType & org)
517
assert(&factory_ == &org.factory_);
518
seed_ = org.seed_; // copy seed
519
entity_ = 0; // is set when dereference is called
523
template<int cd, class GridImp>
524
inline typename ALU2dGridEntityPointer<cd, GridImp>::EntityImp & ALU2dGridEntityPointer<cd, GridImp>::entityImp()
527
return GridImp :: getRealImplementation(*entity_);
530
template<int cd, class GridImp>
531
inline const typename ALU2dGridEntityPointer<cd, GridImp>:: EntityImp &
532
ALU2dGridEntityPointer<cd, GridImp>::entityImp() const {
534
return GridImp :: getRealImplementation(*entity_);
537
//********* begin struct ElementWrapper ********************
538
//template <int codim, int dim, class GridImp>
539
//struct ElementWrapper;
540
// partial specialisation for codim
543
//**********************************************************
545
// specialisation for elements
546
template<int dim, class GridImp>
547
struct ElementWrapper<0,dim, GridImp>
549
typedef typename ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType >::HElementType HElementType ;
550
typedef typename GridImp :: GridObjectFactoryType FactoryType;
552
static inline int getElemIndex(GridImp & grid, const HElementType &elem, int i) {
554
return elem.getIndex();
556
static inline int subIndex(GridImp & grid, const HElementType &elem, int i) {
558
return elem.getIndex();
560
static inline typename ALU2dGridEntity<0,dim,GridImp > :: template Codim<0>:: EntityPointer
561
subEntity(const FactoryType& factory, const HElementType &elem, int i) {
563
return ALU2dGridEntityPointer<0, GridImp > (factory, elem, -1, elem.level());
565
static inline int subBoundary(GridImp & grid, const HElementType &elem, int i) {
567
return elem.nbbnd(i)->type();
570
static inline bool isTheSame(const HElementType * elem, int face, const HElementType * org, int org_face) {
571
return (elem == org);
575
// specialisation for edges
576
template<int dim, class GridImp>
577
struct ElementWrapper<1, dim, GridImp>{
579
typedef typename ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType >::HElementType HElementType ;
580
typedef typename GridImp :: GridObjectFactoryType FactoryType;
582
static inline int getElemIndex(GridImp & grid, const HElementType &elem, int i)
584
assert(i < elem.numvertices() && i >= 0);
585
return elem.edge_idx(i);
587
static inline int subIndex(GridImp & grid, const HElementType &elem, int i)
589
assert(i < elem.numvertices() && i >= 0);
590
return elem.edge_idx(i);
592
static inline typename ALU2dGridEntity<0,dim,GridImp > :: template Codim<1>:: EntityPointer
593
subEntity(const FactoryType& factory, const HElementType &elem, int i)
595
assert(i < elem.numvertices() && i >= 0);
596
return ALU2dGridEntityPointer<1, GridImp > (factory, elem, i, elem.level());
598
static inline int subBoundary(GridImp & grid, const HElementType &elem, int i) {
599
DUNE_THROW(NotImplemented, "Not yet implemented for this codim!");
602
static inline bool isTheSame(const HElementType * elem, int face, const HElementType * org, int org_face)
606
if (face == org_face)
612
if (elem != 0 && org != 0)
613
return (elem->edge_idx(face) == org->edge_idx(org_face));
619
// specialisation for vertices
620
template<int dim, class GridImp>
621
struct ElementWrapper<2, dim, GridImp>{
623
typedef typename ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType >::HElementType HElementType ;
624
typedef typename ALU2dImplInterface< 0, GridImp::dimensionworld, GridImp::elementType >::Type VertexType;
625
typedef typename GridImp :: GridObjectFactoryType FactoryType;
627
static inline int getElemIndex(GridImp & grid, const VertexType &elem, int) {
628
return elem.getIndex();
630
static inline int subIndex(GridImp & grid, const HElementType &elem, int i) {
631
assert(i < elem.numvertices() && i >= 0);
632
//return elem.vertex(i)->getIndex();
633
return elem.getVertex(i)->getIndex();
635
static inline typename ALU2dGridEntity<0,dim,GridImp > :: template Codim<2>:: EntityPointer
636
subEntity(const FactoryType& factory, const HElementType &elem, int i)
638
assert(i < elem.numvertices() && i >= 0);
639
//return ALU2dGridEntityPointer<2, GridImp > (grid, *(elem.vertex(i)), -1, elem.level());
640
return ALU2dGridEntityPointer<2, GridImp > (factory, *(elem.getVertex(i)), -1, elem.level());
642
static inline int subBoundary(GridImp & grid, const HElementType &elem, int i) {
643
DUNE_THROW(NotImplemented, "Not yet implemented this codim!");
646
static inline bool isTheSame(const VertexType * elem, int face, const VertexType * org, int org_face) {
647
return (elem == org);
651
//********* end struct ElementWrapper ********************
655
} //end namespace Dune
473
template<int cd, class GridImp>
474
inline ALU2dGridEntityPointer<cd, GridImp>:: ALU2dGridEntityPointer(const ThisType & org)
475
: factory_( org.factory_ )
481
template<int cd, class GridImp>
482
inline ALU2dGridEntityPointer<cd, GridImp>::~ALU2dGridEntityPointer()
488
template<int cd, class GridImp>
489
inline typename ALU2dGridEntityPointer<cd, GridImp>::Entity &
490
ALU2dGridEntityPointer<cd, GridImp>:: dereference() const
494
entity_ = factory_.template getNewEntity<cd> (level());
495
entityImp().setElement( seed_ );
501
//! ask for level of entities
502
template<int cd, class GridImp>
503
inline int ALU2dGridEntityPointer<cd, GridImp>:: level () const
505
assert( seed_.level() >= 0 );
506
return seed_.level();
509
template<int cd, class GridImp>
510
inline typename ALU2dGridEntityPointer<cd, GridImp>:: ThisType &
511
ALU2dGridEntityPointer<cd, GridImp>:: operator = (const typename ALU2dGridEntityPointer<cd, GridImp>::ThisType & org)
514
assert(&factory_ == &org.factory_);
515
seed_ = org.seed_; // copy seed
516
entity_ = 0; // is set when dereference is called
520
template<int cd, class GridImp>
521
inline typename ALU2dGridEntityPointer<cd, GridImp>::EntityImp & ALU2dGridEntityPointer<cd, GridImp>::entityImp()
524
return GridImp :: getRealImplementation(*entity_);
527
template<int cd, class GridImp>
528
inline const typename ALU2dGridEntityPointer<cd, GridImp>:: EntityImp &
529
ALU2dGridEntityPointer<cd, GridImp>::entityImp() const {
531
return GridImp :: getRealImplementation(*entity_);
534
//********* begin struct ElementWrapper ********************
535
//template <int codim, int dim, class GridImp>
536
//struct ElementWrapper;
537
// partial specialisation for codim
540
//**********************************************************
542
// specialisation for elements
543
template<int dim, class GridImp>
544
struct ElementWrapper<0,dim, GridImp>
546
typedef typename ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType >::HElementType HElementType ;
547
typedef typename GridImp :: GridObjectFactoryType FactoryType;
549
static inline int getElemIndex(GridImp & grid, const HElementType &elem, int i) {
551
return elem.getIndex();
553
static inline int subIndex(GridImp & grid, const HElementType &elem, int i) {
555
return elem.getIndex();
557
static inline typename ALU2dGridEntity<0,dim,GridImp > :: template Codim<0>:: EntityPointer
558
subEntity(const FactoryType& factory, const HElementType &elem, int i) {
560
return ALU2dGridEntityPointer<0, GridImp > (factory, elem, -1, elem.level());
562
static inline int subBoundary(GridImp & grid, const HElementType &elem, int i) {
564
return elem.nbbnd(i)->type();
567
static inline bool isTheSame(const HElementType * elem, int face, const HElementType * org, int org_face) {
568
return (elem == org);
572
// specialisation for edges
573
template<int dim, class GridImp>
574
struct ElementWrapper<1, dim, GridImp>{
576
typedef typename ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType >::HElementType HElementType ;
577
typedef typename GridImp :: GridObjectFactoryType FactoryType;
579
static inline int getElemIndex(GridImp & grid, const HElementType &elem, int i)
581
assert(i < elem.numvertices() && i >= 0);
582
return elem.edge_idx(i);
584
static inline int subIndex(GridImp & grid, const HElementType &elem, int i)
586
assert(i < elem.numvertices() && i >= 0);
587
return elem.edge_idx(i);
589
static inline typename ALU2dGridEntity<0,dim,GridImp > :: template Codim<1>:: EntityPointer
590
subEntity(const FactoryType& factory, const HElementType &elem, int i)
592
assert(i < elem.numvertices() && i >= 0);
593
return ALU2dGridEntityPointer<1, GridImp > (factory, elem, i, elem.level());
595
static inline int subBoundary(GridImp & grid, const HElementType &elem, int i) {
596
DUNE_THROW(NotImplemented, "Not yet implemented for this codim!");
599
static inline bool isTheSame(const HElementType * elem, int face, const HElementType * org, int org_face)
603
if (face == org_face)
609
if (elem != 0 && org != 0)
610
return (elem->edge_idx(face) == org->edge_idx(org_face));
616
// specialisation for vertices
617
template<int dim, class GridImp>
618
struct ElementWrapper<2, dim, GridImp>{
620
typedef typename ALU2dImplTraits< GridImp::dimensionworld, GridImp::elementType >::HElementType HElementType ;
621
typedef typename ALU2dImplInterface< 0, GridImp::dimensionworld, GridImp::elementType >::Type VertexType;
622
typedef typename GridImp :: GridObjectFactoryType FactoryType;
624
static inline int getElemIndex(GridImp & grid, const VertexType &elem, int) {
625
return elem.getIndex();
627
static inline int subIndex(GridImp & grid, const HElementType &elem, int i) {
628
assert(i < elem.numvertices() && i >= 0);
629
//return elem.vertex(i)->getIndex();
630
return elem.getVertex(i)->getIndex();
632
static inline typename ALU2dGridEntity<0,dim,GridImp > :: template Codim<2>:: EntityPointer
633
subEntity(const FactoryType& factory, const HElementType &elem, int i)
635
assert(i < elem.numvertices() && i >= 0);
636
//return ALU2dGridEntityPointer<2, GridImp > (grid, *(elem.vertex(i)), -1, elem.level());
637
return ALU2dGridEntityPointer<2, GridImp > (factory, *(elem.getVertex(i)), -1, elem.level());
639
static inline int subBoundary(GridImp & grid, const HElementType &elem, int i) {
640
DUNE_THROW(NotImplemented, "Not yet implemented this codim!");
643
static inline bool isTheSame(const VertexType * elem, int face, const VertexType * org, int org_face) {
644
return (elem == org);
648
//********* end struct ElementWrapper ********************
652
} //end namespace Dune