3 #ifndef DUNE_ALBERTA_LEVEL_HH
4 #define DUNE_ALBERTA_LEVEL_HH
26 typedef unsigned char Level;
33 static const Level isNewFlag = (1 << 7);
34 static const Level levelMask = (1 << 7) - 1;
39 template< Level flags >
51 const Level *array = (Level *)level_;
52 return array[ dofAccess_( element, 0 ) ] & levelMask;
57 return (*
this)( elementInfo.
el() );
62 const Level *array = (Level *)level_;
63 return ((array[ dofAccess_( element, 0 ) ] & isNewFlag) != 0);
68 return isNew( elementInfo.
el() );
73 CalcMaxLevel calcFromCache;
74 level_.
forEach( calcFromCache );
76 CalcMaxLevel calcFromGrid;
78 assert( calcFromCache.maxLevel() == calcFromGrid.maxLevel() );
80 return calcFromCache.maxLevel();;
90 ClearFlags< isNewFlag > clearIsNew;
99 level_.
create( dofSpace,
"Element level" );
101 level_.template setupInterpolation< Interpolation >();
103 SetLocal setLocal( level_ );
114 DofVectorPointer level_;
115 DofAccess dofAccess_;
132 dofAccess_( level.dofSpace() )
137 Level *
const array = (Level *)level_;
138 array[ dofAccess_( elementInfo, 0 ) ] = elementInfo.
level();
159 maxLevel_ =
std::max( maxLevel_, Level( dof & levelMask ) );
164 maxLevel_ =
std::max( maxLevel_, Level( elementInfo.
level() ) );
179 template< typename AlbertaGridLevelProvider< dim >::Level flags >
196 static const int dimension = dim;
204 Level *array = (Level *)dofVector;
206 for(
int i = 0; i < patch.
count(); ++i )
209 assert( (array[ dofAccess( father, 0 ) ] & levelMask) < levelMask );
210 const Level childLevel = (array[ dofAccess( father, 0 ) ] + 1) | isNewFlag;
211 for(
int i = 0; i < 2; ++i )
214 array[ dofAccess( child, 0 ) ] = childLevel;
222 #endif // #if HAVE_ALBERTA