dune-fem 2.8.0
Loading...
Searching...
No Matches
quadprovider.hh
Go to the documentation of this file.
1#ifndef DUNE_FEM_QUADPROVIDER_HH
2#define DUNE_FEM_QUADPROVIDER_HH
3
4#include <iostream>
5#include <memory>
6#include <map>
7#include <vector>
8
9#include <dune/common/shared_ptr.hh>
13
14namespace Dune
15{
16
17 namespace Fem
18 {
19
26 {
27 int id_;
28
29 // something like maxOrder
30 static const int maxFirst = 25 ;
31 // something like different quadratures of the same order
32 static const int maxSecond = 10 ;
33 public:
35 FemQuadratureKey() : id_( -1 ) {}
36
38 FemQuadratureKey( const FemQuadratureKey& key ) = default;
39
40 // this may need to be adjusted in case more than 100 quadratures
41 // need to be stored
42 static const int highest_order = maxFirst * maxSecond ;
43
45 FemQuadratureKey( const int first, const int second )
46 : id_( second * maxFirst + first )
47 {
48 assert( first < maxFirst );
49 assert( second < maxSecond );
50 }
51
54 : id_( first )
55 {
56 assert( first < maxFirst );
57 }
58
60 operator int () const { return id_; }
61
63 int first () const { return id_ % highest_order ; }
65 int second () const { return id_ / highest_order ; }
66 };
67
68
78 template< unsigned int dummy >
80 {
82 template< class QuadImp, class QuadratureKey, unsigned int >
83 class QuadratureStorage;
84 private:
86 template< class QuadImp, class QuadratureKey >
87 class QuadratureStorage< QuadImp, QuadratureKey, dummy >
88 {
89 public:
90 typedef QuadImp QuadType;
91
92 protected:
93 struct Storage
94 {
95 typedef std :: map< QuadratureKey, std::unique_ptr< QuadType > > StorageType;
96 std::mutex mutex_;
98
99 static QuadImp* create( const GeometryType &geometry, const QuadratureKey& key )
100 {
101 return instance().createImpl( geometry, key );
102 }
103
104 private:
105 static Storage& instance()
106 {
108 }
109
110 QuadImp* createImpl( const GeometryType &geometry, const QuadratureKey& key )
111 {
112 std::lock_guard< std::mutex > guard( mutex_ );
113
114 auto& quadPtr = storage_[ key ];
115 if( ! quadPtr )
116 {
117 quadPtr.reset( new QuadImp( geometry, key, IdProvider :: instance().newId() ) );
118 }
119
120 assert( quadPtr );
121 return quadPtr.operator->();
122 }
123 };
124
125 typedef std :: map< QuadratureKey, std::unique_ptr< QuadType, Dune::null_deleter<QuadType> > > PointerStorageType;
126 PointerStorageType quadPtrs_;
127
128 public:
129 QuadratureStorage () {}
130
131 QuadType &getQuadrature( const GeometryType &geometry, const QuadratureKey& key )
132 {
133 auto& quadPtr = quadPtrs_[ key ];
134 if( ! quadPtr )
135 {
136 // create is mutex protected
137 quadPtr.reset( Storage::create( geometry, key ) );
138 }
139
140 assert( quadPtr );
141 return *quadPtr;
142 }
143 };
144
146 template< class QuadImp>
147 class QuadratureStorage< QuadImp, int, dummy > // QuadratureKey == int
148 {
149 public:
150 typedef QuadImp QuadType;
151
152 protected:
153 struct Storage
154 {
155 std::mutex mutex_;
156
157 // vector storing the actual objects
158 std::vector< std::unique_ptr< QuadType > > storage_;
159 Storage() : storage_( QuadType :: maxOrder() + 1 )
160 {}
161
162 static QuadType* create( const GeometryType &geometry, int order )
163 {
164 return instance().createImpl( geometry, order );
165 }
166
167 private:
168 static Storage& instance()
169 {
171 }
172
173 QuadType* createImpl( const GeometryType &geometry, int order )
174 {
175 std::lock_guard< std::mutex > guard( mutex_ );
176
177 auto& quadPtr = storage_[ order ];
178 if( ! quadPtr )
179 {
180 quadPtr.reset( new QuadImp( geometry, order, IdProvider :: instance().newId() ) );
181 }
182 assert( quadPtr );
183 return quadPtr.operator ->();
184 }
185 };
186
187 typedef std::vector< QuadType* > QuadPointerVecType;
188 // store all the pointers for all threads separately to avoid race conditions
189 QuadPointerVecType quadPtrs_;
190
191 public:
192 QuadratureStorage ()
193 : quadPtrs_( QuadPointerVecType( QuadType :: maxOrder() + 1, nullptr ))
194 {
195 }
196
197 public:
198 QuadImp &getQuadrature( const GeometryType &geometry, int order )
199 {
200 if(order >= int(quadPtrs_.size()) )
201 {
202#ifndef NDEBUG
203 static thread_local bool showMessage = true ;
204 if( showMessage )
205 {
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;
209 showMessage = false;
210 }
211#endif
212 order = quadPtrs_.size() - 1;
213 }
214
215 auto& quadPtr = quadPtrs_[ order ];
216 if( ! quadPtr )
217 {
218 // create is mutex protected
219 quadPtr = Storage::create( geometry, order );
220 }
221
222 assert( quadPtr );
223 return *( quadPtr );
224 }
225 }; // end class QuadratureStorage
226
228 template< class QuadImp >
229 class QuadratureStorage< QuadImp, FemQuadratureKey, dummy >
230 : public QuadratureStorage< QuadImp, int, dummy >
231 {
232 };
233
234 public:
240 template< class QuadImp, class QuadratureKey >
241 static const QuadImp &provideQuad( const GeometryType& geometry,
242 const QuadratureKey& key )
243 {
244 // QuadratureStorage stores only pointers to the quadratures that are
245 // created and stored by a singleton storage
246 static thread_local QuadratureStorage< QuadImp, QuadratureKey, dummy > storage;
247 return storage.getQuadrature( geometry, key );
248 }
249
256 template< class QuadImp, class QuadratureKey >
257 static const QuadImp &provideQuad( const GeometryType& geometry,
258 const QuadratureKey& key,
259 const int defaultOrder )
260 {
261 // this function should only be called for geometry types equal to none
262 assert( geometry.isNone() );
263 DUNE_THROW(NotImplemented,"provideQuad for polyhedral cells (defaultOrder = 0) not implemented for arbitrary QuadratureKey!");
264 QuadImp* ptr = nullptr;
265 return *ptr;
266 }
267
274 template< class QuadImp >
275 static const QuadImp &provideQuad( const GeometryType& geometry,
276 const int ,
277 const int defaultOrder )
278 {
279 assert( geometry.isNone() );
280 // QuadratureStorage stores only pointers to the quadratures that are
281 // created and stored by a singleton storage
282 static thread_local QuadratureStorage< QuadImp, int, dummy > storage;
283 return storage.getQuadrature( geometry, defaultOrder );
284 }
285 };
286
302 template< typename FieldImp, int dim, template< class, int > class QuadratureTraits >
304 {
305 public:
306 typedef FieldImp FieldType;
307
308 enum { dimension = dim };
309
310 private:
312
313 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
314
315 public:
317 typedef typename QuadratureTraitsType :: CubeQuadratureType CubeQuadratureType;
318
320 typedef typename QuadratureTraitsType :: IntegrationPointListType
322
324 typedef typename QuadratureTraitsType :: QuadratureKeyType QuadratureKeyType;
325
327 static const IntegrationPointListType &getQuadrature( const GeometryType &geometry,
328 const QuadratureKeyType& quadKey )
329 {
330 assert( geometry.isCube() );
331 return QuadCreator< 0 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey );
332 }
334 static const IntegrationPointListType &getQuadrature( const GeometryType &geometry,
335 const GeometryType &elementGeometry,
336 const QuadratureKeyType& quadKey )
337 {
338 return getQuadrature( geometry, quadKey );
339 }
340
342 QuadratureProvider( const ThisType& ) = delete;
344 };
345
346
347
349 template< typename FieldImp, template< class, int > class QuadratureTraits >
350 class QuadratureProvider< FieldImp, 0, QuadratureTraits >
351 {
352 public:
353 typedef FieldImp FieldType;
354
355 enum { dimension = 0 };
356
357 private:
359
360 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
361
362 public:
364 typedef typename QuadratureTraitsType :: PointQuadratureType PointQuadratureType;
365
367 typedef typename QuadratureTraitsType :: IntegrationPointListType IntegrationPointListType;
368
370 typedef typename QuadratureTraitsType :: QuadratureKeyType QuadratureKeyType;
371
373 static const IntegrationPointListType &getQuadrature( const GeometryType &geometry,
374 const QuadratureKeyType& quadKey )
375 {
376 assert( geometry.isCube() || geometry.isSimplex() );
377 return Singleton< PointQuadratureType > :: instance( geometry, quadKey, IdProvider ::instance().newId() );
378 }
379
381 static const IntegrationPointListType &getQuadrature( const GeometryType &geometry,
382 const GeometryType &elementGeometry,
383 const QuadratureKeyType& quadKey )
384 {
385 return getQuadrature(geometry, quadKey);
386 }
387
389 QuadratureProvider( const ThisType& ) = delete;
391 };
392
393
394
396 template< class FieldImp, template< class, int > class QuadratureTraits >
397 class QuadratureProvider< FieldImp, 1, QuadratureTraits >
398 {
399 public:
400 typedef FieldImp FieldType;
401
402 enum { dimension = 1 };
403
404 private:
406
407 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
408
409 public:
411 typedef typename QuadratureTraitsType :: LineQuadratureType LineQuadratureType;
412
414 typedef typename QuadratureTraitsType :: IntegrationPointListType IntegrationPointListType;
415
417 typedef typename QuadratureTraitsType :: QuadratureKeyType QuadratureKeyType;
418
420 static const IntegrationPointListType &getQuadrature( const GeometryType &geometry,
421 const QuadratureKeyType& quadKey )
422 {
423 assert( geometry.isCube() || geometry.isSimplex() );
424 return QuadCreator< 0 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey );
425 }
426
428 static const IntegrationPointListType &getQuadrature( const GeometryType &geometry,
429 const GeometryType &elementGeometry,
430 const QuadratureKeyType& quadKey )
431 {
432 assert( geometry.isCube() || geometry.isSimplex() );
433 // we need here to distinguish between the basic types
434 // otherwise the this won't work for UGGrid
435 return ( elementGeometry.isSimplex() ) ?
436 QuadCreator< 0 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey ) :
437 QuadCreator< 1 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey ) ;
438 }
439
441 QuadratureProvider( const ThisType& ) = delete;
443 };
444
445
446
448 template< class FieldImp, template< class, int > class QuadratureTraits >
449 class QuadratureProvider< FieldImp, 2, QuadratureTraits >
450 {
451 public:
452 typedef FieldImp FieldType;
453
454 enum { dimension = 2 };
455
456 private:
458
459 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
460
461 public:
463 typedef typename QuadratureTraitsType :: SimplexQuadratureType SimplexQuadratureType;
465 typedef typename QuadratureTraitsType :: CubeQuadratureType CubeQuadratureType;
466
468 typedef typename QuadratureTraitsType :: IntegrationPointListType IntegrationPointListType;
469
471 typedef typename QuadratureTraitsType :: QuadratureKeyType QuadratureKeyType;
472
474 static const IntegrationPointListType &getQuadrature( const GeometryType &geometry,
475 const QuadratureKeyType& quadKey )
476 {
477 assert( geometry.isCube() || geometry.isSimplex() || geometry.isNone() );
478
479 if( geometry.isSimplex() )
480 {
481 return QuadCreator< 0 > ::
482 template provideQuad< SimplexQuadratureType > ( geometry, quadKey );
483 }
484 else if( geometry.isCube() )
485 {
486 return QuadCreator< 1 > ::
487 template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
488 }
489 else // type == None
490 {
491 // dummy return for polygonal grid cells, i.e. geometry type none
492 return QuadCreator< 1 > :: template provideQuad< CubeQuadratureType > ( geometry, 0 );
493 }
494 }
495
497 static const IntegrationPointListType &getQuadrature( const GeometryType &geometry,
498 const GeometryType &elementGeometry,
499 const QuadratureKeyType& quadKey )
500 {
501 assert( geometry.isCube() || geometry.isSimplex() );
502
503 // if geometry is simplex return simplex quadrature
504 if ( geometry.isSimplex() )
505 {
506 // check element geometry to provide quadratures with different ids
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 ) ;
515 else
516 DUNE_THROW( RangeError, "Element type not available for dimension 3" );
517 }
518 else
519 {
520 // return cube quadrature
521 // check element geometry to provide quadratures with different ids
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 ) ;
530 else
531 DUNE_THROW( RangeError, "Element type not available for dimension 3" );
532 }
533
534 DUNE_THROW( RangeError, "Element type not available for dimension 2" );
535 // dummy return
536 return QuadCreator< 0 > ::
537 template provideQuad< SimplexQuadratureType >( geometry, quadKey, 0 );
538 }
539
541 QuadratureProvider( const ThisType& ) = delete;
543 };
544
545
546
548 template< class FieldImp, template< class, int > class QuadratureTraits >
549 class QuadratureProvider< FieldImp, 3, QuadratureTraits >
550 {
551 public:
552 typedef FieldImp FieldType;
553
554 enum { dimension = 3 };
555
556 private:
558
559 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
560
561 public:
563 typedef typename QuadratureTraitsType :: SimplexQuadratureType SimplexQuadratureType;
565 typedef typename QuadratureTraitsType :: CubeQuadratureType CubeQuadratureType;
567 typedef typename QuadratureTraitsType :: PrismQuadratureType PrismQuadratureType;
569 typedef typename QuadratureTraitsType :: PyramidQuadratureType PyramidQuadratureType;
570
572 typedef typename QuadratureTraitsType :: IntegrationPointListType IntegrationPointListType;
573
575 typedef typename QuadratureTraitsType :: QuadratureKeyType QuadratureKeyType;
576
578 static const IntegrationPointListType &getQuadrature( const GeometryType &geometry,
579 const QuadratureKeyType& quadKey )
580 {
581 assert( geometry.isCube() || geometry.isSimplex() || geometry.isNone()
582 || geometry.isPrism() || geometry.isPyramid() );
583
584 if( geometry.isSimplex() )
585 return QuadCreator< 0 > :: template provideQuad< SimplexQuadratureType >
586 ( geometry, quadKey );
587 if( geometry.isCube() )
588 return QuadCreator< 1 > :: template provideQuad< CubeQuadratureType >
589 ( geometry, quadKey );
590
591 if( geometry.isPrism() )
592 return QuadCreator< 2 > :: template provideQuad< PrismQuadratureType >
593 ( geometry, quadKey );
594 if( geometry.isPyramid() )
595 return QuadCreator< 3 > :: template provideQuad< PyramidQuadratureType >
596 ( geometry, quadKey );
597
598 if( geometry.isNone() )
599 {
600 // dummy return for polyhedral grid cells
601 return QuadCreator< 1 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey, 0 );
602 }
603
604 DUNE_THROW( RangeError, "Element type not available for dimension 3" );
605 // dummy return
606 return QuadCreator< 0 > :: template provideQuad< SimplexQuadratureType >
607 ( geometry, quadKey, 0 );
608 }
609
610 static const IntegrationPointListType &getQuadrature( const GeometryType &geometry,
611 const GeometryType &elementGeometry,
612 const QuadratureKeyType& quadKey )
613 {
614 DUNE_THROW( RangeError, "QuadProvider::getQuadrature not implemented for 3d face quadratures!" );
615 // dummy return
616 return QuadCreator< 0 > :: template provideQuad< SimplexQuadratureType >
617 ( geometry, quadKey, 0 );
618 }
619
621 QuadratureProvider( const ThisType& ) = delete;
623 };
624
625 } // namespace Fem
626
627} // namespace Dune
628
629#endif // #ifndef DUNE_FEM_QUADPROVIDER_HH
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
static QuadType * create(const GeometryType &geometry, int order)
Definition: quadprovider.hh:162
std::vector< std::unique_ptr< QuadType > > storage_
Definition: quadprovider.hh:158
provide a single instance pool of quadratures
Definition: quadprovider.hh:304
@ dimension
Definition: quadprovider.hh:308
FieldImp FieldType
Definition: quadprovider.hh:306
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 & operator=(const ThisType &)=delete
FieldImp FieldType
Definition: quadprovider.hh:353
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 & 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 & 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
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 & operator=(const ThisType &)=delete
QuadratureTraitsType::PrismQuadratureType PrismQuadratureType
type of prims quadrature
Definition: quadprovider.hh:567
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