DUNE-FEM (unstable)

quadprovider.hh
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
10#include <dune/fem/quadrature/quadratureimp.hh>
11#include <dune/fem/quadrature/idprovider.hh>
12#include <dune/fem/misc/mpimanager.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_;
97 StorageType storage_;
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
328 const QuadratureKeyType& quadKey )
329 {
330 assert( geometry.isCube() );
331 return QuadCreator< 0 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey );
332 }
335 const GeometryType &elementGeometry,
336 const QuadratureKeyType& quadKey )
337 {
338 return getQuadrature( geometry, quadKey );
339 }
340
341 QuadratureProvider() = delete;
342 QuadratureProvider( const ThisType& ) = delete;
343 QuadratureProvider &operator=( 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
372 class PointQuadratureStorage : public PointQuadratureType
373 {
374 public:
375 // only call IdProvider ::instance().newId() when object is created
376 PointQuadratureStorage( const GeometryType &geometry, const QuadratureKeyType& quadKey )
377 : PointQuadratureType( geometry, quadKey, IdProvider::instance().newId() )
378 {}
379 };
380
383 const QuadratureKeyType& quadKey )
384 {
385 assert( geometry.isCube() || geometry.isSimplex() );
386 return Singleton< PointQuadratureStorage > :: instance( geometry, quadKey );
387 }
388
391 const GeometryType &elementGeometry,
392 const QuadratureKeyType& quadKey )
393 {
394 return getQuadrature(geometry, quadKey);
395 }
396
397 QuadratureProvider() = delete;
398 QuadratureProvider( const ThisType& ) = delete;
399 QuadratureProvider &operator=( const ThisType& ) = delete;
400 };
401
402
403
405 template< class FieldImp, template< class, int > class QuadratureTraits >
406 class QuadratureProvider< FieldImp, 1, QuadratureTraits >
407 {
408 public:
409 typedef FieldImp FieldType;
410
411 enum { dimension = 1 };
412
413 private:
415
416 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
417
418 public:
420 typedef typename QuadratureTraitsType :: LineQuadratureType LineQuadratureType;
421
423 typedef typename QuadratureTraitsType :: IntegrationPointListType IntegrationPointListType;
424
426 typedef typename QuadratureTraitsType :: QuadratureKeyType QuadratureKeyType;
427
430 const QuadratureKeyType& quadKey )
431 {
432 assert( geometry.isCube() || geometry.isSimplex() );
433 return QuadCreator< 0 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey );
434 }
435
438 const GeometryType &elementGeometry,
439 const QuadratureKeyType& quadKey )
440 {
441 assert( geometry.isCube() || geometry.isSimplex() );
442 // we need here to distinguish between the basic types
443 // otherwise the this won't work for UGGrid
444 return ( elementGeometry.isSimplex() ) ?
445 QuadCreator< 0 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey ) :
446 QuadCreator< 1 > :: template provideQuad< LineQuadratureType > ( geometry, quadKey ) ;
447 }
448
449 QuadratureProvider() = delete;
450 QuadratureProvider( const ThisType& ) = delete;
451 QuadratureProvider &operator=( const ThisType& ) = delete;
452 };
453
454
455
457 template< class FieldImp, template< class, int > class QuadratureTraits >
458 class QuadratureProvider< FieldImp, 2, QuadratureTraits >
459 {
460 public:
461 typedef FieldImp FieldType;
462
463 enum { dimension = 2 };
464
465 private:
467
468 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
469
470 public:
472 typedef typename QuadratureTraitsType :: SimplexQuadratureType SimplexQuadratureType;
474 typedef typename QuadratureTraitsType :: CubeQuadratureType CubeQuadratureType;
475
477 typedef typename QuadratureTraitsType :: IntegrationPointListType IntegrationPointListType;
478
480 typedef typename QuadratureTraitsType :: QuadratureKeyType QuadratureKeyType;
481
484 const QuadratureKeyType& quadKey )
485 {
486 assert( geometry.isCube() || geometry.isSimplex() || geometry.isNone() );
487
488 if( geometry.isSimplex() )
489 {
490 return QuadCreator< 0 > ::
491 template provideQuad< SimplexQuadratureType > ( geometry, quadKey );
492 }
493 else if( geometry.isCube() )
494 {
495 return QuadCreator< 1 > ::
496 template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
497 }
498 else // type == None
499 {
500 // dummy return for polygonal grid cells, i.e. geometry type none
501 return QuadCreator< 1 > :: template provideQuad< CubeQuadratureType > ( geometry, 0 );
502 }
503 }
504
507 const GeometryType &elementGeometry,
508 const QuadratureKeyType& quadKey )
509 {
510 assert( geometry.isCube() || geometry.isSimplex() );
511
512 // if geometry is simplex return simplex quadrature
513 if ( geometry.isSimplex() )
514 {
515 // check element geometry to provide quadratures with different ids
516 if( elementGeometry.isSimplex() )
517 return QuadCreator< 0 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
518 else if( elementGeometry.isCube() )
519 return QuadCreator< 1 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
520 else if( elementGeometry.isPrism() )
521 return QuadCreator< 2 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
522 else if( elementGeometry.isPyramid() )
523 return QuadCreator< 3 > :: template provideQuad< SimplexQuadratureType > ( geometry, quadKey ) ;
524 else
525 DUNE_THROW( RangeError, "Element type not available for dimension 3" );
526 }
527 else
528 {
529 // return cube quadrature
530 // check element geometry to provide quadratures with different ids
531 if( elementGeometry.isSimplex() )
532 return QuadCreator< 4 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
533 else if( elementGeometry.isCube() )
534 return QuadCreator< 5 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
535 else if( elementGeometry.isPrism() )
536 return QuadCreator< 6 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
537 else if( elementGeometry.isPyramid() )
538 return QuadCreator< 7 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey ) ;
539 else
540 DUNE_THROW( RangeError, "Element type not available for dimension 3" );
541 }
542
543 DUNE_THROW( RangeError, "Element type not available for dimension 2" );
544 // dummy return
545 return QuadCreator< 0 > ::
546 template provideQuad< SimplexQuadratureType >( geometry, quadKey, 0 );
547 }
548
549 QuadratureProvider() = delete;
550 QuadratureProvider( const ThisType& ) = delete;
551 QuadratureProvider &operator=( const ThisType& ) = delete;
552 };
553
554
555
557 template< class FieldImp, template< class, int > class QuadratureTraits >
558 class QuadratureProvider< FieldImp, 3, QuadratureTraits >
559 {
560 public:
561 typedef FieldImp FieldType;
562
563 enum { dimension = 3 };
564
565 private:
567
568 typedef QuadratureTraits< FieldType, dimension > QuadratureTraitsType;
569
570 public:
572 typedef typename QuadratureTraitsType :: SimplexQuadratureType SimplexQuadratureType;
574 typedef typename QuadratureTraitsType :: CubeQuadratureType CubeQuadratureType;
576 typedef typename QuadratureTraitsType :: PrismQuadratureType PrismQuadratureType;
578 typedef typename QuadratureTraitsType :: PyramidQuadratureType PyramidQuadratureType;
579
581 typedef typename QuadratureTraitsType :: IntegrationPointListType IntegrationPointListType;
582
584 typedef typename QuadratureTraitsType :: QuadratureKeyType QuadratureKeyType;
585
588 const QuadratureKeyType& quadKey )
589 {
590 assert( geometry.isCube() || geometry.isSimplex() || geometry.isNone()
591 || geometry.isPrism() || geometry.isPyramid() );
592
593 if( geometry.isSimplex() )
594 return QuadCreator< 0 > :: template provideQuad< SimplexQuadratureType >
595 ( geometry, quadKey );
596 if( geometry.isCube() )
597 return QuadCreator< 1 > :: template provideQuad< CubeQuadratureType >
598 ( geometry, quadKey );
599
600 if( geometry.isPrism() )
601 return QuadCreator< 2 > :: template provideQuad< PrismQuadratureType >
602 ( geometry, quadKey );
603 if( geometry.isPyramid() )
604 return QuadCreator< 3 > :: template provideQuad< PyramidQuadratureType >
605 ( geometry, quadKey );
606
607 if( geometry.isNone() )
608 {
609 // dummy return for polyhedral grid cells
610 return QuadCreator< 1 > :: template provideQuad< CubeQuadratureType > ( geometry, quadKey, 0 );
611 }
612
613 DUNE_THROW( RangeError, "Element type not available for dimension 3" );
614 // dummy return
615 return QuadCreator< 0 > :: template provideQuad< SimplexQuadratureType >
616 ( geometry, quadKey, 0 );
617 }
618
619 static const IntegrationPointListType &getQuadrature( const GeometryType &geometry,
620 const GeometryType &elementGeometry,
621 const QuadratureKeyType& quadKey )
622 {
623 DUNE_THROW( RangeError, "QuadProvider::getQuadrature not implemented for 3d face quadratures!" );
624 // dummy return
625 return QuadCreator< 0 > :: template provideQuad< SimplexQuadratureType >
626 ( geometry, quadKey, 0 );
627 }
628
629 QuadratureProvider() = delete;
630 QuadratureProvider( const ThisType& ) = delete;
631 QuadratureProvider &operator=( const ThisType& ) = delete;
632 };
633
634 } // namespace Fem
635
636} // namespace Dune
637
638#endif // #ifndef DUNE_FEM_QUADPROVIDER_HH
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
FemQuadratureKey(const int first, const int second)
constructor taking to ids, like std::pair
Definition: quadprovider.hh:45
static IdProvider & instance()
Access to the singleton object.
Definition: idprovider.hh:21
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
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:390
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:382
QuadratureTraitsType::PointQuadratureType PointQuadratureType
type of point quadrature
Definition: quadprovider.hh:364
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:429
QuadratureTraitsType::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:426
QuadratureTraitsType::LineQuadratureType LineQuadratureType
type of line quadrature
Definition: quadprovider.hh:420
QuadratureTraitsType::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:423
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:437
QuadratureTraitsType::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:477
QuadratureTraitsType::CubeQuadratureType CubeQuadratureType
type of cube quadrature
Definition: quadprovider.hh:474
QuadratureTraitsType::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:480
QuadratureTraitsType::SimplexQuadratureType SimplexQuadratureType
type of simplex quadrature
Definition: quadprovider.hh:472
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:506
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:483
QuadratureTraitsType::PrismQuadratureType PrismQuadratureType
type of prims quadrature
Definition: quadprovider.hh:576
QuadratureTraitsType::CubeQuadratureType CubeQuadratureType
type of cube quadrature
Definition: quadprovider.hh:574
QuadratureTraitsType::QuadratureKeyType QuadratureKeyType
key for access of quadratures in the storage
Definition: quadprovider.hh:584
QuadratureTraitsType::SimplexQuadratureType SimplexQuadratureType
type of simplex quadrature
Definition: quadprovider.hh:572
QuadratureTraitsType::PyramidQuadratureType PyramidQuadratureType
type of pyramid quadrature
Definition: quadprovider.hh:578
QuadratureTraitsType::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadprovider.hh:581
static const IntegrationPointListType & getQuadrature(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Access to the quadrature implementations.
Definition: quadprovider.hh:587
provide a single instance pool of quadratures
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: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
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
static DUNE_EXPORT Object & instance(Args &&... args)
return singleton instance of given Object type.
Definition: singleton.hh:123
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
constexpr bool isPyramid() const
Return true if entity is a pyramid.
Definition: type.hh:304
constexpr bool isPrism() const
Return true if entity is a prism.
Definition: type.hh:309
constexpr bool isCube() const
Return true if entity is a cube of any dimension.
Definition: type.hh:324
constexpr bool isNone() const
Return true if entity is a singular of any dimension.
Definition: type.hh:355
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition: type.hh:319
Default exception for dummy implementations.
Definition: exceptions.hh:263
Default exception class for range errors.
Definition: exceptions.hh:254
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
Dune namespace.
Definition: alignedallocator.hh:13
This file implements several utilities related to std::shared_ptr.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Nov 12, 23:30, 2024)