1 #ifndef DUNE_FEM_QUADPROVIDER_HH
2 #define DUNE_FEM_QUADPROVIDER_HH
29 static const int maxFirst = 25 ;
31 static const int maxSecond = 10 ;
47 assert(
first < maxFirst );
48 assert(
second < maxSecond );
55 assert(
first < maxFirst );
59 operator int ()
const {
return id_; }
77 template<
unsigned int dummy >
82 template<
class QuadImp,
class QuadratureKey >
83 class QuadratureStorage
86 typedef QuadImp QuadType;
89 typedef std :: map< QuadratureKey, std::unique_ptr< QuadType > > StorageType;
93 QuadratureStorage () {}
95 QuadImp &getQuadrature(
const GeometryType &geometry,
const QuadratureKey& key )
97 QuadType* quadPtr =
nullptr;
98 auto it = storage_.find( key );
99 if( it == storage_.end() )
102 assert( Fem :: ThreadManager:: singleThreadMode() );
104 storage_[ key ].reset( quadPtr );
108 quadPtr = it->second.operator ->();
111 assert( quadPtr !=
nullptr );
117 template<
class QuadImp>
118 class QuadratureStorage< QuadImp, int >
121 typedef QuadImp QuadType;
124 std::vector< std::unique_ptr< QuadType > > storage_;
128 : storage_( QuadType :: maxOrder() + 1 )
132 QuadImp &getQuadrature(
const GeometryType &geometry,
unsigned int order )
134 if(order >= storage_.size() )
137 static bool showMessage = true ;
140 std::cerr <<
"WARNING: QuadratureStorage::getQuadrature: A quadrature of order " << order
141 <<
" is not implemented!" << std::endl
142 <<
"Choosing maximum order: " << storage_.size()-1 << std::endl << std::endl;
146 order = storage_.size() - 1;
149 auto& quadPtr = storage_[ order ];
153 assert( Fem :: ThreadManager:: singleThreadMode() );
163 template<
class QuadImp >
165 :
public QuadratureStorage< QuadImp, int >
175 template<
class QuadImp,
class QuadratureKey >
179 static QuadratureStorage< QuadImp, QuadratureKey > storage;
180 return storage.getQuadrature( geometry, key );
189 template<
class QuadImp,
class QuadratureKey >
192 const int defaultOrder )
195 assert( geometry.isNone() );
196 DUNE_THROW(NotImplemented,
"provideQuad for polyhedral cells (defaultOrder = 0) not implemented for arbitrary QuadratureKey!");
197 QuadImp* ptr =
nullptr;
207 template<
class QuadImp >
210 const int defaultOrder )
212 assert( geometry.isNone() );
213 static QuadratureStorage< QuadImp, int > storage;
214 return storage.getQuadrature( geometry, defaultOrder );
233 template<
typename FieldImp,
int dim,
template<
class,
int >
class QuadratureTraits >
244 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
251 typedef typename QuadratureTraitsType :: IntegrationPointListType
261 assert( geometry.isCube() );
262 return QuadCreator< 0 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey );
266 const GeometryType &elementGeometry,
280 template<
typename FieldImp,
template<
class,
int >
class QuadratureTraits >
291 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
307 assert( geometry.isCube() || geometry.isSimplex() );
316 const GeometryType &elementGeometry,
330 template<
class FieldImp,
template<
class,
int >
class QuadratureTraits >
341 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
357 assert( geometry.isCube() || geometry.isSimplex() );
358 return QuadCreator< 0 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey );
363 const GeometryType &elementGeometry,
366 assert( geometry.isCube() || geometry.isSimplex() );
369 return ( elementGeometry.isSimplex() ) ?
370 QuadCreator< 0 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey ) :
371 QuadCreator< 1 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey ) ;
382 template<
class FieldImp,
template<
class,
int >
class QuadratureTraits >
393 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
411 assert( geometry.isCube() || geometry.isSimplex() || geometry.isNone() );
413 if( geometry.isSimplex() )
416 template provideQuad< SimplexQuadratureType > ( geometry, quadKey );
418 else if( geometry.isCube() )
421 template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
426 return QuadCreator< 1 > :: template provideQuad< CubeQuadratureType > ( geometry, 0 );
432 const GeometryType &elementGeometry,
435 assert( geometry.isCube() || geometry.isSimplex() );
438 if ( geometry.isSimplex() )
441 if( elementGeometry.isSimplex() )
442 return QuadCreator< 0 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
443 else if( elementGeometry.isCube() )
444 return QuadCreator< 1 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
445 else if( elementGeometry.isPrism() )
446 return QuadCreator< 2 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
447 else if( elementGeometry.isPyramid() )
448 return QuadCreator< 3 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
450 DUNE_THROW( RangeError,
"Element type not available for dimension 3" );
456 if( elementGeometry.isSimplex() )
457 return QuadCreator< 4 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
458 else if( elementGeometry.isCube() )
459 return QuadCreator< 5 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
460 else if( elementGeometry.isPrism() )
461 return QuadCreator< 6 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
462 else if( elementGeometry.isPyramid() )
463 return QuadCreator< 7 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
465 DUNE_THROW( RangeError,
"Element type not available for dimension 3" );
468 DUNE_THROW( RangeError,
"Element type not available for dimension 2" );
471 template provideQuad< SimplexQuadratureType >( geometry, quadKey, 0 );
482 template<
class FieldImp,
template<
class,
int >
class QuadratureTraits >
493 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
515 assert( geometry.isCube() || geometry.isSimplex() || geometry.isNone()
516 || geometry.isPrism() || geometry.isPyramid() );
518 if( geometry.isSimplex() )
520 ( geometry, quadKey );
521 if( geometry.isCube() )
523 ( geometry, quadKey );
525 if( geometry.isPrism() )
527 ( geometry, quadKey );
528 if( geometry.isPyramid() )
530 ( geometry, quadKey );
532 if( geometry.isNone() )
535 return QuadCreator< 1 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey, 0 );
538 DUNE_THROW( RangeError,
"Element type not available for dimension 3" );
541 ( geometry, quadKey, 0 );
545 const GeometryType &elementGeometry,
548 DUNE_THROW( RangeError,
"QuadProvider::getQuadrature not implemented for 3d face quadratures!" );
551 ( geometry, quadKey, 0 );
Definition: bindguard.hh:11
Definition: pointmapper.hh:18
static IdProvider & instance()
Access to the singleton object.
Definition: idprovider.hh:21
A simple quadrature key class for use FemPy.
Definition: quadprovider.hh:25
FemQuadratureKey(const FemQuadratureKey &key)=default
copy constructor
int first() const
return first component
Definition: quadprovider.hh:62
int second() const
return second component
Definition: quadprovider.hh:64
FemQuadratureKey()
empty constructor
Definition: quadprovider.hh:34
FemQuadratureKey(const int first)
constructor taking only order (fallback for standard Fem quadratures)
Definition: quadprovider.hh:52
static const int highest_order
Definition: quadprovider.hh:41
FemQuadratureKey(const int first, const int second)
constructor taking to ids, like std::pair
Definition: quadprovider.hh:44
the actual quadrature storage
Definition: quadprovider.hh:79
static const QuadImp & provideQuad(const GeometryType &geometry, const QuadratureKey &key)
provide quadrature
Definition: quadprovider.hh:176
static const QuadImp & provideQuad(const GeometryType &geometry, const int, const int defaultOrder)
provide quadrature
Definition: quadprovider.hh:208
static const QuadImp & provideQuad(const GeometryType &geometry, const QuadratureKey &key, const int defaultOrder)
provide quadrature
Definition: quadprovider.hh:190
provide a single instance pool of quadratures
Definition: quadprovider.hh:235
@ dimension
Definition: quadprovider.hh:239
FieldImp FieldType
Definition: quadprovider.hh:237
QuadratureProvider & operator=(const ThisType &)=delete
QuadratureProvider()=delete
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:265
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:258
QuadratureTraitsType ::CubeQuadratureType CubeQuadratureType
type for cube quadrature
Definition: quadprovider.hh:248
QuadratureTraitsType ::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:255
QuadratureTraitsType ::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:252
QuadratureProvider(const ThisType &)=delete
QuadratureProvider & operator=(const ThisType &)=delete
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:304
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:315
QuadratureTraitsType ::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:298
QuadratureTraitsType ::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:301
QuadratureTraitsType ::PointQuadratureType PointQuadratureType
type of point quadrature
Definition: quadprovider.hh:295
QuadratureProvider()=delete
FieldImp FieldType
Definition: quadprovider.hh:284
QuadratureProvider(const ThisType &)=delete
QuadratureProvider()=delete
FieldImp FieldType
Definition: quadprovider.hh:334
QuadratureProvider(const ThisType &)=delete
QuadratureTraitsType ::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:348
QuadratureTraitsType ::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:351
QuadratureProvider & operator=(const ThisType &)=delete
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:362
QuadratureTraitsType ::LineQuadratureType LineQuadratureType
type of line quadrature
Definition: quadprovider.hh:345
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:354
QuadratureProvider(const ThisType &)=delete
QuadratureTraitsType ::CubeQuadratureType CubeQuadratureType
type of cube quadrature
Definition: quadprovider.hh:399
QuadratureTraitsType ::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:402
FieldImp FieldType
Definition: quadprovider.hh:386
QuadratureTraitsType ::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:405
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:408
QuadratureProvider & operator=(const ThisType &)=delete
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:431
QuadratureProvider()=delete
QuadratureTraitsType ::SimplexQuadratureType SimplexQuadratureType
type of simplex quadrature
Definition: quadprovider.hh:397
QuadratureProvider(const ThisType &)=delete
QuadratureProvider()=delete
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:512
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Definition: quadprovider.hh:544
QuadratureTraitsType ::CubeQuadratureType CubeQuadratureType
type of cube quadrature
Definition: quadprovider.hh:499
FieldImp FieldType
Definition: quadprovider.hh:486
QuadratureTraitsType ::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:509
QuadratureTraitsType ::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:506
QuadratureProvider & operator=(const ThisType &)=delete
QuadratureTraitsType ::PrismQuadratureType PrismQuadratureType
type of prims quadrature
Definition: quadprovider.hh:501
QuadratureTraitsType ::SimplexQuadratureType SimplexQuadratureType
type of simplex quadrature
Definition: quadprovider.hh:497
QuadratureTraitsType ::PyramidQuadratureType PyramidQuadratureType
type of pyramid quadrature
Definition: quadprovider.hh:503