DUNE-FEM (unstable)

quadrature.hh
1#ifndef DUNE_FEM_QUADRATURE_HH
2#define DUNE_FEM_QUADRATURE_HH
3
4#include <cassert>
5#include <memory>
6
9
11
13
14#include <dune/fem/common/coordinate.hh>
15#include <dune/fem/common/utility.hh>
16#include <dune/fem/storage/envelope.hh>
17#include <dune/fem/version.hh>
18#include <dune/fem/quadrature/quadprovider.hh>
19#include <dune/fem/quadrature/defaultquadratures.hh>
20
21namespace Dune
22{
23 namespace Fem
24 {
40 template< class Quadrature >
42 {
43 public:
45
46 typedef typename QuadratureType::CoordinateType CoordinateType;
47 typedef typename QuadratureType::RealType RealType;
48 typedef typename QuadratureType::LocalCoordinateType LocalCoordinateType;
49
50 private:
52
53 protected:
54 const QuadratureType &quadrature_;
55 const unsigned int index_;
56
57 public:
58 QuadraturePointWrapper ( const QuadratureType &quadrature, unsigned int index )
59 : quadrature_( quadrature ), index_( index )
60 {}
61
62 ThisType &operator= ( const ThisType & ) = delete;
63
64 inline const QuadratureType &quadrature () const
65 {
66 return quadrature_;
67 }
68
69 unsigned int index () const { return index_; }
70 const CoordinateType &position () const { return quadrature().point( index() ); }
71 const RealType &weight () const { return quadrature().weight( index() ); }
72 const LocalCoordinateType &localPosition () const { return quadrature().localPoint( index() ); }
73 };
74
75
76
89 template< class Quadrature >
90 static inline typename Quadrature::CoordinateType
92 {
93 return x.position();
94 }
95
101 template< class Quadrature >
103 {
105
106 public:
107 typedef std::forward_iterator_tag iterator_category;
109 typedef std::ptrdiff_t difference_type;
110 typedef Envelope< QuadraturePointWrapper< Quadrature > > pointer;
112
113 QuadraturePointIterator () noexcept = default;
114
115 QuadraturePointIterator ( const Quadrature &quadrature, std::size_t point ) noexcept
116 : quadrature_( &quadrature ), point_( point )
117 {}
118
119 reference operator* () const noexcept { return value_type( quadrature(), point_ ); }
120 pointer operator-> () const noexcept { return pointer( value_type( quadrature(), point_ ) ); }
121
122 bool operator== ( const ThisType &other ) const noexcept { return (point_ == other.point_); }
123 bool operator!= ( const ThisType &other ) const noexcept { return (point_ != other.point_); }
124
125 ThisType &operator++ () noexcept { ++point_; return *this; }
126 ThisType operator++ ( int ) noexcept { ThisType copy( *this ); ++(*this); return copy; }
127
128 const Quadrature &quadrature () const noexcept { assert( quadrature_ ); return *quadrature_; }
129
130 protected:
131 const Quadrature *quadrature_ = nullptr;
132 std::size_t point_ = 0;
133 };
134
135
136
154 template< typename FieldImp, int dim,
155 template< class, int > class IntegrationTraits >
157 {
158 public:
159 typedef FieldImp FieldType;
160
161 enum { dimension = dim };
162
163 typedef IntegrationTraits< FieldType, dimension > Traits;
164
165 private:
167
170
171 public:
173 typedef typename Traits :: IntegrationPointListType IntegrationPointListType;
174
176 typedef typename IntegrationPointListType :: CoordinateType CoordinateType;
177
179 typedef typename Traits :: QuadratureKeyType QuadratureKeyType;
180
182
183 typedef std::shared_ptr< const IntegrationPointListType > IntegrationPointListStorageType;
184
186 enum { codimension = 0 };
187
188 protected:
189 // when the integration point list is obtained from the
190 // QuadratureProvider then it should not be deleted
191 struct NoDelete
192 {
193 void operator()( const IntegrationPointListType* ) {}
194 };
195
196 IntegrationPointListStorageType ipListPtr_;
197
198 public:
210 const QuadratureKeyType& quadKey )
211 : ipListPtr_( &QuadratureProviderType :: getQuadrature( geometryType, quadKey ), NoDelete() )
212 {
213 }
214
228 const GeometryType &elementGeometry,
229 const QuadratureKeyType& quadKey )
230 : ipListPtr_( &QuadratureProviderType :: getQuadrature( geometryType, elementGeometry, quadKey ), NoDelete() )
231 {
232 }
233
244 : ipListPtr_( &ipList, NoDelete() )
245 {
246 }
247
257 inline IntegrationPointList ( const IntegrationPointListStorageType& ipListPtr )
258 : ipListPtr_( ipListPtr )
259 {
260 }
261
267 : ipListPtr_( org.ipListPtr_ )
268 {
269 }
270
271 const QuadraturePointWrapperType operator[] ( unsigned int i ) const
272 {
273 return QuadraturePointWrapperType( *this, i );
274 }
275
282 {
283 assert( ipListPtr_ );
284 return *ipListPtr_;
285 }
286
291 int nop () const
292 {
293 return ipList().nop();
294 }
295
307 const CoordinateType &point ( size_t i ) const
308 {
309 return ipList().point( i );
310 }
311
323 size_t id () const
324 {
325 return ipList().id();
326 }
327
341 int order () const
342 {
343 return ipList().order();
344 }
345
359 {
360 return ipList().geometryType();
361 }
362
365 auto interpolationPoints( const int reqDim ) const
366 {
367 return ipList().interpolationPoints( reqDim );
368 }
369
372 bool isFaceInterpolationQuadrature( const size_t numShapeFunctions ) const
373 {
374 return ipList().isFaceInterpolationQuadrature( numShapeFunctions );
375 }
376 };
377
378
379
397 template< class FieldImp, int dim,
398 template< class, int > class QuadratureTraits = DefaultQuadratureTraits >
400 : public IntegrationPointList< FieldImp, dim, QuadratureTraits >
401 {
402 public:
403 typedef FieldImp FieldType;
404
405 static const unsigned int dimension = dim ;
406
407 typedef QuadratureTraits< FieldType, dimension > Traits;
408
409 private:
412
415
416 public:
417 using BaseType :: ipList;
418
419 typedef typename BaseType::IntegrationPointListStorageType IntegrationPointListStorageType;
420
422 typedef typename Traits :: IntegrationPointListType IntegrationPointListType;
423
425 typedef typename IntegrationPointListType :: CoordinateType CoordinateType;
426
428 typedef typename Traits :: QuadratureKeyType QuadratureKeyType;
429
431 enum { codimension = 0 };
432
433 public:
445 : BaseType( geometryType, key )
446 {
447 }
448
465 const GeometryType &elementGeometry,
466 const QuadratureKeyType &key )
467 : BaseType( geometryType, elementGeometry, key )
468 {
469 }
470
481 : BaseType( ipList )
482 {
483 }
484
494 inline explicit Quadrature( const IntegrationPointListStorageType& ipListPtr )
495 : BaseType( ipListPtr )
496 {
497 }
498
504 inline Quadrature( const Quadrature &org )
505 : BaseType( org )
506 {
507 }
508
523 const FieldType &weight( size_t i ) const
524 {
525 return ipList().weight( i );
526 }
527 };
528
529
536 template <class Quadrature>
537 using SelectQuadraturePointSetId = detail::SelectPointSetId< Quadrature, -Dune::QuadratureType::size >;
538
539 } //end namespace Fem
540
541} //end namespace Dune
542
543#endif
actual interface class for integration point lists
Definition: quadrature.hh:157
Traits::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadrature.hh:173
int nop() const
obtain the number of integration points
Definition: quadrature.hh:291
const IntegrationPointListType & ipList() const
obtain a reference the actual implementation
Definition: quadrature.hh:281
IntegrationPointListType::CoordinateType CoordinateType
type of coordinate
Definition: quadrature.hh:176
GeometryType geometryType() const
obtain GeometryType for this integration point list
Definition: quadrature.hh:358
IntegrationPointList(const IntegrationPointListStorageType &ipListPtr)
create an integration point list from an implementation
Definition: quadrature.hh:257
size_t id() const
obtain the identifier of the integration point list
Definition: quadrature.hh:323
int order() const
obtain order of the integration point list
Definition: quadrature.hh:341
auto interpolationPoints(const int reqDim) const
returns list of element interpolation points for a given face quadrature
Definition: quadrature.hh:365
const CoordinateType & point(size_t i) const
obtain coordinates of i-th integration point
Definition: quadrature.hh:307
IntegrationPointList(const IntegrationPointList &org)
copy constructor
Definition: quadrature.hh:266
IntegrationPointList(const GeometryType &geometryType, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
create a quadrature for a given geometry type and order
Definition: quadrature.hh:227
IntegrationPointList(const IntegrationPointListType &ipList)
create an integration point list from an implementation
Definition: quadrature.hh:243
Traits::QuadratureKeyType QuadratureKeyType
type of key to identify quadrature on user side (default the order of the quadrature)
Definition: quadrature.hh:179
bool isFaceInterpolationQuadrature(const size_t numShapeFunctions) const
return true if quadrature is also a set of interpolation points for the given shape functions
Definition: quadrature.hh:372
IntegrationPointList(const GeometryType &geometryType, const QuadratureKeyType &quadKey)
create a quadrature for a given geometry type and order
Definition: quadrature.hh:209
const FieldType & weight(size_t i) const
obtain weight of i-th integration point
Definition: quadratureimp.hh:251
iterator over quadrature points
Definition: quadrature.hh:103
wrapper for a (Quadrature,int) pair
Definition: quadrature.hh:42
static Quadrature::CoordinateType coordinate(const QuadraturePointWrapper< Quadrature > &x)
extract the real coordinate from a point
Definition: quadrature.hh:91
provide a single instance pool of quadratures
Definition: quadprovider.hh:304
actual interface class for quadratures
Definition: quadrature.hh:401
Traits::IntegrationPointListType IntegrationPointListType
type of the implementation (this must actually be a quadrature implementation)
Definition: quadrature.hh:422
Traits::QuadratureKeyType QuadratureKeyType
type of key to identify the quadrature
Definition: quadrature.hh:428
const FieldType & weight(size_t i) const
obtain weight of i-th integration point
Definition: quadrature.hh:523
Quadrature(const GeometryType &geometryType, const QuadratureKeyType &key)
create a quadrature for a given geometry and order
Definition: quadrature.hh:444
Quadrature(const IntegrationPointListType &ipList)
create an integration point list from an implementation
Definition: quadrature.hh:480
Quadrature(const IntegrationPointListStorageType &ipListPtr)
create an integration point list from an implementation
Definition: quadrature.hh:494
Quadrature(const Quadrature &org)
copy constructor
Definition: quadrature.hh:504
IntegrationPointListType::CoordinateType CoordinateType
type of local coordinate vectors
Definition: quadrature.hh:425
Quadrature(const GeometryType &geometryType, const GeometryType &elementGeometry, const QuadratureKeyType &key)
create a quadrature for a given geometry and order
Definition: quadrature.hh:464
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
Different resources needed by all grid implementations.
A few common exception classes.
Implements a vector constructed from a given type representing a field and a compile-time given size.
Dune namespace.
Definition: alignedallocator.hh:13
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 24, 22:29, 2024)