dune-fem  2.8-git
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 
22 namespace 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 
484  inline explicit Quadrature( const IntegrationPointListType& ipList )
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
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:235
wrapper for a (Quadrature,int) pair
Definition: quadrature.hh:43
QuadraturePointWrapper(const QuadratureType &quadrature, unsigned int index)
Definition: quadrature.hh:59
QuadratureType::CoordinateType CoordinateType
Definition: quadrature.hh:47
QuadratureType::LocalCoordinateType LocalCoordinateType
Definition: quadrature.hh:49
unsigned int index() const
Definition: quadrature.hh:70
const QuadratureType & quadrature_
Definition: quadrature.hh:55
const RealType & weight() const
Definition: quadrature.hh:72
QuadratureType::RealType RealType
Definition: quadrature.hh:48
Quadrature QuadratureType
Definition: quadrature.hh:45
const LocalCoordinateType & localPosition() const
Definition: quadrature.hh:73
const CoordinateType & position() const
Definition: quadrature.hh:71
ThisType & operator=(const ThisType &)=delete
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
ThisType & operator++() noexcept
Definition: quadrature.hh:129
BaseType::value_type value_type
Definition: quadrature.hh:113
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
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 QuadraturePointWrapperType operator[](unsigned int i) const
Definition: quadrature.hh:275
std::shared_ptr< const IntegrationPointListType > IntegrationPointListStorageType
Definition: quadrature.hh:187
const IntegrationPointListType & ipList() const
obtain a reference the actual implementation
Definition: quadrature.hh:285
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
Traits ::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadrature.hh:177
@ 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
const CoordinateType & point(size_t i) const
obtain coordinates of i-th integration point
Definition: quadrature.hh:311
auto interpolationPoints(const int reqDim) const
returns list of element interpolation points for a given face quadrature
Definition: quadrature.hh:369
IntegrationPointListType ::CoordinateType CoordinateType
type of coordinate
Definition: quadrature.hh:180
@ 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
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
Traits ::QuadratureKeyType QuadratureKeyType
type of key to identify quadrature on user side (default the order of the quadrature)
Definition: quadrature.hh:183
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 ::QuadratureKeyType QuadratureKeyType
type of key to identify the quadrature
Definition: quadrature.hh:432
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
IntegrationPointListType ::CoordinateType CoordinateType
type of local coordinate vectors
Definition: quadrature.hh:429
Quadrature(const IntegrationPointListStorageType &ipListPtr)
create an integration point list from an implementation
Definition: quadrature.hh:498
const FieldType & weight(size_t i) const
obtain weight of i-th integration point
Definition: quadrature.hh:527
@ codimension
Definition: quadrature.hh:435
Quadrature(const Quadrature &org)
copy constructor
Definition: quadrature.hh:508
QuadratureTraits< FieldType, dimension > Traits
Definition: quadrature.hh:411
static const unsigned int dimension
Definition: quadrature.hh:409
Traits ::IntegrationPointListType IntegrationPointListType
type of the implementation (this must actually be a quadrature implementation)
Definition: quadrature.hh:426
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