3 #ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH
4 #define DUNE_GEOMETRY_REFERENCEELEMENTS_HH
6 #include <dune/common/forloop.hh>
7 #include <dune/common/typetraits.hh>
21 template<
class ctype,
int dim >
22 class GenericReferenceElementContainer;
45 template<
class ctype,
int dim >
59 ForLoop< Destroy, 0, dim >::apply( mappings_ );
60 integral_constant< int, 0 > codim0Variable;
61 if(mappings_[ codim0Variable ].
size())
62 delete mappings_[ codim0Variable ][ 0 ];
66 template<
class Topology >
class CornerStorage;
67 template<
class Topology >
struct Initialize;
68 template<
int codim >
struct Destroy;
71 :
public GenericGeometry::DefaultGeometryTraits< ctype, dim, dim >
73 typedef GenericGeometry::DefaultGeometryTraits< ctype, dim, dim > Base;
77 template<
class Topology >
104 template<
int codim >
106 :
public std::vector< typename Codim< codim >::Mapping * >
112 std::vector< SubEntityInfo > info_[ dim+1 ];
116 std::vector< FieldVector< ctype, dim > > volumeNormals_;
119 MappingsTable mappings_;
128 assert( (c >= 0) && (c <= dim) );
129 return info_[ c ].size();
143 int size (
int i,
int c,
int cc )
const
145 assert( (c >= 0) && (c <= dim) );
146 return info_[ c ][ i ].size( cc );
164 assert( (c >= 0) && (c <= dim) );
165 return info_[ c ][ i ].number( ii, cc );
177 const FieldVector< ctype, dim > &
position(
int i,
int c )
const
179 assert( (c >= 0) && (c <= dim) );
180 return info_[ c ][ i ].position();
192 return checkInside< 0 >( local, 0 );
209 template<
int codim >
210 bool checkInside (
const FieldVector< ctype, dim-codim > &local,
int i )
const
236 template<
int codim >
237 FieldVector< ctype, dim >
238 global(
const FieldVector< ctype, dim-codim > &local,
int i,
int c )
const
241 DUNE_THROW( Exception,
"Local Coordinate Type does not correspond to codimension c." );
242 assert( c == codim );
243 return mapping< codim >( i ).
global( local );
264 template<
int codim >
265 FieldVector< ctype, dim >
266 global(
const FieldVector< ctype, dim-codim > &local,
int i )
const
268 return mapping< codim >( i ).
global( local );
286 template<
int codim >
289 integral_constant< int, codim > codimVariable;
290 return *(mappings_[ codimVariable ][ i ]);
303 assert( (c >= 0) && (c <= dim) );
304 return info_[ c ][ i ].type();
310 unsigned int topologyId (
int i,
int c )
const DUNE_DEPRECATED
312 assert( (c >= 0) && (c <= dim) );
313 return info_[ c ][ i ].topologyId();
331 assert( (face >= 0) && (face <
int( volumeNormals_.size())) );
332 return volumeNormals_[ face ];
341 template<
class Topology >
344 dune_static_assert( (Topology::dimension == dim),
345 "Cannot initialize reference element for different dimension." );
350 integral_constant< int, 0 > codim0Variable;
351 mappings_[ codim0Variable ].resize( 1 );
352 mappings_[ codim0Variable ][ 0 ] =
new VirtualMapping( codim0Variable );
354 Dune::ForLoop< Init::template Codim, 0, dim >::apply( info_, mappings_ );
358 volume_ = ReferenceDomain::template volume< ctype >();
361 volumeNormals_.resize( ReferenceDomain::numNormals );
362 for(
unsigned int i = 0; i < ReferenceDomain::numNormals; ++i )
363 ReferenceDomain::integrationOuterNormal( i ,volumeNormals_[ i ] );
371 template<
class ctype,
int dim >
374 template<
class Topology,
int codim >
struct Initialize
376 template<
int subcodim >
struct SubCodim;
380 std::vector< int > numbering_[ dim+1 ];
381 FieldVector< ctype, dim > baryCenter_;
387 assert( (cc >= codim_) && (cc <= dim) );
388 return numbering_[ cc ].size();
391 int number (
int ii,
int cc )
const
393 assert( (cc >= codim_) && (cc <= dim) );
394 return numbering_[ cc ][ ii ];
412 template<
class Topology,
unsigned int codim,
unsigned int i >
420 const unsigned int iVariable = i;
421 Dune::ForLoop< Init::template SubCodim, 0, dim-codim >::apply( iVariable, numbering_ );
423 baryCenter_ = ctype( 0 );
424 static const unsigned int numCorners =
size( dim );
425 for(
unsigned int j = 0; j < numCorners; ++j )
427 FieldVector< ctype, dim > corner;
428 RefDomain::corner( number( j, dim ), corner );
429 baryCenter_ += corner;
431 baryCenter_ *= ctype( 1 ) / ctype( numCorners );
434 type_ =
GeometryType( SubTopology::id, SubTopology::dimension );
440 template<
class ctype,
int dim >
441 template<
class Topology >
447 static const unsigned int size = Topology::numCorners;
449 template<
class SubTopology >
457 for(
unsigned int i = 0; i <
size; ++i )
458 RefDomain::corner( i, coords_[ i ] );
461 template<
class Mapping,
unsigned int codim >
465 for(
unsigned int i = 0; i <
size; ++i )
466 coords_[ i ] = coords[ i ];
469 const FieldVector< ctype, dim > &operator[] (
unsigned int i )
const
475 FieldVector< ctype, dim > coords_[
size ];
479 template<
class ctype,
int dim >
480 template<
class Topology,
int codim >
481 template<
int subcodim >
487 static void apply (
unsigned int i, std::vector< int > (&numbering)[ dim+1 ] )
490 numbering[ codim+subcodim ].resize( size );
491 for(
unsigned int j = 0; j <
size; ++j )
492 numbering[ codim+subcodim ][ j ] = SubNumbering::number( i, j );
497 template<
class ctype,
int dim >
498 template<
class Topology >
505 template<
int codim >
511 static void apply ( std::vector< SubEntityInfo > &info )
513 info[ i ].template initialize< Topology, codim, i >();
518 apply ( std::vector< SubEntityInfo > (&info)[ dim+1 ],
522 info[ codim ].resize( size );
523 Dune::ForLoop< SubTopology, 0, size-1 >::apply( info[ codim ] );
527 integral_constant< int, 0 > codim0Variable;
530 typedef typename GenericGeometry::MappingProvider< ReferenceMapping, codim > MappingProvider;
532 integral_constant< int, codim > codimVariable;
533 mappings[ codimVariable ].resize( size );
534 for(
unsigned int i = 0; i <
size; ++i ) {
535 char* storage =
new char[MappingProvider::maxMappingSize];
536 mappings[ codimVariable ][ i ] = refMapping.template trace< codim >( i, storage );
545 template<
class ctype,
int dim >
546 template<
int codim >
553 integral_constant< int, codim > codimVariable;
554 for(
size_t i = 0; i < mappings[ codimVariable ].size(); ++i ) {
556 mappings[ codimVariable ][ i ]->~Mapping();
557 char* storage = (
char*)mappings[ codimVariable ][ i ];
569 template<
class ctype,
int dim >
572 static const unsigned int numTopologies = (1u << dim);
580 ForLoop< Builder, 0, numTopologies-1 >::apply( values_ );
590 assert( type.
dim() == dim );
591 return values_[ type.
id() ];
624 template<
int topologyId >
627 static void apply (
value_type (&values)[ numTopologies ] )
630 values[
topologyId ].template initializeTopology< Topology >();
650 template<
class ctype,
int dim >
659 return container()( type );
665 return container().simplex();
671 return container().cube();
687 #endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH