1#ifndef DUNE_FEM_QUADPROVIDER_HH
2#define DUNE_FEM_QUADPROVIDER_HH
9#include <dune/common/shared_ptr.hh>
30 static const int maxFirst = 25 ;
32 static const int maxSecond = 10 ;
48 assert(
first < maxFirst );
49 assert(
second < maxSecond );
56 assert(
first < maxFirst );
60 operator int ()
const {
return id_; }
78 template<
unsigned int dummy >
82 template<
class QuadImp,
class QuadratureKey,
unsigned int >
83 class QuadratureStorage;
86 template<
class QuadImp,
class QuadratureKey >
90 typedef QuadImp QuadType;
95 typedef std :: map< QuadratureKey, std::unique_ptr< QuadType > >
StorageType;
101 return instance().createImpl( geometry, key );
105 static Storage& instance()
110 QuadImp* createImpl(
const GeometryType &geometry,
const QuadratureKey& key )
112 std::lock_guard< std::mutex > guard( mutex_ );
114 auto& quadPtr = storage_[ key ];
117 quadPtr.reset(
new QuadImp( geometry, key, IdProvider :: instance().newId() ) );
121 return quadPtr.operator->();
125 typedef std :: map< QuadratureKey, std::unique_ptr< QuadType, Dune::null_deleter<QuadType> > > PointerStorageType;
126 PointerStorageType quadPtrs_;
129 QuadratureStorage () {}
131 QuadType &getQuadrature(
const GeometryType &geometry,
const QuadratureKey& key )
133 auto& quadPtr = quadPtrs_[ key ];
137 quadPtr.reset( Storage::create( geometry, key ) );
146 template<
class QuadImp>
147 class QuadratureStorage< QuadImp, int, dummy >
150 typedef QuadImp QuadType;
158 std::vector< std::unique_ptr< QuadType > >
storage_;
159 Storage() : storage_( QuadType :: maxOrder() + 1 )
162 static QuadType*
create(
const GeometryType &geometry,
int order )
164 return instance().createImpl( geometry, order );
168 static Storage& instance()
173 QuadType* createImpl(
const GeometryType &geometry,
int order )
175 std::lock_guard< std::mutex > guard( mutex_ );
177 auto& quadPtr = storage_[ order ];
180 quadPtr.reset(
new QuadImp( geometry, order, IdProvider :: instance().newId() ) );
183 return quadPtr.operator ->();
187 typedef std::vector< QuadType* > QuadPointerVecType;
189 QuadPointerVecType quadPtrs_;
193 : quadPtrs_( QuadPointerVecType( QuadType :: maxOrder() + 1, nullptr ))
198 QuadImp &getQuadrature(
const GeometryType &geometry,
int order )
200 if(order >=
int(quadPtrs_.size()) )
203 static thread_local bool showMessage = true ;
206 std::cerr <<
"WARNING: QuadratureStorage::getQuadrature: A quadrature of order " << order
207 <<
" is not implemented!" << std::endl
208 <<
"Choosing maximum order: " << quadPtrs_.size()-1 << std::endl << std::endl;
212 order = quadPtrs_.size() - 1;
215 auto& quadPtr = quadPtrs_[ order ];
219 quadPtr = Storage::create( geometry, order );
228 template<
class QuadImp >
229 class QuadratureStorage< QuadImp, FemQuadratureKey, dummy >
230 :
public QuadratureStorage< QuadImp, int, dummy >
240 template<
class QuadImp,
class QuadratureKey >
246 static thread_local QuadratureStorage< QuadImp, QuadratureKey, dummy > storage;
247 return storage.getQuadrature( geometry, key );
256 template<
class QuadImp,
class QuadratureKey >
259 const int defaultOrder )
262 assert( geometry.isNone() );
263 DUNE_THROW(NotImplemented,
"provideQuad for polyhedral cells (defaultOrder = 0) not implemented for arbitrary QuadratureKey!");
264 QuadImp* ptr =
nullptr;
274 template<
class QuadImp >
277 const int defaultOrder )
279 assert( geometry.isNone() );
282 static thread_local QuadratureStorage< QuadImp, int, dummy > storage;
283 return storage.getQuadrature( geometry, defaultOrder );
302 template<
typename FieldImp,
int dim,
template<
class,
int >
class QuadratureTraits >
313 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
320 typedef typename QuadratureTraitsType :: IntegrationPointListType
330 assert( geometry.isCube() );
331 return QuadCreator< 0 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey );
335 const GeometryType &elementGeometry,
349 template<
typename FieldImp,
template<
class,
int >
class QuadratureTraits >
360 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
376 assert( geometry.isCube() || geometry.isSimplex() );
382 const GeometryType &elementGeometry,
396 template<
class FieldImp,
template<
class,
int >
class QuadratureTraits >
407 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
423 assert( geometry.isCube() || geometry.isSimplex() );
424 return QuadCreator< 0 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey );
429 const GeometryType &elementGeometry,
432 assert( geometry.isCube() || geometry.isSimplex() );
435 return ( elementGeometry.isSimplex() ) ?
436 QuadCreator< 0 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey ) :
437 QuadCreator< 1 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey ) ;
448 template<
class FieldImp,
template<
class,
int >
class QuadratureTraits >
459 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
477 assert( geometry.isCube() || geometry.isSimplex() || geometry.isNone() );
479 if( geometry.isSimplex() )
482 template provideQuad< SimplexQuadratureType > ( geometry, quadKey );
484 else if( geometry.isCube() )
487 template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
492 return QuadCreator< 1 > :: template provideQuad< CubeQuadratureType > ( geometry, 0 );
498 const GeometryType &elementGeometry,
501 assert( geometry.isCube() || geometry.isSimplex() );
504 if ( geometry.isSimplex() )
507 if( elementGeometry.isSimplex() )
508 return QuadCreator< 0 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
509 else if( elementGeometry.isCube() )
510 return QuadCreator< 1 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
511 else if( elementGeometry.isPrism() )
512 return QuadCreator< 2 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
513 else if( elementGeometry.isPyramid() )
514 return QuadCreator< 3 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
516 DUNE_THROW( RangeError,
"Element type not available for dimension 3" );
522 if( elementGeometry.isSimplex() )
523 return QuadCreator< 4 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
524 else if( elementGeometry.isCube() )
525 return QuadCreator< 5 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
526 else if( elementGeometry.isPrism() )
527 return QuadCreator< 6 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
528 else if( elementGeometry.isPyramid() )
529 return QuadCreator< 7 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
531 DUNE_THROW( RangeError,
"Element type not available for dimension 3" );
534 DUNE_THROW( RangeError,
"Element type not available for dimension 2" );
537 template provideQuad< SimplexQuadratureType >( geometry, quadKey, 0 );
548 template<
class FieldImp,
template<
class,
int >
class QuadratureTraits >
559 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
581 assert( geometry.isCube() || geometry.isSimplex() || geometry.isNone()
582 || geometry.isPrism() || geometry.isPyramid() );
584 if( geometry.isSimplex() )
586 ( geometry, quadKey );
587 if( geometry.isCube() )
589 ( geometry, quadKey );
591 if( geometry.isPrism() )
593 ( geometry, quadKey );
594 if( geometry.isPyramid() )
596 ( geometry, quadKey );
598 if( geometry.isNone() )
601 return QuadCreator< 1 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey, 0 );
604 DUNE_THROW( RangeError,
"Element type not available for dimension 3" );
607 ( geometry, quadKey, 0 );
611 const GeometryType &elementGeometry,
614 DUNE_THROW( RangeError,
"QuadProvider::getQuadrature not implemented for 3d face quadratures!" );
617 ( geometry, quadKey, 0 );
Definition: bindguard.hh:11
Definition: pointmapper.hh:18
A simple quadrature key class for use FemPy.
Definition: quadprovider.hh:26
FemQuadratureKey(const FemQuadratureKey &key)=default
copy constructor
int first() const
return first component
Definition: quadprovider.hh:63
int second() const
return second component
Definition: quadprovider.hh:65
FemQuadratureKey()
empty constructor
Definition: quadprovider.hh:35
FemQuadratureKey(const int first)
constructor taking only order (fallback for standard Fem quadratures)
Definition: quadprovider.hh:53
static const int highest_order
Definition: quadprovider.hh:42
FemQuadratureKey(const int first, const int second)
constructor taking to ids, like std::pair
Definition: quadprovider.hh:45
the actual quadrature storage
Definition: quadprovider.hh:80
static const QuadImp & provideQuad(const GeometryType &geometry, const QuadratureKey &key, const int defaultOrder)
provide quadrature
Definition: quadprovider.hh:257
static const QuadImp & provideQuad(const GeometryType &geometry, const QuadratureKey &key)
provide quadrature
Definition: quadprovider.hh:241
static const QuadImp & provideQuad(const GeometryType &geometry, const int, const int defaultOrder)
provide quadrature
Definition: quadprovider.hh:275
static QuadImp * create(const GeometryType &geometry, const QuadratureKey &key)
Definition: quadprovider.hh:99
std ::map< QuadratureKey, std::unique_ptr< QuadType > > StorageType
Definition: quadprovider.hh:95
StorageType storage_
Definition: quadprovider.hh:97
std::mutex mutex_
Definition: quadprovider.hh:96
std::mutex mutex_
Definition: quadprovider.hh:155
static QuadType * create(const GeometryType &geometry, int order)
Definition: quadprovider.hh:162
std::vector< std::unique_ptr< QuadType > > storage_
Definition: quadprovider.hh:158
Storage()
Definition: quadprovider.hh:159
provide a single instance pool of quadratures
Definition: quadprovider.hh:304
@ dimension
Definition: quadprovider.hh:308
FieldImp FieldType
Definition: quadprovider.hh:306
QuadratureProvider()=delete
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:334
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:327
QuadratureTraitsType::CubeQuadratureType CubeQuadratureType
type for cube quadrature
Definition: quadprovider.hh:317
QuadratureProvider & operator=(const ThisType &)=delete
QuadratureTraitsType::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:324
QuadratureTraitsType::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:321
QuadratureProvider(const ThisType &)=delete
QuadratureTraitsType::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:367
QuadratureTraitsType::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:370
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:381
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:373
QuadratureTraitsType::PointQuadratureType PointQuadratureType
type of point quadrature
Definition: quadprovider.hh:364
QuadratureProvider()=delete
QuadratureProvider & operator=(const ThisType &)=delete
FieldImp FieldType
Definition: quadprovider.hh:353
QuadratureProvider(const ThisType &)=delete
QuadratureProvider()=delete
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:420
FieldImp FieldType
Definition: quadprovider.hh:400
QuadratureTraitsType::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:417
QuadratureProvider(const ThisType &)=delete
QuadratureProvider & operator=(const ThisType &)=delete
QuadratureTraitsType::LineQuadratureType LineQuadratureType
type of line quadrature
Definition: quadprovider.hh:411
QuadratureTraitsType::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:414
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:428
QuadratureProvider(const ThisType &)=delete
QuadratureProvider & operator=(const ThisType &)=delete
FieldImp FieldType
Definition: quadprovider.hh:452
QuadratureTraitsType::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:468
QuadratureTraitsType::CubeQuadratureType CubeQuadratureType
type of cube quadrature
Definition: quadprovider.hh:465
QuadratureTraitsType::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:471
QuadratureTraitsType::SimplexQuadratureType SimplexQuadratureType
type of simplex quadrature
Definition: quadprovider.hh:463
QuadratureProvider()=delete
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:497
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:474
QuadratureProvider(const ThisType &)=delete
QuadratureProvider & operator=(const ThisType &)=delete
QuadratureTraitsType::PrismQuadratureType PrismQuadratureType
type of prims quadrature
Definition: quadprovider.hh:567
QuadratureProvider()=delete
QuadratureTraitsType::CubeQuadratureType CubeQuadratureType
type of cube quadrature
Definition: quadprovider.hh:565
FieldImp FieldType
Definition: quadprovider.hh:552
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Definition: quadprovider.hh:610
QuadratureTraitsType::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:575
QuadratureTraitsType::SimplexQuadratureType SimplexQuadratureType
type of simplex quadrature
Definition: quadprovider.hh:563
QuadratureTraitsType::PyramidQuadratureType PyramidQuadratureType
type of pyramid quadrature
Definition: quadprovider.hh:569
QuadratureTraitsType::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:572
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:578
return singleton instance of given Object type.
Definition: singleton.hh:88