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 
7 #include <dune/common/fvector.hh>
9 
11 
12 #include <dune/grid/common/grid.hh>
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 
21 namespace Dune
22 {
23  namespace Fem
24  {
40  template< class Quadrature >
42  {
43  public:
44  typedef Quadrature QuadratureType;
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 
480  inline explicit Quadrature( const IntegrationPointListType& ipList )
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
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
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
Traits ::IntegrationPointListType IntegrationPointListType
type of integration point list implementation
Definition: quadrature.hh:173
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
const CoordinateType & point(size_t i) const
obtain coordinates of i-th integration point
Definition: quadrature.hh:307
auto interpolationPoints(const int reqDim) const
returns list of element interpolation points for a given face quadrature
Definition: quadrature.hh:365
IntegrationPointListType ::CoordinateType CoordinateType
type of coordinate
Definition: quadrature.hh:176
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
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
Traits ::QuadratureKeyType QuadratureKeyType
type of key to identify quadrature on user side (default the order of the quadrature)
Definition: quadrature.hh:179
IntegrationPointList(const GeometryType &geometryType, const QuadratureKeyType &quadKey)
create a quadrature for a given geometry type and order
Definition: quadrature.hh:209
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 ::QuadratureKeyType QuadratureKeyType
type of key to identify the quadrature
Definition: quadrature.hh:428
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
IntegrationPointListType ::CoordinateType CoordinateType
type of local coordinate vectors
Definition: quadrature.hh:425
Quadrature(const IntegrationPointListStorageType &ipListPtr)
create an integration point list from an implementation
Definition: quadrature.hh:494
const FieldType & weight(size_t i) const
obtain weight of i-th integration point
Definition: quadrature.hh:523
Quadrature(const Quadrature &org)
copy constructor
Definition: quadrature.hh:504
Traits ::IntegrationPointListType IntegrationPointListType
type of the implementation (this must actually be a quadrature implementation)
Definition: quadrature.hh:422
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.80.0 (May 16, 22:29, 2024)