dune-fem 2.8.0
Loading...
Searching...
No Matches
quadrature.hh
Go to the documentation of this file.
1#ifndef DUNE_FEM_QUADRATURE_HH
2#define DUNE_FEM_QUADRATURE_HH
3
4#include <cassert>
5#include <iterator>
6#include <memory>
7
8#include <dune/common/fvector.hh>
9#include <dune/common/exceptions.hh>
10
11#include <dune/geometry/quadraturerules.hh>
12
13#include <dune/grid/common/grid.hh>
14
18#include <dune/fem/version.hh>
21
22namespace Dune
23{
24 namespace Fem
25 {
41 template< class Quadrature >
43 {
44 public:
46
48 typedef typename QuadratureType::RealType RealType;
49 typedef typename QuadratureType::LocalCoordinateType LocalCoordinateType;
50
51 private:
53
54 protected:
56 const unsigned int index_;
57
58 public:
61 {}
62
63 ThisType &operator= ( const ThisType & ) = delete;
64
65 inline const QuadratureType &quadrature () const
66 {
67 return quadrature_;
68 }
69
70 unsigned int index () const { return index_; }
71 const CoordinateType &position () const { return quadrature().point( index() ); }
72 const RealType &weight () const { return quadrature().weight( index() ); }
73 const LocalCoordinateType &localPosition () const { return quadrature().localPoint( index() ); }
74 };
75
76
77
90 template< class Quadrature >
91 static inline typename Quadrature::CoordinateType
93 {
94 return x.position();
95 }
96
102 template< class Quadrature >
104 : public std::iterator< std::forward_iterator_tag, QuadraturePointWrapper< Quadrature >,
105 std::ptrdiff_t, Envelope< QuadraturePointWrapper< Quadrature > >, QuadraturePointWrapper< Quadrature > >
106 {
108 typedef std::iterator< std::forward_iterator_tag, QuadraturePointWrapper< Quadrature >,
110 BaseType;
111
112 public:
113 typedef typename BaseType::value_type value_type;
114 typedef typename BaseType::pointer pointer;
115 typedef typename BaseType::reference reference;
116
117 QuadraturePointIterator () noexcept = default;
118
119 QuadraturePointIterator ( const Quadrature &quadrature, std::size_t point ) noexcept
120 : quadrature_( &quadrature ), point_( point )
121 {}
122
123 reference operator* () const noexcept { return value_type( quadrature(), point_ ); }
124 pointer operator-> () const noexcept { return pointer( value_type( quadrature(), point_ ) ); }
125
126 bool operator== ( const ThisType &other ) const noexcept { return (point_ == other.point_); }
127 bool operator!= ( const ThisType &other ) const noexcept { return (point_ != other.point_); }
128
129 ThisType &operator++ () noexcept { ++point_; return *this; }
130 ThisType operator++ ( int ) noexcept { ThisType copy( *this ); ++(*this); return copy; }
131
132 const Quadrature &quadrature () const noexcept { assert( quadrature_ ); return *quadrature_; }
133
134 protected:
135 const Quadrature *quadrature_ = nullptr;
136 std::size_t point_ = 0;
137 };
138
139
140
158 template< typename FieldImp, int dim,
159 template< class, int > class IntegrationTraits >
161 {
162 public:
163 typedef FieldImp FieldType;
164
165 enum { dimension = dim };
166
167 typedef IntegrationTraits< FieldType, dimension > Traits;
168
169 private:
171
174
175 public:
177 typedef typename Traits :: IntegrationPointListType IntegrationPointListType;
178
180 typedef typename IntegrationPointListType :: CoordinateType CoordinateType;
181
183 typedef typename Traits :: QuadratureKeyType QuadratureKeyType;
184
186
187 typedef std::shared_ptr< const IntegrationPointListType > IntegrationPointListStorageType;
188
190 enum { codimension = 0 };
191
192 protected:
193 // when the integration point list is obtained from the
194 // QuadratureProvider then it should not be deleted
195 struct NoDelete
196 {
198 };
199
201
202 public:
213 inline IntegrationPointList ( const GeometryType &geometryType,
214 const QuadratureKeyType& quadKey )
215 : ipListPtr_( &QuadratureProviderType :: getQuadrature( geometryType, quadKey ), NoDelete() )
216 {
217 }
218
231 inline IntegrationPointList ( const GeometryType &geometryType,
232 const GeometryType &elementGeometry,
233 const QuadratureKeyType& quadKey )
234 : ipListPtr_( &QuadratureProviderType :: getQuadrature( geometryType, elementGeometry, quadKey ), NoDelete() )
235 {
236 }
237
248 : ipListPtr_( &ipList, NoDelete() )
249 {
250 }
251
262 : ipListPtr_( ipListPtr )
263 {
264 }
265
271 : ipListPtr_( org.ipListPtr_ )
272 {
273 }
274
275 const QuadraturePointWrapperType operator[] ( unsigned int i ) const
276 {
277 return QuadraturePointWrapperType( *this, i );
278 }
279
286 {
287 assert( ipListPtr_ );
288 return *ipListPtr_;
289 }
290
295 int nop () const
296 {
297 return ipList().nop();
298 }
299
311 const CoordinateType &point ( size_t i ) const
312 {
313 return ipList().point( i );
314 }
315
327 size_t id () const
328 {
329 return ipList().id();
330 }
331
345 int order () const
346 {
347 return ipList().order();
348 }
349
362 GeometryType geometryType () const
363 {
364 return ipList().geometryType();
365 }
366
369 auto interpolationPoints( const int reqDim ) const
370 {
371 return ipList().interpolationPoints( reqDim );
372 }
373
376 bool isFaceInterpolationQuadrature( const size_t numShapeFunctions ) const
377 {
378 return ipList().isFaceInterpolationQuadrature( numShapeFunctions );
379 }
380 };
381
382
383
401 template< class FieldImp, int dim,
402 template< class, int > class QuadratureTraits = DefaultQuadratureTraits >
404 : public IntegrationPointList< FieldImp, dim, QuadratureTraits >
405 {
406 public:
407 typedef FieldImp FieldType;
408
409 static const unsigned int dimension = dim ;
410
411 typedef QuadratureTraits< FieldType, dimension > Traits;
412
413 private:
416
419
420 public:
421 using BaseType :: ipList;
422
424
426 typedef typename Traits :: IntegrationPointListType IntegrationPointListType;
427
429 typedef typename IntegrationPointListType :: CoordinateType CoordinateType;
430
432 typedef typename Traits :: QuadratureKeyType QuadratureKeyType;
433
435 enum { codimension = 0 };
436
437 public:
448 inline Quadrature( const GeometryType &geometryType, const QuadratureKeyType &key )
449 : BaseType( geometryType, key )
450 {
451 }
452
468 inline Quadrature ( const GeometryType &geometryType,
469 const GeometryType &elementGeometry,
470 const QuadratureKeyType &key )
471 : BaseType( geometryType, elementGeometry, key )
472 {
473 }
474
485 : BaseType( ipList )
486 {
487 }
488
498 inline explicit Quadrature( const IntegrationPointListStorageType& ipListPtr )
499 : BaseType( ipListPtr )
500 {
501 }
502
508 inline Quadrature( const Quadrature &org )
509 : BaseType( org )
510 {
511 }
512
527 const FieldType &weight( size_t i ) const
528 {
529 return ipList().weight( i );
530 }
531 };
532
533
540 template <class Quadrature>
541 using SelectQuadraturePointSetId = detail::SelectPointSetId< Quadrature, -Dune::QuadratureType::size >;
542
543 } //end namespace Fem
544
545} //end namespace Dune
546
547#endif
STL namespace.
Definition: bindguard.hh:11
detail::SelectPointSetId< Quadrature, -Dune::QuadratureType::size > SelectQuadraturePointSetId
Definition: quadrature.hh:541
provide a single instance pool of quadratures
Definition: quadprovider.hh:304
wrapper for a (Quadrature,int) pair
Definition: quadrature.hh:43
ThisType & operator=(const ThisType &)=delete
QuadraturePointWrapper(const QuadratureType &quadrature, unsigned int index)
Definition: quadrature.hh:59
const RealType & weight() const
Definition: quadrature.hh:72
QuadratureType::CoordinateType CoordinateType
Definition: quadrature.hh:47
const CoordinateType & position() const
Definition: quadrature.hh:71
QuadratureType::LocalCoordinateType LocalCoordinateType
Definition: quadrature.hh:49
const LocalCoordinateType & localPosition() const
Definition: quadrature.hh:73
unsigned int index() const
Definition: quadrature.hh:70
const QuadratureType & quadrature_
Definition: quadrature.hh:55
QuadratureType::RealType RealType
Definition: quadrature.hh:48
Quadrature QuadratureType
Definition: quadrature.hh:45
const QuadratureType & quadrature() const
Definition: quadrature.hh:65
static Quadrature::CoordinateType coordinate(const QuadraturePointWrapper< Quadrature > &x)
extract the real coordinate from a point
Definition: quadrature.hh:92
const unsigned int index_
Definition: quadrature.hh:56
iterator over quadrature points
Definition: quadrature.hh:106
pointer operator->() const noexcept
Definition: quadrature.hh:124
const Quadrature * quadrature_
Definition: quadrature.hh:135
BaseType::reference reference
Definition: quadrature.hh:115
reference operator*() const noexcept
Definition: quadrature.hh:123
BaseType::pointer pointer
Definition: quadrature.hh:114
bool operator!=(const ThisType &other) const noexcept
Definition: quadrature.hh:127
BaseType::value_type value_type
Definition: quadrature.hh:113
ThisType & operator++() noexcept
Definition: quadrature.hh:129
std::size_t point_
Definition: quadrature.hh:136
QuadraturePointIterator() noexcept=default
const Quadrature & quadrature() const noexcept
Definition: quadrature.hh:132
bool operator==(const ThisType &other) const noexcept
Definition: quadrature.hh:126
actual interface class for integration point lists
Definition: quadrature.hh:161
Traits::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadrature.hh:177
FieldImp FieldType
Definition: quadrature.hh:163
IntegrationPointListStorageType ipListPtr_
Definition: quadrature.hh:200
int nop() const
obtain the number of integration points
Definition: quadrature.hh:295
const IntegrationPointListType & ipList() const
obtain a reference the actual implementation
Definition: quadrature.hh:285
const QuadraturePointWrapperType operator[](unsigned int i) const
Definition: quadrature.hh:275
std::shared_ptr< const IntegrationPointListType > IntegrationPointListStorageType
Definition: quadrature.hh:187
IntegrationPointListType::CoordinateType CoordinateType
type of coordinate
Definition: quadrature.hh:180
GeometryType geometryType() const
obtain GeometryType for this integration point list
Definition: quadrature.hh:362
IntegrationPointList(const IntegrationPointListStorageType &ipListPtr)
create an integration point list from an implementation
Definition: quadrature.hh:261
@ dimension
Definition: quadrature.hh:165
size_t id() const
obtain the identifier of the integration point list
Definition: quadrature.hh:327
int order() const
obtain order of the integration point list
Definition: quadrature.hh:345
auto interpolationPoints(const int reqDim) const
returns list of element interpolation points for a given face quadrature
Definition: quadrature.hh:369
const CoordinateType & point(size_t i) const
obtain coordinates of i-th integration point
Definition: quadrature.hh:311
@ codimension
Definition: quadrature.hh:190
IntegrationPointList(const IntegrationPointList &org)
copy constructor
Definition: quadrature.hh:270
IntegrationPointList(const GeometryType &geometryType, const GeometryType &elementGeometry, const QuadratureKeyType &quadKey)
create a quadrature for a given geometry type and order
Definition: quadrature.hh:231
IntegrationPointList(const IntegrationPointListType &ipList)
create an integration point list from an implementation
Definition: quadrature.hh:247
Traits::QuadratureKeyType QuadratureKeyType
type of key to identify quadrature on user side (default the order of the quadrature)
Definition: quadrature.hh:183
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:376
IntegrationTraits< FieldType, dimension > Traits
Definition: quadrature.hh:167
QuadraturePointWrapper< ThisType > QuadraturePointWrapperType
Definition: quadrature.hh:185
IntegrationPointList(const GeometryType &geometryType, const QuadratureKeyType &quadKey)
create a quadrature for a given geometry type and order
Definition: quadrature.hh:213
Definition: quadrature.hh:196
void operator()(const IntegrationPointListType *)
Definition: quadrature.hh:197
actual interface class for quadratures
Definition: quadrature.hh:405
Traits::IntegrationPointListType IntegrationPointListType
type of the implementation (this must actually be a quadrature implementation)
Definition: quadrature.hh:426
Traits::QuadratureKeyType QuadratureKeyType
type of key to identify the quadrature
Definition: quadrature.hh:432
const FieldType & weight(size_t i) const
obtain weight of i-th integration point
Definition: quadrature.hh:527
Quadrature(const GeometryType &geometryType, const QuadratureKeyType &key)
create a quadrature for a given geometry and order
Definition: quadrature.hh:448
FieldImp FieldType
Definition: quadrature.hh:407
BaseType::IntegrationPointListStorageType IntegrationPointListStorageType
Definition: quadrature.hh:423
Quadrature(const IntegrationPointListType &ipList)
create an integration point list from an implementation
Definition: quadrature.hh:484
Quadrature(const IntegrationPointListStorageType &ipListPtr)
create an integration point list from an implementation
Definition: quadrature.hh:498
@ codimension
Definition: quadrature.hh:435
Quadrature(const Quadrature &org)
copy constructor
Definition: quadrature.hh:508
QuadratureTraits< FieldType, dimension > Traits
Definition: quadrature.hh:411
IntegrationPointListType::CoordinateType CoordinateType
type of local coordinate vectors
Definition: quadrature.hh:429
static const unsigned int dimension
Definition: quadrature.hh:409
Quadrature(const GeometryType &geometryType, const GeometryType &elementGeometry, const QuadratureKeyType &key)
create a quadrature for a given geometry and order
Definition: quadrature.hh:468
Definition: envelope.hh:11