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
50 #if DUNE_ALBERTA_VERSION >= 0x300
68 #if DUNE_ALBERTA_VERSION >= 0x300
83 template<
class Data >
86 return MEM_ALLOC( size, Data );
89 template<
class Data >
92 return MEM_CALLOC( size, Data );
95 template<
class Data >
96 inline Data *
memReAlloc ( Data *ptr,
size_t oldSize,
size_t newSize )
98 return MEM_REALLOC( ptr, oldSize, newSize, Data );
101 template<
class Data >
102 inline void memFree ( Data *ptr,
size_t size )
104 return MEM_FREE( ptr, size, Data );
129 identityMatrix_[ i ][ j ] =
Real( 0 );
130 identityMatrix_[ i ][ i ] =
Real( 1 );
131 nullVector_[ i ] =
Real( 0 );
135 static This &instance ()
137 static This theInstance;
144 return instance().identityMatrix_;
149 return instance().nullVector_;
158 template<
int dim,
int codim >
164 static const int value = 1;
170 static const int value = dim+1;
176 static const int value = 1;
182 static const int value = 3;
188 static const int value = 4;
194 static const int value = 6;
202 template<
int dim,
int codim >
208 static const int value = CENTER;
214 static const int value = VERTEX;
220 static const int value = EDGE;
226 static const int value = FACE;
232 static const int value = EDGE;
255 #if DUNE_ALBERTA_VERSION >= 0x300
261 #if DUNE_ALBERTA_VERSION >= 0x300
267 #if DUNE_ALBERTA_VERSION >= 0x300
276 #if DUNE_ALBERTA_VERSION >= 0x300
282 #if DUNE_ALBERTA_CACHE_COORDINATES
311 template<
int dim,
int codim >
328 assert( (i >= 0) && (i < numSubEntities) );
329 static int dune2alberta[ numSubEntities ] = { 0, 3, 1, 2, 4, 5 };
330 return dune2alberta[ i ];
339 template<
int dim,
int codim >
376 assert( (i >= 0) && (i < numSubEntities) );
377 static int generic2alberta[ numSubEntities ] = { 0, 1, 3, 2, 4, 5 };
378 return generic2alberta[ i ];
387 template<
int dim,
template<
int,
int >
class Numbering = Generic2AlbertaNumbering >
392 template<
int codim >
395 int *dune2alberta_[ dim+1 ];
396 int *alberta2dune_[ dim+1 ];
397 int numSubEntities_[ dim+1 ];
405 ForLoop< Initialize, 0, dim >::apply( *
this );
410 for(
int codim = 0; codim <= dim; ++codim )
412 delete[]( dune2alberta_[ codim ] );
413 delete[]( alberta2dune_[ codim ] );
419 assert( (codim >= 0) && (codim <= dim) );
421 return dune2alberta_[ codim ][ i ];
426 assert( (codim >= 0) && (codim <= dim) );
428 return alberta2dune_[ codim ][ i ];
433 assert( (codim >= 0) && (codim <= dim) );
434 return numSubEntities_[ codim ];
443 template<
int dim,
template<
int,
int >
class Numbering >
444 template<
int codim >
445 struct NumberingMap< dim, Numbering >::Initialize
447 static const int numSubEntities = NumSubEntities< dim, codim >::value;
449 static void apply ( NumberingMap< dim, Numbering > &map )
457 const int j = Numbering< dim, codim >::apply( i );
458 map.dune2alberta_[ codim ][ i ] = j;
459 map.alberta2dune_[ codim ][ j ] = i;
469 template<
int dim,
int codim >
477 assert( subEntity == 0 );
488 assert( (subEntity >= 0) && (subEntity < 3) );
489 assert( (vertex >= 0) && (vertex < 2) );
491 static const int map[ 3 ][ 2 ] = { {1,2}, {0,2}, {0,1} };
492 return map[ subEntity ][
vertex ];
501 assert( (subEntity >= 0) && (subEntity < 4) );
502 assert( (vertex >= 0) && (vertex < 3) );
504 static const int map[ 4 ][ 3 ] = { {1,2,3}, {0,2,3}, {0,1,3}, {0,1,2} };
505 return map[ subEntity ][
vertex ];
514 assert( (subEntity >= 0) && (subEntity < 6) );
515 assert( (vertex >= 0) && (vertex < 2) );
516 static const int map[ 6 ][ 2 ] = { {0,1}, {0,2}, {0,3}, {1,2}, {1,3}, {2,3} };
517 return map[ subEntity ][
vertex ];
527 assert( vertex == 0 );
557 template<
int dim,
int subdim >
584 int dof[ numVertices ];
585 for(
int i = 0; i < numVertices; ++i )
588 dof[ i ] = element->dof[ j ][ 0 ];
590 return (dof[ 0 ] < dof[ 1 ] ? 0 : 1);
603 assert( subEntity == 0 );
621 int dof[ numVertices ];
622 for(
int i = 0; i < numVertices; ++i )
625 dof[ i ] = element->dof[ j ][ 0 ];
628 const int twist[ 8 ] = { -2, 1, 666, -1, 2, 666, -3, 0 };
629 const int k = int( dof[ 0 ] < dof[ 1 ] )
630 | (int( dof[ 0 ] < dof[ 2 ] ) << 1)
631 | (
int( dof[ 1 ] < dof[ 2 ] ) << 2);
632 assert( twist[ k ] != 666 );
646 assert( subEntity == 0 );
657 return (twist < 0 ? (2*numCorners + 1 - i + twist) : i + twist) % numCorners;
664 return (twist < 0 ? (2*numCorners + 1 - i + twist) : numCorners + i - twist) % numCorners;
671 #endif // #if HAVE_ALBERTA
673 #endif // #ifndef DUNE_ALBERTA_MISC_HH
U_CHAR ElementType
Definition: misc.hh:74
static const int dimWorld
Definition: misc.hh:43
GlobalVector t
Definition: misc.hh:56
static const int DirichletBoundary
Definition: misc.hh:67
Data * memCAlloc(size_t size)
Definition: misc.hh:90
static const int InteriorBoundary
Definition: misc.hh:66
static int apply(int subEntity, int vertex)
Definition: misc.hh:475
Definition: common.hh:179
static int apply(const int i)
Definition: misc.hh:352
static int apply(const int i)
Definition: misc.hh:374
static const Flags standardWithCoords
Definition: misc.hh:279
static const int maxTwist
Definition: misc.hh:563
static const Flags neighbor
Definition: misc.hh:249
static const Flags elementType
Definition: misc.hh:258
static int twist(const Element *element, int subEntity)
Definition: misc.hh:601
int alberta2dune(int codim, int i) const
Definition: misc.hh:424
int numSubEntities(int codim) const
Definition: misc.hh:431
ALBERTA FE_SPACE DofSpace
Definition: misc.hh:76
NumberingMap()
Definition: misc.hh:403
static const Matrix & identityMatrix()
Definition: misc.hh:142
static int twist(const Element *element, int subEntity)
Definition: misc.hh:580
ALBERTA REAL_D GlobalVector
Definition: misc.hh:47
static int apply(int subEntity, int vertex)
Definition: misc.hh:524
int applyInverseTwist(int twist, int i)
Definition: misc.hh:661
#define DIM_OF_WORLD
Definition: albertaheader.hh:21
static const int meshCoarsened
Definition: misc.hh:64
Data * memAlloc(size_t size)
Definition: misc.hh:84
static const Flags boundaryId
Definition: misc.hh:264
void memFree(Data *ptr, size_t size)
Definition: misc.hh:102
S_CHAR BoundaryId
Definition: misc.hh:71
static int apply(const int i)
Definition: misc.hh:342
static int apply(int subEntity, int vertex)
Definition: misc.hh:512
int dune2alberta(int codim, int i) const
Definition: misc.hh:417
static const Vector & nullVector()
Definition: misc.hh:147
static int apply(int subEntity, int vertex)
Definition: misc.hh:486
static const Flags nothing
Definition: misc.hh:245
static const int numSubEntities
Definition: misc.hh:560
static const Flags projection
Definition: misc.hh:253
Data * memReAlloc(Data *ptr, size_t oldSize, size_t newSize)
Definition: misc.hh:96
GlobalVector Vector
Definition: misc.hh:118
static int twist(const Element *element, int subEntity)
Definition: misc.hh:565
ALBERTA MESH Mesh
Definition: misc.hh:60
~NumberingMap()
Definition: misc.hh:408
static const Flags all
Definition: misc.hh:273
#define ALBERTA
Definition: albertaheader.hh:27
int applyTwist(int twist, int i)
Definition: misc.hh:654
ALBERTA EL Element
Definition: misc.hh:61
static const Flags coords
Definition: misc.hh:247
ALBERTA REAL_B LocalVector
Definition: misc.hh:46
static int apply(const int i)
Definition: misc.hh:362
GlobalMatrix M
Definition: misc.hh:55
static int twist(const Element *element, int subEntity)
Definition: misc.hh:617
static int apply(const int i)
Definition: misc.hh:326
static int apply(int subEntity, int vertex)
Definition: misc.hh:499
static const Flags nonPeriodic
Definition: misc.hh:270
ALBERTA FLAGS Flags
Definition: misc.hh:243
static const Flags orientation
Definition: misc.hh:251
ALBERTA REAL_DD GlobalMatrix
Definition: misc.hh:48
ALBERTA REAL Real
Definition: misc.hh:45
static const int meshRefined
Definition: misc.hh:63
static const int minTwist
Definition: misc.hh:562
static const int value
Definition: misc.hh:297
static const Flags standard
Definition: misc.hh:283
GlobalMatrix Matrix
Definition: misc.hh:117
static int apply(const int i)
Definition: misc.hh:314
static int twist(const Element *element, int subEntity)
Definition: misc.hh:644