1#ifndef DUNE_FEM_QUADPROVIDER_HH
2#define DUNE_FEM_QUADPROVIDER_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()
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;
159 Storage() : storage_( QuadType :: maxOrder() + 1 )
164 return instance().createImpl( geometry, order );
168 static Storage& instance()
173 QuadType* createImpl(
const GeometryType &geometry,
int order )
177 auto& quadPtr = storage_[ order ];
180 quadPtr.reset(
new QuadImp( geometry, order, IdProvider :: instance().newId() ) );
183 return quadPtr.operator ->();
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
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 IntegrationTraits >
313 typedef IntegrationTraits< FieldType, dimension > QuadratureTraits;
316 typedef QuadratureTraits FactoryTraits;
318 template <
class Po
intQuadrature,
class QuadratureKey>
319 class PointQuadratureStorage :
public PointQuadrature
334 template <
class FactoryTraits>
337 const typename FactoryTraits::QuadratureKeyType& quadKey )
340 const typename FactoryTraits::QuadratureKeyType& quadKey )
344 typename FactoryTraits::IntegrationPointListType> :: value );
349 typedef typename FactoryTraits :: PointQuadratureType PointQuadratureType;
350 typedef typename FactoryTraits :: QuadratureKeyType QuadratureKeyType;
352 typedef PointQuadratureStorage< PointQuadratureType, QuadratureKeyType > PointQuadratureStorageType;
362 typedef typename FactoryTraits::LineQuadratureType LineQuadratureType;
364 return QuadCreator< 0 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey );
370 typedef typename FactoryTraits::SimplexQuadratureType SimplexQuadratureType;
371 typedef typename FactoryTraits::CubeQuadratureType CubeQuadratureType;
375 template provideQuad< SimplexQuadratureType > ( geometry, quadKey );
381 template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
387 return QuadCreator< 1 > :: template provideQuad< CubeQuadratureType > ( geometry, 0 );
392 typedef typename FactoryTraits::PrismQuadratureType PrismQuadratureType;
393 typedef typename FactoryTraits::PyramidQuadratureType PyramidQuadratureType;
397 ( geometry, quadKey );
400 ( geometry, quadKey );
408 typedef typename FactoryTraits::LineQuadratureType LineQuadratureType;
409 return QuadCreator< 0 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey, 0 );
413 typedef typename FactoryTraits::SimplexQuadratureType SimplexQuadratureType;
414 return QuadCreator< 0 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey, 0 );
421 template <
class FactoryTraits>
425 const typename FactoryTraits::QuadratureKeyType& quadKey )
430 const typename FactoryTraits::QuadratureKeyType& quadKey )
441 typedef typename FactoryTraits::LineQuadratureType LineQuadratureType;
446 QuadCreator< 0 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey ) :
447 QuadCreator< 1 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey ) ;
452 typedef typename FactoryTraits::SimplexQuadratureType SimplexQuadratureType;
453 typedef typename FactoryTraits::CubeQuadratureType CubeQuadratureType;
461 return QuadCreator< 0 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
462 else if( elementGeometry.
isCube() )
463 return QuadCreator< 1 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
464 else if( elementGeometry.
isPrism() )
465 return QuadCreator< 2 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
467 return QuadCreator< 3 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
476 return QuadCreator< 4 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
477 else if( elementGeometry.
isCube() )
478 return QuadCreator< 5 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
479 else if( elementGeometry.
isPrism() )
480 return QuadCreator< 6 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
482 return QuadCreator< 7 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
490 typedef typename FactoryTraits::SimplexQuadratureType SimplexQuadratureType;
491 DUNE_THROW(
RangeError,
"QuadProvider::getQuadrature not implemented for 3d face quadratures!" );
494 ( geometry, quadKey, 0 );
#define DUNE_THROW(E,...)
constexpr bool isPyramid() const
constexpr bool isPrism() const
constexpr bool isCube() const
constexpr bool isNone() const
constexpr bool isSimplex() const
Definition pointmapper.hh:19
static IdProvider & instance()
Access to the singleton object.
Definition idprovider.hh:21
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
static const QuadratureImplementationType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const typename FactoryTraits::QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition quadprovider.hh:428
QuadratureProvider()=delete
FieldImp FieldType
Definition quadprovider.hh:306
QuadratureTraits::IntegrationPointListType QuadratureImplementationType
type of integration point list implementation
Definition quadprovider.hh:330
static const int dimension
Definition quadprovider.hh:308
QuadratureProvider(const ThisType &)=delete
static const QuadratureImplementationType & getQuadrature(const GeometryType &geometry, const typename FactoryTraits::QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition quadprovider.hh:339
QuadratureProvider & operator=(const ThisType &)=delete
return singleton instance of given Object type.
Definition singleton.hh:93