3 #ifndef DUNE_ALBERTA_ELEMENTINFO_HH
4 #define DUNE_ALBERTA_ELEMENTINFO_HH
32 struct BasicNodeProjection;
64 #if !DUNE_ALBERTA_CACHE_COORDINATES
71 explicit ElementInfo (
const InstancePtr &instance );
87 operator bool ()
const {
return (instance_ !=
null()); }
110 void setMark (
int refCount )
const;
127 template<
int codim >
128 int twist (
int subEntity )
const;
137 #if !DUNE_ALBERTA_CACHE_COORDINATES
144 template<
class Functor >
147 template<
class Functor >
167 void addReference ()
const;
168 void removeReference ()
const;
170 static InstancePtr
null ();
171 static Stack &stack ();
173 InstancePtr instance_;
195 #if !DUNE_ALBERTA_CACHE_COORDINATES
255 : macroIndex_( -1 ), level_( 0 ), path_( 0 )
258 Seed (
const int macroIndex,
const int level,
const unsigned long path )
259 : macroIndex_( macroIndex ), level_(
level ), path_( path )
267 bool operator< (
const Seed &other )
const
269 const bool ml = (macroIndex() < other.
macroIndex());
270 const bool me = (macroIndex() == other.
macroIndex());
273 const bool pl = (path() < other.
path());
274 return ml | (me & (ll | (le & pl)));
278 bool operator<= (
const Seed &other )
const {
return !(other < *
this); }
279 bool operator> (
const Seed &other )
const {
return (other < *
this); }
280 bool operator>= (
const Seed &other )
const {
return !(*
this < other); }
282 bool isValid ( )
const {
return macroIndex_ != -1; }
285 int level ()
const {
return level_; }
286 unsigned long path ()
const {
return path_; }
301 : instance_( instance )
309 : instance_( null() )
320 instance_ = stack().allocate();
321 instance_->parent() =
null();
322 ++(instance_->parent()->refCount);
326 elInfo().fill_flag = fillFlags;
329 for(
int k = 0; k < maxNeighbors; ++k )
330 elInfo().opp_vertex[ k ] = -1;
332 fill( mesh, ¯oElement, elInfo() );
341 instance_ = stack().allocate();
342 instance_->parent() =
null();
343 ++(instance_->parent()->refCount);
348 elInfo().fill_flag = fillFlags;
351 for(
int k = 0; k < maxNeighbors; ++k )
352 elInfo().opp_vertex[ k ] = -1;
354 fill( mesh, ((
Mesh *)mesh)->macro_els + seed.macroIndex(), elInfo() );
357 unsigned long path = seed.path();
358 for(
int i = 0; i < seed.level(); ++i )
360 InstancePtr child = stack().allocate();
361 child->parent() = instance_;
364 for(
int k = 0; k < maxNeighbors; ++k )
365 child->elInfo.opp_vertex[ k ] = -2;
367 fill( path & 1, elInfo(), child->elInfo );
375 assert( this->seed() == seed );
381 : instance_( other.instance_ )
391 swap( instance_, other.instance_ );
405 other.addReference();
407 instance_ = other.instance_;
416 swap( instance_, other.instance_ );
424 return (instance_->elInfo.el == other.instance_->elInfo.el);
432 return (instance_->elInfo.el != other.instance_->elInfo.el);
441 assert( elInfo().macro_el != NULL );
442 return static_cast< const MacroElement & >( *(elInfo().macro_el) );
458 const Element *father = elInfo().parent->el;
459 assert( father != NULL );
461 const int index = (father->child[ 0 ] == element ? 0 : 1);
462 assert( father->child[ index ] == element );
472 InstancePtr child = stack().allocate();
473 child->parent() = instance_;
477 for(
int k = 0; k < maxNeighbors; ++k )
478 child->elInfo.opp_vertex[ k ] = -2;
480 fill( i, elInfo(), child->elInfo );
488 assert( !(*
this) ==
false );
489 return isLeaf( el() );
499 unsigned long path = 0;
500 for( InstancePtr p = instance_; p->parent() !=
null(); p = p->parent() )
503 const Element *father = p->parent()->elInfo.el;
504 const unsigned long child = static_cast< unsigned long >( father->child[ 1 ] == element );
505 path = (path << 1) | child;
509 if( level != elInfo().level )
510 DUNE_THROW( NotImplemented,
"Seed for fake elements not implemented." );
512 return Seed( macroElement().index, level, path );
526 return mightVanish( el(), 0 );
533 return elInfo().
level;
547 return instance_->
elInfo.el_type;
562 assert( (refCount >= -128) && (refCount < 127) );
563 el()->mark = refCount;
571 assert( (face >= 0) && (face < maxNeighbors) );
573 assert( (elInfo().fill_flag & FillFlags::boundaryId) != 0 );
574 const int macroFace = elInfo().macro_wall[ face ];
576 return (macroElement().neighbor( macroFace ) != NULL);
585 assert( (face >= 0) && (face < numFaces) );
587 Library< dimWorld >::leafNeighbor( *
this, face, neighbor );
596 assert( (face >= 0) && (face < numFaces) );
597 return Library< dimWorld >::levelNeighbors( *
this, face, neighbor, faceInNeighbor );
602 template<
int codim >
612 assert( neighbor( face ) != NULL );
621 assert( (face >= 0) && (face < maxNeighbors) );
623 assert( (elInfo().fill_flag & FillFlags::boundaryId) != 0 );
624 const int macroFace = elInfo().macro_wall[ face ];
626 return macroElement().isBoundary( macroFace );
636 assert( (face >= 0) && (face < N_WALLS_MAX) );
638 assert( (elInfo().fill_flag & FillFlags::boundaryId) != 0 );
639 const int macroFace = elInfo().macro_wall[ face ];
640 const int id = macroElement().boundaryId( macroFace );
652 assert( (face >= 0) && (face < N_WALLS_MAX) );
654 assert( (elInfo().fill_flag & FillFlags::boundaryId) != 0 );
655 const int macroFace = elInfo().macro_wall[ face ];
656 return (macroFace < 0 ? NULL : macroElement().wall_trafo[ macroFace ]);
665 assert( (face >= 0) && (face < N_WALLS_MAX) );
667 assert( (elInfo().fill_flag & FillFlags::boundaryId) != 0 );
668 const int macroFace = elInfo().macro_wall[ face ];
670 return static_cast< BasicNodeProjection * >( macroElement().projection[ macroFace+1 ] );
679 return ((elInfo().fill_flag & FillFlags::coords) != 0);
685 assert( hasCoordinates() );
687 return elInfo().coord[
vertex ];
692 template<
class Functor >
698 child( 0 ).hierarchicTraverse( functor );
699 child( 1 ).hierarchicTraverse( functor );
705 template<
class Functor >
711 child( 1 ).leafTraverse( functor );
728 assert( (face >= 0) && (face < numFaces) );
729 assert( (elInfo().fill_flag & FillFlags::neighbor) != 0 );
730 return elInfo().neigh[ face ];
744 return (instance_->elInfo);
751 const Element *element,
int level,
int type )
753 InstancePtr instance = stack().allocate();
754 instance->parent() =
null();
755 ++(instance->parent()->refCount);
757 instance->
elInfo.mesh = mesh;
758 instance->elInfo.macro_el = NULL;
759 instance->elInfo.el = const_cast< Element * >( element );
760 instance->elInfo.parent = NULL;
761 instance->elInfo.fill_flag = FillFlags::nothing;
762 instance->elInfo.level = level;
763 instance->elInfo.el_type = type;
773 InstancePtr instance = stack().allocate();
774 instance->parent() =
null();
775 ++(instance->parent()->refCount);
777 instance->
elInfo = elInfo;
785 return IS_LEAF_EL( element );
790 inline bool ElementInfo< dim >::mightVanish (
Alberta::Element *element,
int depth )
792 if( isLeaf( element ) )
793 return (element->mark < depth);
795 return (mightVanish( element->child[ 0 ], depth-1 ) && mightVanish( element->child[ 1 ], depth-1 ));
800 inline void ElementInfo< dim >
803 ALBERTA fill_macro_info( mesh, mel, &elInfo );
807 inline void ElementInfo< dim >
808 ::fill (
int ichild,
const ALBERTA EL_INFO &parentInfo,
ALBERTA EL_INFO &elInfo )
810 ALBERTA fill_elinfo( ichild, FILL_ANY, &parentInfo, &elInfo );
815 inline void ElementInfo< dim >::addReference ()
const
817 ++(instance_->refCount);
822 inline void ElementInfo< dim >::removeReference ()
const
828 for( InstancePtr instance = instance_; --(instance->refCount) == 0; )
830 const InstancePtr parent = instance->parent();
831 stack().release( instance );
838 inline typename ElementInfo< dim >::InstancePtr
839 ElementInfo< dim >::null ()
841 return stack().null();
846 inline typename ElementInfo< dim >::Stack &
847 ElementInfo< dim >::stack ()
897 assert( (p !=
null()) && (p->
refCount == 0) );
914 #endif // #if HAVE_ALBERTA
916 #endif // #ifndef DUNE_ALBERTA_ELEMENTINFO_HH