3 #ifndef DUNE_ALBERTA_MISC_HH 4 #define DUNE_ALBERTA_MISC_HH 8 #include <dune/common/exceptions.hh> 9 #include <dune/common/hybridutilities.hh> 10 #include <dune/common/std/utility.hh> 11 #include <dune/common/typetraits.hh> 18 #ifndef DUNE_ALBERTA_CACHE_COORDINATES 19 #define DUNE_ALBERTA_CACHE_COORDINATES 1 70 template<
class Data >
73 return MEM_ALLOC( size, Data );
76 template<
class Data >
79 return MEM_CALLOC( size, Data );
82 template<
class Data >
83 inline Data *
memReAlloc ( Data *ptr,
size_t oldSize,
size_t newSize )
85 return MEM_REALLOC( ptr, oldSize, newSize, Data );
88 template<
class Data >
89 inline void memFree ( Data *ptr,
size_t size )
91 return MEM_FREE( ptr, size, Data );
108 Matrix identityMatrix_;
116 identityMatrix_[ i ][ j ] =
Real( 0 );
117 identityMatrix_[ i ][ i ] =
Real( 1 );
118 nullVector_[ i ] =
Real( 0 );
122 static This &instance ()
124 static This theInstance;
131 return instance().identityMatrix_;
136 return instance().nullVector_;
145 template<
int dim,
int codim >
151 static const int value = 1;
157 static const int value = dim+1;
163 static const int value = 1;
169 static const int value = 3;
175 static const int value = 4;
181 static const int value = 6;
189 template<
int dim,
int codim >
195 static const int value = CENTER;
201 static const int value = VERTEX;
207 static const int value = EDGE;
213 static const int value = FACE;
219 static const int value = EDGE;
232 static const Flags nothing = FILL_NOTHING;
234 static const Flags coords = FILL_COORDS;
236 static const Flags neighbor = FILL_NEIGH;
238 static const Flags orientation = (dim == 3 ? FILL_ORIENTATION : FILL_NOTHING);
240 static const Flags projection = FILL_PROJECTION;
242 static const Flags elementType = FILL_NOTHING;
244 static const Flags boundaryId = FILL_MACRO_WALLS;
246 static const Flags nonPeriodic = FILL_NON_PERIODIC;
248 static const Flags
all = coords | neighbor | boundaryId | nonPeriodic
249 | orientation | projection | elementType;
251 static const Flags standardWithCoords = all & ~nonPeriodic & ~projection;
253 #if DUNE_ALBERTA_CACHE_COORDINATES 254 static const Flags standard = standardWithCoords & ~coords;
256 static const Flags standard = standardWithCoords;
268 static const int value = 0;
274 static const int value = 2;
282 template<
int dim,
int codim >
299 assert( (i >= 0) && (i < numSubEntities) );
300 static int dune2alberta[ numSubEntities ] = { 0, 3, 1, 2, 4, 5 };
301 return dune2alberta[ i ];
310 template<
int dim,
int codim >
347 assert( (i >= 0) && (i < numSubEntities) );
348 static int generic2alberta[ numSubEntities ] = { 0, 1, 3, 2, 4, 5 };
349 return generic2alberta[ i ];
363 template<
int codim >
366 int *dune2alberta_[ dim+1 ];
367 int *alberta2dune_[ dim+1 ];
368 int numSubEntities_[ dim+1 ];
371 This &operator= (
const This & );
376 Hybrid::forEach( Std::make_index_sequence< dim+1 >{}, [ & ](
auto i ){ Initialize< i >::apply( *
this ); } );
381 for(
int codim = 0; codim <= dim; ++codim )
383 delete[]( dune2alberta_[ codim ] );
384 delete[]( alberta2dune_[ codim ] );
390 assert( (codim >= 0) && (codim <= dim) );
391 assert( (i >= 0) && (i < numSubEntities( codim )) );
392 return dune2alberta_[ codim ][ i ];
397 assert( (codim >= 0) && (codim <= dim) );
398 assert( (i >= 0) && (i < numSubEntities( codim )) );
399 return alberta2dune_[ codim ][ i ];
404 assert( (codim >= 0) && (codim <= dim) );
405 return numSubEntities_[ codim ];
414 template<
int dim,
template<
int,
int >
class Numbering >
415 template<
int codim >
422 map.numSubEntities_[ codim ] = numSubEntities;
423 map.dune2alberta_[ codim ] =
new int[ numSubEntities ];
424 map.alberta2dune_[ codim ] =
new int[ numSubEntities ];
426 for(
int i = 0; i < numSubEntities; ++i )
428 const int j = Numbering< dim, codim >::apply( i );
429 map.dune2alberta_[ codim ][ i ] = j;
430 map.alberta2dune_[ codim ][ j ] = i;
440 template<
int dim,
int codim >
448 assert( subEntity == 0 );
459 assert( (subEntity >= 0) && (subEntity < 3) );
460 assert( (vertex >= 0) && (vertex < 2) );
462 static const int map[ 3 ][ 2 ] = { {1,2}, {0,2}, {0,1} };
463 return map[ subEntity ][
vertex ];
472 assert( (subEntity >= 0) && (subEntity < 4) );
473 assert( (vertex >= 0) && (vertex < 3) );
475 static const int map[ 4 ][ 3 ] = { {1,2,3}, {0,2,3}, {0,1,3}, {0,1,2} };
476 return map[ subEntity ][
vertex ];
485 assert( (subEntity >= 0) && (subEntity < 6) );
486 assert( (vertex >= 0) && (vertex < 2) );
487 static const int map[ 6 ][ 2 ] = { {0,1}, {0,2}, {0,3}, {1,2}, {1,3}, {2,3} };
488 return map[ subEntity ][
vertex ];
498 assert( vertex == 0 );
528 template<
int dim,
int subdim >
533 static const int minTwist = 0;
534 static const int maxTwist = 0;
536 static int twist (
const Element *element,
int subEntity )
538 assert( (subEntity >= 0) && (subEntity < numSubEntities) );
548 static const int minTwist = 0;
549 static const int maxTwist = 1;
551 static int twist (
const Element *element,
int subEntity )
553 assert( (subEntity >= 0) && (subEntity < numSubEntities) );
555 int dof[ numVertices ];
556 for(
int i = 0; i < numVertices; ++i )
559 dof[ i ] = element->dof[ j ][ 0 ];
561 return (dof[ 0 ] < dof[ 1 ] ? 0 : 1);
569 static const int minTwist = 0;
570 static const int maxTwist = 0;
572 static int twist (
const Element *element,
int subEntity )
574 assert( subEntity == 0 );
585 static const int minTwist = -3;
586 static const int maxTwist = 2;
588 static int twist (
const Element *element,
int subEntity )
590 assert( (subEntity >= 0) && (subEntity < numSubEntities) );
592 int dof[ numVertices ];
593 for(
int i = 0; i < numVertices; ++i )
596 dof[ i ] = element->dof[ j ][ 0 ];
599 const int twist[ 8 ] = { -2, 1, 666, -1, 2, 666, -3, 0 };
600 const int k = int( dof[ 0 ] < dof[ 1 ] )
601 | (int( dof[ 0 ] < dof[ 2 ] ) << 1)
602 | (
int( dof[ 1 ] < dof[ 2 ] ) << 2);
603 assert( twist[ k ] != 666 );
612 static const int minTwist = 0;
613 static const int maxTwist = 0;
615 static int twist (
const Element *element,
int subEntity )
617 assert( subEntity == 0 );
628 return (twist < 0 ? (2*numCorners + 1 - i + twist) : i + twist) % numCorners;
635 return (twist < 0 ? (2*numCorners + 1 - i + twist) : numCorners + i - twist) % numCorners;
642 #endif // #if HAVE_ALBERTA 644 #endif // #ifndef DUNE_ALBERTA_MISC_HH Include standard header files.
Definition: agrid.hh:58
static const int meshCoarsened
Definition: misc.hh:55
static const int meshRefined
Definition: misc.hh:54
static int apply(const int i)
Definition: misc.hh:313
GlobalVector Vector
Definition: misc.hh:105
static int apply(const int i)
Definition: misc.hh:333
static const Matrix & identityMatrix()
Definition: misc.hh:129
static int apply(const int i)
Definition: misc.hh:285
Definition: common.hh:179
#define ALBERTA
Definition: albertaheader.hh:27
Data * memCAlloc(size_t size)
Definition: misc.hh:77
static const Vector & nullVector()
Definition: misc.hh:134
static int apply(const int i)
Definition: misc.hh:297
static int twist(const Element *element, int subEntity)
Definition: misc.hh:588
Data * memReAlloc(Data *ptr, size_t oldSize, size_t newSize)
Definition: misc.hh:83
static const int DirichletBoundary
Definition: misc.hh:58
ALBERTA REAL Real
Definition: misc.hh:46
ALBERTA MESH Mesh
Definition: misc.hh:51
static int twist(const Element *element, int subEntity)
Definition: misc.hh:536
int dune2alberta(int codim, int i) const
Definition: misc.hh:388
static int twist(const Element *element, int subEntity)
Definition: misc.hh:572
U_CHAR ElementType
Definition: misc.hh:61
ALBERTA BNDRY_TYPE BoundaryId
Definition: misc.hh:59
static int apply(int subEntity, int vertex)
Definition: misc.hh:495
ALBERTA FLAGS Flags
Definition: misc.hh:230
int numSubEntities(int codim) const
Definition: misc.hh:402
static int apply(const int i)
Definition: misc.hh:345
static int apply(int subEntity, int vertex)
Definition: misc.hh:457
static int apply(const int i)
Definition: misc.hh:323
static const int InteriorBoundary
Definition: misc.hh:57
int applyTwist(int twist, int i)
Definition: misc.hh:625
static int apply(int subEntity, int vertex)
Definition: misc.hh:470
GlobalMatrix Matrix
Definition: misc.hh:104
int alberta2dune(int codim, int i) const
Definition: misc.hh:395
static int apply(int subEntity, int vertex)
Definition: misc.hh:483
ALBERTA REAL_D GlobalVector
Definition: misc.hh:48
static const int dimWorld
Definition: misc.hh:44
static int apply(int subEntity, int vertex)
Definition: misc.hh:446
constexpr All all
PartitionSet for all partitions.
Definition: partitionset.hh:294
int applyInverseTwist(int twist, int i)
Definition: misc.hh:632
ALBERTA FE_SPACE DofSpace
Definition: misc.hh:63
ALBERTA EL Element
Definition: misc.hh:52
~NumberingMap()
Definition: misc.hh:379
ALBERTA REAL_B LocalVector
Definition: misc.hh:47
static int twist(const Element *element, int subEntity)
Definition: misc.hh:551
ALBERTA REAL_DD GlobalMatrix
Definition: misc.hh:49
static int twist(const Element *element, int subEntity)
Definition: misc.hh:615
NumberingMap()
Definition: misc.hh:374
void memFree(Data *ptr, size_t size)
Definition: misc.hh:89
ALBERTA AFF_TRAFO AffineTransformation
Definition: misc.hh:50
#define DIM_OF_WORLD
Definition: albertaheader.hh:21
Data * memAlloc(size_t size)
Definition: misc.hh:71