1 #ifndef DUNE_ALBERTA_LEVEL_HH
2 #define DUNE_ALBERTA_LEVEL_HH
24 typedef unsigned char Level;
31 static const Level isNewFlag = (1 << 7);
32 static const Level levelMask = (1 << 7) - 1;
37 template< Level flags >
49 const Level *array = (Level *)level_;
50 return array[ dofAccess_( element, 0 ) ] & levelMask;
55 return (*
this)( elementInfo.
el() );
60 const Level *array = (Level *)level_;
61 return ((array[ dofAccess_( element, 0 ) ] & isNewFlag) != 0);
66 return isNew( elementInfo.
el() );
71 CalcMaxLevel calcFromCache;
72 level_.
forEach( calcFromCache );
74 CalcMaxLevel calcFromGrid;
76 assert( calcFromCache.maxLevel() == calcFromGrid.maxLevel() );
78 return calcFromCache.maxLevel();;
88 ClearFlags< isNewFlag > clearIsNew;
97 level_.
create( dofSpace,
"Element level" );
99 level_.template setupInterpolation< Interpolation >();
101 SetLocal setLocal( level_ );
112 DofVectorPointer level_;
113 DofAccess dofAccess_;
130 dofAccess_( level.dofSpace() )
135 Level *
const array = (Level *)level_;
136 array[ dofAccess_( elementInfo, 0 ) ] = elementInfo.
level();
157 maxLevel_ =
std::max( maxLevel_, Level( dof & levelMask ) );
162 maxLevel_ =
std::max( maxLevel_, Level( elementInfo.
level() ) );
177 template< typename AlbertaGridLevelProvider< dim >::Level flags >
194 static const int dimension = dim;
202 Level *array = (Level *)dofVector;
204 for(
int i = 0; i < patch.
count(); ++i )
207 assert( (array[ dofAccess( father, 0 ) ] & levelMask) < levelMask );
208 const Level childLevel = (array[ dofAccess( father, 0 ) ] + 1) | isNewFlag;
209 for(
int i = 0; i < 2; ++i )
212 array[ dofAccess( child, 0 ) ] = childLevel;
220 #endif // #if HAVE_ALBERTA