3 #ifndef DUNE_ALBERTA_MISC_HH
4 #define DUNE_ALBERTA_MISC_HH
8 #include <dune/common/exceptions.hh>
9 #include <dune/common/typetraits.hh>
10 #include <dune/common/forloop.hh>
17 #ifndef DUNE_ALBERTA_CACHE_COORDINATES
18 #define DUNE_ALBERTA_CACHE_COORDINATES 1
69 template<
class Data >
72 return MEM_ALLOC( size, Data );
75 template<
class Data >
78 return MEM_CALLOC( size, Data );
81 template<
class Data >
82 inline Data *
memReAlloc ( Data *ptr,
size_t oldSize,
size_t newSize )
84 return MEM_REALLOC( ptr, oldSize, newSize, Data );
87 template<
class Data >
88 inline void memFree ( Data *ptr,
size_t size )
90 return MEM_FREE( ptr, size, Data );
107 Matrix identityMatrix_;
115 identityMatrix_[ i ][ j ] =
Real( 0 );
116 identityMatrix_[ i ][ i ] =
Real( 1 );
117 nullVector_[ i ] =
Real( 0 );
121 static This &instance ()
123 static This theInstance;
130 return instance().identityMatrix_;
135 return instance().nullVector_;
144 template<
int dim,
int codim >
150 static const int value = 1;
156 static const int value = dim+1;
162 static const int value = 1;
168 static const int value = 3;
174 static const int value = 4;
180 static const int value = 6;
188 template<
int dim,
int codim >
194 static const int value = CENTER;
200 static const int value = VERTEX;
206 static const int value = EDGE;
212 static const int value = FACE;
218 static const int value = EDGE;
237 static const Flags
orientation = (dim == 3 ? FILL_ORIENTATION : FILL_NOTHING);
247 static const Flags
all = coords | neighbor | boundaryId | nonPeriodic
252 #if DUNE_ALBERTA_CACHE_COORDINATES
253 static const Flags
standard = standardWithCoords & ~coords;
281 template<
int dim,
int codim >
298 assert( (i >= 0) && (i < numSubEntities) );
299 static int dune2alberta[ numSubEntities ] = { 0, 3, 1, 2, 4, 5 };
300 return dune2alberta[ i ];
309 template<
int dim,
int codim >
346 assert( (i >= 0) && (i < numSubEntities) );
347 static int generic2alberta[ numSubEntities ] = { 0, 1, 3, 2, 4, 5 };
348 return generic2alberta[ i ];
357 template<
int dim,
template<
int,
int >
class Numbering = Generic2AlbertaNumbering >
362 template<
int codim >
365 int *dune2alberta_[ dim+1 ];
366 int *alberta2dune_[ dim+1 ];
367 int numSubEntities_[ dim+1 ];
370 This &operator= (
const This & );
375 ForLoop< Initialize, 0, dim >::apply( *
this );
380 for(
int codim = 0; codim <= dim; ++codim )
382 delete[]( dune2alberta_[ codim ] );
383 delete[]( alberta2dune_[ codim ] );
389 assert( (codim >= 0) && (codim <= dim) );
391 return dune2alberta_[ codim ][ i ];
396 assert( (codim >= 0) && (codim <= dim) );
398 return alberta2dune_[ codim ][ i ];
403 assert( (codim >= 0) && (codim <= dim) );
404 return numSubEntities_[ codim ];
413 template<
int dim,
template<
int,
int >
class Numbering >
414 template<
int codim >
415 struct NumberingMap< dim, Numbering >::Initialize
417 static const int numSubEntities = NumSubEntities< dim, codim >::value;
419 static void apply ( NumberingMap< dim, Numbering > &map )
427 const int j = Numbering< dim, codim >::apply( i );
428 map.dune2alberta_[ codim ][ i ] = j;
429 map.alberta2dune_[ codim ][ j ] = i;
439 template<
int dim,
int codim >
447 assert( subEntity == 0 );
458 assert( (subEntity >= 0) && (subEntity < 3) );
459 assert( (vertex >= 0) && (vertex < 2) );
461 static const int map[ 3 ][ 2 ] = { {1,2}, {0,2}, {0,1} };
462 return map[ subEntity ][
vertex ];
471 assert( (subEntity >= 0) && (subEntity < 4) );
472 assert( (vertex >= 0) && (vertex < 3) );
474 static const int map[ 4 ][ 3 ] = { {1,2,3}, {0,2,3}, {0,1,3}, {0,1,2} };
475 return map[ subEntity ][
vertex ];
484 assert( (subEntity >= 0) && (subEntity < 6) );
485 assert( (vertex >= 0) && (vertex < 2) );
486 static const int map[ 6 ][ 2 ] = { {0,1}, {0,2}, {0,3}, {1,2}, {1,3}, {2,3} };
487 return map[ subEntity ][
vertex ];
497 assert( vertex == 0 );
527 template<
int dim,
int subdim >
535 static int twist (
const Element *element,
int subEntity )
537 assert( (subEntity >= 0) && (subEntity < numSubEntities) );
550 static int twist (
const Element *element,
int subEntity )
552 assert( (subEntity >= 0) && (subEntity < numSubEntities) );
554 int dof[ numVertices ];
555 for(
int i = 0; i < numVertices; ++i )
558 dof[ i ] = element->dof[ j ][ 0 ];
560 return (dof[ 0 ] < dof[ 1 ] ? 0 : 1);
571 static int twist (
const Element *element,
int subEntity )
573 assert( subEntity == 0 );
587 static int twist (
const Element *element,
int subEntity )
589 assert( (subEntity >= 0) && (subEntity < numSubEntities) );
591 int dof[ numVertices ];
592 for(
int i = 0; i < numVertices; ++i )
595 dof[ i ] = element->dof[ j ][ 0 ];
598 const int twist[ 8 ] = { -2, 1, 666, -1, 2, 666, -3, 0 };
599 const int k = int( dof[ 0 ] < dof[ 1 ] )
600 | (int( dof[ 0 ] < dof[ 2 ] ) << 1)
601 | (
int( dof[ 1 ] < dof[ 2 ] ) << 2);
602 assert( twist[ k ] != 666 );
614 static int twist (
const Element *element,
int subEntity )
616 assert( subEntity == 0 );
627 return (twist < 0 ? (2*numCorners + 1 - i + twist) : i + twist) % numCorners;
634 return (twist < 0 ? (2*numCorners + 1 - i + twist) : numCorners + i - twist) % numCorners;
641 #endif // #if HAVE_ALBERTA
643 #endif // #ifndef DUNE_ALBERTA_MISC_HH
static const Flags orientation
Definition: misc.hh:237
static const Flags nothing
Definition: misc.hh:231
static const int value
Definition: misc.hh:267
static int twist(const Element *element, int subEntity)
Definition: misc.hh:614
static const int maxTwist
Definition: misc.hh:533
static const Flags all
Definition: misc.hh:247
ALBERTA REAL_B LocalVector
Definition: misc.hh:46
static int apply(const int i)
Definition: misc.hh:332
ALBERTA REAL_D GlobalVector
Definition: misc.hh:47
int applyTwist(int twist, int i)
Definition: misc.hh:624
static const int meshRefined
Definition: misc.hh:53
static const Flags coords
Definition: misc.hh:233
static const int dimWorld
Definition: misc.hh:43
static const Flags elementType
Definition: misc.hh:241
static int apply(int subEntity, int vertex)
Definition: misc.hh:494
#define ALBERTA
Definition: albertaheader.hh:27
Data * memCAlloc(size_t size)
Definition: misc.hh:76
int numSubEntities(int codim) const
Definition: misc.hh:401
ALBERTA MESH Mesh
Definition: misc.hh:50
static int apply(const int i)
Definition: misc.hh:284
static int twist(const Element *element, int subEntity)
Definition: misc.hh:571
ALBERTA REAL Real
Definition: misc.hh:45
int applyInverseTwist(int twist, int i)
Definition: misc.hh:631
void memFree(Data *ptr, size_t size)
Definition: misc.hh:88
static int apply(int subEntity, int vertex)
Definition: misc.hh:482
static const Vector & nullVector()
Definition: misc.hh:133
static int twist(const Element *element, int subEntity)
Definition: misc.hh:587
ALBERTA FE_SPACE DofSpace
Definition: misc.hh:62
static const int minTwist
Definition: misc.hh:532
ALBERTA AFF_TRAFO AffineTransformation
Definition: misc.hh:49
ALBERTA BNDRY_TYPE BoundaryId
Definition: misc.hh:58
static int twist(const Element *element, int subEntity)
Definition: misc.hh:550
static int apply(const int i)
Definition: misc.hh:344
static const int DirichletBoundary
Definition: misc.hh:57
int dune2alberta(int codim, int i) const
Definition: misc.hh:387
static int apply(const int i)
Definition: misc.hh:312
static int apply(int subEntity, int vertex)
Definition: misc.hh:469
Data * memAlloc(size_t size)
Definition: misc.hh:70
static const Flags standard
Definition: misc.hh:253
static const Flags projection
Definition: misc.hh:239
static const int meshCoarsened
Definition: misc.hh:54
GlobalMatrix Matrix
Definition: misc.hh:103
static int twist(const Element *element, int subEntity)
Definition: misc.hh:535
static const Flags standardWithCoords
Definition: misc.hh:250
int alberta2dune(int codim, int i) const
Definition: misc.hh:394
Definition: common.hh:179
static const int InteriorBoundary
Definition: misc.hh:56
#define DIM_OF_WORLD
Definition: albertaheader.hh:21
U_CHAR ElementType
Definition: misc.hh:60
static int apply(const int i)
Definition: misc.hh:322
ALBERTA REAL_DD GlobalMatrix
Definition: misc.hh:48
Data * memReAlloc(Data *ptr, size_t oldSize, size_t newSize)
Definition: misc.hh:82
static const Flags neighbor
Definition: misc.hh:235
static int apply(int subEntity, int vertex)
Definition: misc.hh:445
static const Flags nonPeriodic
Definition: misc.hh:245
static int apply(int subEntity, int vertex)
Definition: misc.hh:456
GlobalVector Vector
Definition: misc.hh:104
static const Matrix & identityMatrix()
Definition: misc.hh:128
Include standard header files.
Definition: agrid.hh:59
NumberingMap()
Definition: misc.hh:373
static const Flags boundaryId
Definition: misc.hh:243
ALBERTA EL Element
Definition: misc.hh:51
ALBERTA FLAGS Flags
Definition: misc.hh:229
~NumberingMap()
Definition: misc.hh:378
static int apply(const int i)
Definition: misc.hh:296