Dune Core Modules (unstable)

quadraturerules.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 // SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
4 // SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
5 
6 #ifndef DUNE_GEOMETRY_QUADRATURERULES_HH
7 #define DUNE_GEOMETRY_QUADRATURERULES_HH
8 
9 #include <algorithm>
10 #include <iostream>
11 #include <limits>
12 #include <mutex>
13 #include <utility>
14 #include <vector>
15 
16 #include <dune/common/fvector.hh>
19 #include <dune/common/stdthread.hh>
21 
22 #include <dune/geometry/type.hh>
24 
31 namespace Dune {
32  // forward declaration
33  template<typename ct, int dim>
34  class QuadraturePoint;
35 }
36 
37 // class specialization of standard classes that allow to use structured bindings on QuadraturePoint
38 namespace std {
39  template<typename ct, int dim>
40  struct tuple_size<Dune::QuadraturePoint<ct,dim>> : public std::integral_constant<std::size_t,2> {};
41 
42  template<typename ct, int dim>
43  struct tuple_element<0, Dune::QuadraturePoint<ct,dim>> { using type = Dune::FieldVector<ct, dim>; };
44 
45  template<typename ct, int dim>
46  struct tuple_element<1, Dune::QuadraturePoint<ct,dim>> { using type = ct; };
47 }
48 
49 namespace Dune {
50 
56 
65  template<typename ct, int dim>
67  public:
69  constexpr static int dimension = dim;
70 
72  typedef ct Field;
73 
76 
78  QuadraturePoint (const Vector& x, ct w) : local(x)
79  {
80  weight_ = w;
81  }
82 
84  const Vector& position () const
85  {
86  return local;
87  }
88 
90  const ct &weight () const
91  {
92  return weight_;
93  }
94 
113  template<std::size_t index, std::enable_if_t<(index<=1), int> = 0>
114  std::tuple_element_t<index, QuadraturePoint<ct, dim>> get() const
115  {
116  if constexpr (index == 0) return local;
117  if constexpr (index == 1) return weight_;
118  }
119 
120  protected:
121  FieldVector<ct, dim> local;
122  ct weight_;
123  };
124 
128  namespace QuadratureType {
129  enum Enum {
139  GaussLegendre = 0,
140 
146  GaussJacobi_1_0 = 1,
147 
153  GaussJacobi_2_0 = 2,
154 
166  GaussJacobi_n_0 = 3,
167 
174  GaussLobatto = 4,
175 
182  GaussRadauLeft = 5,
183 
191  GaussRadauRight = 6,
192  size
193  };
194  }
195 
210  template<typename ct, int dim>
211  class QuadratureRule : public std::vector<QuadraturePoint<ct,dim> >
212  {
213  public:
219  QuadratureRule() : delivered_order(-1) {}
220 
221  protected:
223  QuadratureRule(GeometryType t) : geometry_type(t), delivered_order(-1) {}
224 
226  QuadratureRule(GeometryType t, int order) : geometry_type(t), delivered_order(order) {}
227  public:
229  constexpr static int d = dim;
230 
232  typedef ct CoordType;
233 
235  virtual int order () const { return delivered_order; }
236 
238  virtual GeometryType type () const { return geometry_type; }
239  virtual ~QuadratureRule(){}
240 
243  typedef typename std::vector<QuadraturePoint<ct,dim> >::const_iterator iterator;
244 
245  protected:
246  GeometryType geometry_type;
247  int delivered_order;
248  };
249 
250  // Forward declaration of the factory class,
251  // needed internally by the QuadratureRules container class.
252  template<typename ctype, int dim> class QuadratureRuleFactory;
253 
257  template<typename ctype, int dim>
259 
262 
263  // indexed by quadrature order
264  using QuadratureOrderVector = std::vector<std::pair<std::once_flag, QuadratureRule> >;
265 
266  // indexed by geometry type
267  using GeometryTypeVector = std::vector<std::pair<std::once_flag, QuadratureOrderVector> >;
268 
269  // indexed by quadrature type enum
270  using QuadratureCacheVector = std::vector<std::pair<std::once_flag, GeometryTypeVector> >;
271 
274  {
275  assert(t.dim()==dim);
276 
277  DUNE_ASSERT_CALL_ONCE();
278 
279  static QuadratureCacheVector quadratureCache(QuadratureType::size);
280 
281  auto& [ onceFlagQuadratureType, geometryTypes ] = quadratureCache[qt];
282  // initialize geometry types for this quadrature type once
283  std::call_once(onceFlagQuadratureType, [&types = geometryTypes]{
284  types = GeometryTypeVector(LocalGeometryTypeIndex::size(dim));
285  });
286 
287  auto& [ onceFlagGeometryType, quadratureOrders ] = geometryTypes[LocalGeometryTypeIndex::index(t)];
288  // initialize quadrature orders for this geometry type and quadrature type once
289  std::call_once(onceFlagGeometryType, [&, &orders = quadratureOrders]{
290  // we only need one quadrature rule for points, not maxint
291  const auto numRules = dim == 0 ? 1 : QuadratureRuleFactory<ctype,dim>::maxOrder(t, qt)+1;
292  orders = QuadratureOrderVector(numRules);
293  });
294 
295  // we only have one quadrature rule for points
296  auto& [ onceFlagQuadratureOrder, quadratureRule ] = quadratureOrders[dim == 0 ? 0 : p];
297  // initialize quadrature rule once
298  std::call_once(onceFlagQuadratureOrder, [&, &rule = quadratureRule]{
300  });
301 
302  return quadratureRule;
303  }
304 
306  DUNE_EXPORT static QuadratureRules& instance()
307  {
308  static QuadratureRules instance;
309  return instance;
310  }
311 
313  QuadratureRules () = default;
314  public:
316  static unsigned
319  {
321  }
322 
325  {
326  return instance()._rule(t,p,qt);
327  }
328 
331  {
332  GeometryType gt(t,dim);
333  return instance()._rule(gt,p,qt);
334  }
335  };
336 
337 } // end namespace Dune
338 
339 #define DUNE_INCLUDING_IMPLEMENTATION
340 
341 // 0d rules
342 #include "quadraturerules/pointquadrature.hh"
343 // 1d rules
344 #include "quadraturerules/gausslobattoquadrature.hh"
345 #include "quadraturerules/gaussquadrature.hh"
346 #include "quadraturerules/gaussradauleftquadrature.hh"
347 #include "quadraturerules/gaussradaurightquadrature.hh"
348 #include "quadraturerules/jacobi1quadrature.hh"
349 #include "quadraturerules/jacobi2quadrature.hh"
350 #include "quadraturerules/jacobiNquadrature.hh"
351 // 3d rules
352 #include "quadraturerules/prismquadrature.hh"
353 // general rules
354 #include "quadraturerules/simplexquadrature.hh"
355 #include "quadraturerules/tensorproductquadrature.hh"
356 
357 #undef DUNE_INCLUDING_IMPLEMENTATION
358 
359 namespace Dune {
360 
367  template<typename ctype, int dim>
369  private:
370  friend class QuadratureRules<ctype, dim>;
371  static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
372  {
373  return TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
374  }
375  static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
376  {
377  return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
378  }
379  };
380 
381  template<typename ctype>
382  class QuadratureRuleFactory<ctype, 0> {
383  private:
384  constexpr static int dim = 0;
385  friend class QuadratureRules<ctype, dim>;
386  static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum)
387  {
388  if (t.isVertex())
389  {
391  }
392  DUNE_THROW(Exception, "Unknown GeometryType");
393  }
394  static QuadratureRule<ctype, dim> rule(const GeometryType& t, int , QuadratureType::Enum)
395  {
396  if (t.isVertex())
397  {
398  return PointQuadratureRule<ctype>();
399  }
400  DUNE_THROW(Exception, "Unknown GeometryType");
401  }
402  };
403 
404  template<typename ctype>
405  class QuadratureRuleFactory<ctype, 1> {
406  private:
407  constexpr static int dim = 1;
408  friend class QuadratureRules<ctype, dim>;
409  static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
410  {
411  if (t.isLine())
412  {
413  switch (qt) {
415  return GaussQuadratureRule1D<ctype>::highest_order;
417  return Jacobi1QuadratureRule1D<ctype>::highest_order;
419  return Jacobi2QuadratureRule1D<ctype>::highest_order;
421  return GaussLobattoQuadratureRule1D<ctype>::highest_order;
423  return JacobiNQuadratureRule1D<ctype>::maxOrder();
425  return GaussRadauLeftQuadratureRule1D<ctype>::highest_order;
427  return GaussRadauRightQuadratureRule1D<ctype>::highest_order;
428  default :
429  DUNE_THROW(Exception, "Unknown QuadratureType");
430  }
431  }
432  DUNE_THROW(Exception, "Unknown GeometryType");
433  }
434  static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
435  {
436  if (t.isLine())
437  {
438  switch (qt) {
440  return GaussQuadratureRule1D<ctype>(p);
442  return Jacobi1QuadratureRule1D<ctype>(p);
444  return Jacobi2QuadratureRule1D<ctype>(p);
446  return GaussLobattoQuadratureRule1D<ctype>(p);
448  return JacobiNQuadratureRule1D<ctype>(p);
450  return GaussRadauLeftQuadratureRule1D<ctype>(p);
452  return GaussRadauRightQuadratureRule1D<ctype>(p);
453  default :
454  DUNE_THROW(Exception, "Unknown QuadratureType");
455  }
456  }
457  DUNE_THROW(Exception, "Unknown GeometryType");
458  }
459  };
460 
461  template<typename ctype>
462  class QuadratureRuleFactory<ctype, 2> {
463  private:
464  constexpr static int dim = 2;
465  friend class QuadratureRules<ctype, dim>;
466  static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
467  {
468  unsigned order =
469  TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
470  if (t.isSimplex())
471  order = std::max
472  (order, unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
473  return order;
474  }
475  static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
476  {
477  if (t.isSimplex()
479  && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
480  {
481  return SimplexQuadratureRule<ctype,dim>(p);
482  }
483  return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
484  }
485  };
486 
487  template<typename ctype>
488  class QuadratureRuleFactory<ctype, 3> {
489  private:
490  constexpr static int dim = 3;
491  friend class QuadratureRules<ctype, dim>;
492  static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
493  {
494  unsigned order =
495  TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
496  if (t.isSimplex())
497  order = std::max
498  (order, unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
499  if (t.isPrism())
500  order = std::max
501  (order, unsigned(PrismQuadratureRule<ctype,dim>::highest_order));
502  return order;
503  }
504  static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
505  {
506 
507  if (t.isSimplex()
509  && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
510  {
511  return SimplexQuadratureRule<ctype,dim>(p);
512  }
513  if (t.isPrism()
515  && p <= PrismQuadratureRule<ctype,dim>::highest_order)
516  {
517  return PrismQuadratureRule<ctype,dim>(p);
518  }
519  return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
520  }
521  };
522 
523 #ifndef DUNE_NO_EXTERN_QUADRATURERULES
524  extern template class GaussLobattoQuadratureRule<double, 1>;
525  extern template class GaussQuadratureRule<double, 1>;
526  extern template class GaussRadauLeftQuadratureRule<double, 1>;
527  extern template class GaussRadauRightQuadratureRule<double, 1>;
528  extern template class Jacobi1QuadratureRule<double, 1>;
529  extern template class Jacobi2QuadratureRule<double, 1>;
530  extern template class JacobiNQuadratureRule<double, 1>;
531  extern template class PrismQuadratureRule<double, 3>;
532  extern template class SimplexQuadratureRule<double, 2>;
533  extern template class SimplexQuadratureRule<double, 3>;
534 #endif // !DUNE_NO_EXTERN_QUADRATURERULES
535 
536 } // end namespace
537 
538 #endif // DUNE_GEOMETRY_QUADRATURERULES_HH
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition: type.hh:279
constexpr unsigned int dim() const
Return dimension of the type.
Definition: type.hh:360
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition: type.hh:120
constexpr unsigned int id() const
Return the topology id of the type.
Definition: type.hh:365
static constexpr std::size_t size(std::size_t dim)
Compute total number of geometry types for the given dimension.
Definition: typeindex.hh:61
static constexpr std::size_t index(const GeometryType &gt)
Compute the index for the given geometry type within its dimension.
Definition: typeindex.hh:73
Default exception for dummy implementations.
Definition: exceptions.hh:263
Exception thrown if a desired QuadratureRule is not available, because the requested order is to high...
Definition: quadraturerules.hh:55
Single evaluation point in a quadrature rule.
Definition: quadraturerules.hh:66
Dune::FieldVector< ct, dim > Vector
Type used for the position of a quadrature point.
Definition: quadraturerules.hh:75
ct Field
Number type used for coordinates and quadrature weights.
Definition: quadraturerules.hh:72
const Vector & position() const
return local coordinates of integration point i
Definition: quadraturerules.hh:84
constexpr static int dimension
Dimension of the integration domain.
Definition: quadraturerules.hh:69
const ct & weight() const
return weight associated with integration point i
Definition: quadraturerules.hh:90
QuadraturePoint(const Vector &x, ct w)
set up quadrature of given order in d dimensions
Definition: quadraturerules.hh:78
Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType.
Definition: quadraturerules.hh:368
Abstract base class for quadrature rules.
Definition: quadraturerules.hh:212
virtual GeometryType type() const
return type of element
Definition: quadraturerules.hh:238
QuadratureRule(GeometryType t, int order)
Constructor for a given geometry type and a given quadrature order.
Definition: quadraturerules.hh:226
ct CoordType
The type used for coordinates.
Definition: quadraturerules.hh:232
QuadratureRule()
Default constructor.
Definition: quadraturerules.hh:219
virtual int order() const
return order
Definition: quadraturerules.hh:235
QuadratureRule(GeometryType t)
Constructor for a given geometry type. Leaves the quadrature order invalid
Definition: quadraturerules.hh:223
std::vector< QuadraturePoint< ct, dim > >::const_iterator iterator
Definition: quadraturerules.hh:243
A container for all quadrature rules of dimension dim
Definition: quadraturerules.hh:258
static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
maximum quadrature order for given geometry type and quadrature type
Definition: quadraturerules.hh:317
static const QuadratureRule & rule(const GeometryType &t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
select the appropriate QuadratureRule for GeometryType t and order p
Definition: quadraturerules.hh:324
static const QuadratureRule & rule(const GeometryType::BasicType t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
select the appropriate QuadratureRule for GeometryType t and order p
Definition: quadraturerules.hh:330
A few common exception classes.
Implements a vector constructed from a given type representing a field and a compile-time given size.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
bool gt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first greater than second
Definition: float_cmp.cc:158
constexpr auto max
Function object that returns the greater of the given values.
Definition: hybridutilities.hh:484
Enum
Definition: quadraturerules.hh:129
@ GaussJacobi_n_0
Gauss-Legendre rules with .
Definition: quadraturerules.hh:166
@ GaussJacobi_2_0
Gauss-Legendre rules with .
Definition: quadraturerules.hh:153
@ GaussRadauRight
Gauss-Radau rules including the right endpoint.
Definition: quadraturerules.hh:191
@ GaussJacobi_1_0
Gauss-Jacobi rules with .
Definition: quadraturerules.hh:146
@ GaussLobatto
Gauss-Lobatto rules.
Definition: quadraturerules.hh:174
@ GaussRadauLeft
Gauss-Radau rules including the left endpoint.
Definition: quadraturerules.hh:182
@ GaussLegendre
Gauss-Legendre rules (default)
Definition: quadraturerules.hh:139
Dune namespace.
Definition: alignedallocator.hh:13
Standard Dune debug streams.
A unique label for each type of element that can occur in a grid.
Helper classes to provide indices for geometrytypes for use in a vector.
Definition of macros controlling symbol visibility at the ABI level.
#define DUNE_EXPORT
Export a symbol as part of the public ABI.
Definition: visibility.hh:20
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (Apr 26, 22:29, 2024)