Dune Core Modules (2.9.0)

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 (C) 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 
30 namespace Dune {
31 
37 
43  template<typename ct, int dim>
45  public:
47  constexpr static int dimension = dim;
48 
50  typedef ct Field;
51 
54 
56  QuadraturePoint (const Vector& x, ct w) : local(x)
57  {
58  weight_ = w;
59  }
60 
62  const Vector& position () const
63  {
64  return local;
65  }
66 
68  const ct &weight () const
69  {
70  return weight_;
71  }
72 
73  protected:
75  ct weight_;
76  };
77 
81  namespace QuadratureType {
82  enum Enum {
93 
100 
107 
120 
128 
136 
145  size
146  };
147  }
148 
152  template<typename ct, int dim>
153  class QuadratureRule : public std::vector<QuadraturePoint<ct,dim> >
154  {
155  public:
161  QuadratureRule() : delivered_order(-1) {}
162 
163  protected:
165  QuadratureRule(GeometryType t) : geometry_type(t), delivered_order(-1) {}
166 
168  QuadratureRule(GeometryType t, int order) : geometry_type(t), delivered_order(order) {}
169  public:
171  constexpr static int d = dim;
172 
174  typedef ct CoordType;
175 
177  virtual int order () const { return delivered_order; }
178 
180  virtual GeometryType type () const { return geometry_type; }
181  virtual ~QuadratureRule(){}
182 
185  typedef typename std::vector<QuadraturePoint<ct,dim> >::const_iterator iterator;
186 
187  protected:
188  GeometryType geometry_type;
189  int delivered_order;
190  };
191 
192  // Forward declaration of the factory class,
193  // needed internally by the QuadratureRules container class.
194  template<typename ctype, int dim> class QuadratureRuleFactory;
195 
199  template<typename ctype, int dim>
201 
204 
205  // indexed by quadrature order
206  using QuadratureOrderVector = std::vector<std::pair<std::once_flag, QuadratureRule> >;
207 
208  // indexed by geometry type
209  using GeometryTypeVector = std::vector<std::pair<std::once_flag, QuadratureOrderVector> >;
210 
211  // indexed by quadrature type enum
212  using QuadratureCacheVector = std::vector<std::pair<std::once_flag, GeometryTypeVector> >;
213 
216  {
217  assert(t.dim()==dim);
218 
219  DUNE_ASSERT_CALL_ONCE();
220 
221  static QuadratureCacheVector quadratureCache(QuadratureType::size);
222 
223  auto& [ onceFlagQuadratureType, geometryTypes ] = quadratureCache[qt];
224  // initialize geometry types for this quadrature type once
225  std::call_once(onceFlagQuadratureType, [&types = geometryTypes]{
226  types = GeometryTypeVector(LocalGeometryTypeIndex::size(dim));
227  });
228 
229  auto& [ onceFlagGeometryType, quadratureOrders ] = geometryTypes[LocalGeometryTypeIndex::index(t)];
230  // initialize quadrature orders for this geometry type and quadrature type once
231  std::call_once(onceFlagGeometryType, [&, &orders = quadratureOrders]{
232  // we only need one quadrature rule for points, not maxint
233  const auto numRules = dim == 0 ? 1 : QuadratureRuleFactory<ctype,dim>::maxOrder(t, qt)+1;
234  orders = QuadratureOrderVector(numRules);
235  });
236 
237  // we only have one quadrature rule for points
238  auto& [ onceFlagQuadratureOrder, quadratureRule ] = quadratureOrders[dim == 0 ? 0 : p];
239  // initialize quadrature rule once
240  std::call_once(onceFlagQuadratureOrder, [&, &rule = quadratureRule]{
242  });
243 
244  return quadratureRule;
245  }
246 
248  DUNE_EXPORT static QuadratureRules& instance()
249  {
250  static QuadratureRules instance;
251  return instance;
252  }
253 
255  QuadratureRules () = default;
256  public:
258  static unsigned
261  {
263  }
264 
267  {
268  return instance()._rule(t,p,qt);
269  }
270 
273  {
274  GeometryType gt(t,dim);
275  return instance()._rule(gt,p,qt);
276  }
277  };
278 
279 } // end namespace Dune
280 
281 #define DUNE_INCLUDING_IMPLEMENTATION
282 
283 // 0d rules
284 #include "quadraturerules/pointquadrature.hh"
285 // 1d rules
286 #include "quadraturerules/gausslobattoquadrature.hh"
287 #include "quadraturerules/gaussquadrature.hh"
288 #include "quadraturerules/gaussradauleftquadrature.hh"
289 #include "quadraturerules/gaussradaurightquadrature.hh"
290 #include "quadraturerules/jacobi1quadrature.hh"
291 #include "quadraturerules/jacobi2quadrature.hh"
292 #include "quadraturerules/jacobiNquadrature.hh"
293 // 3d rules
294 #include "quadraturerules/prismquadrature.hh"
295 // general rules
296 #include "quadraturerules/simplexquadrature.hh"
297 #include "quadraturerules/tensorproductquadrature.hh"
298 
299 #undef DUNE_INCLUDING_IMPLEMENTATION
300 
301 namespace Dune {
302 
309  template<typename ctype, int dim>
311  private:
312  friend class QuadratureRules<ctype, dim>;
313  static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
314  {
315  return TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
316  }
317  static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
318  {
319  return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
320  }
321  };
322 
323  template<typename ctype>
324  class QuadratureRuleFactory<ctype, 0> {
325  private:
326  constexpr static int dim = 0;
327  friend class QuadratureRules<ctype, dim>;
328  static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum)
329  {
330  if (t.isVertex())
331  {
333  }
334  DUNE_THROW(Exception, "Unknown GeometryType");
335  }
336  static QuadratureRule<ctype, dim> rule(const GeometryType& t, int , QuadratureType::Enum)
337  {
338  if (t.isVertex())
339  {
340  return PointQuadratureRule<ctype>();
341  }
342  DUNE_THROW(Exception, "Unknown GeometryType");
343  }
344  };
345 
346  template<typename ctype>
347  class QuadratureRuleFactory<ctype, 1> {
348  private:
349  constexpr static int dim = 1;
350  friend class QuadratureRules<ctype, dim>;
351  static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
352  {
353  if (t.isLine())
354  {
355  switch (qt) {
357  return GaussQuadratureRule1D<ctype>::highest_order;
359  return Jacobi1QuadratureRule1D<ctype>::highest_order;
361  return Jacobi2QuadratureRule1D<ctype>::highest_order;
363  return GaussLobattoQuadratureRule1D<ctype>::highest_order;
365  return JacobiNQuadratureRule1D<ctype>::maxOrder();
367  return GaussRadauLeftQuadratureRule1D<ctype>::highest_order;
369  return GaussRadauRightQuadratureRule1D<ctype>::highest_order;
370  default :
371  DUNE_THROW(Exception, "Unknown QuadratureType");
372  }
373  }
374  DUNE_THROW(Exception, "Unknown GeometryType");
375  }
376  static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
377  {
378  if (t.isLine())
379  {
380  switch (qt) {
382  return GaussQuadratureRule1D<ctype>(p);
384  return Jacobi1QuadratureRule1D<ctype>(p);
386  return Jacobi2QuadratureRule1D<ctype>(p);
388  return GaussLobattoQuadratureRule1D<ctype>(p);
390  return JacobiNQuadratureRule1D<ctype>(p);
392  return GaussRadauLeftQuadratureRule1D<ctype>(p);
394  return GaussRadauRightQuadratureRule1D<ctype>(p);
395  default :
396  DUNE_THROW(Exception, "Unknown QuadratureType");
397  }
398  }
399  DUNE_THROW(Exception, "Unknown GeometryType");
400  }
401  };
402 
403  template<typename ctype>
404  class QuadratureRuleFactory<ctype, 2> {
405  private:
406  constexpr static int dim = 2;
407  friend class QuadratureRules<ctype, dim>;
408  static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
409  {
410  unsigned order =
411  TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
412  if (t.isSimplex())
413  order = std::max
414  (order, unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
415  return order;
416  }
417  static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
418  {
419  if (t.isSimplex()
421  && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
422  {
423  return SimplexQuadratureRule<ctype,dim>(p);
424  }
425  return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
426  }
427  };
428 
429  template<typename ctype>
430  class QuadratureRuleFactory<ctype, 3> {
431  private:
432  constexpr static int dim = 3;
433  friend class QuadratureRules<ctype, dim>;
434  static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
435  {
436  unsigned order =
437  TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
438  if (t.isSimplex())
439  order = std::max
440  (order, unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
441  if (t.isPrism())
442  order = std::max
443  (order, unsigned(PrismQuadratureRule<ctype,dim>::highest_order));
444  return order;
445  }
446  static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
447  {
448 
449  if (t.isSimplex()
451  && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
452  {
453  return SimplexQuadratureRule<ctype,dim>(p);
454  }
455  if (t.isPrism()
457  && p <= PrismQuadratureRule<ctype,dim>::highest_order)
458  {
459  return PrismQuadratureRule<ctype,dim>(p);
460  }
461  return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
462  }
463  };
464 
465 #ifndef DUNE_NO_EXTERN_QUADRATURERULES
466  extern template class GaussLobattoQuadratureRule<double, 1>;
467  extern template class GaussQuadratureRule<double, 1>;
468  extern template class GaussRadauLeftQuadratureRule<double, 1>;
469  extern template class GaussRadauRightQuadratureRule<double, 1>;
470  extern template class Jacobi1QuadratureRule<double, 1>;
471  extern template class Jacobi2QuadratureRule<double, 1>;
472  extern template class JacobiNQuadratureRule<double, 1>;
473  extern template class PrismQuadratureRule<double, 3>;
474  extern template class SimplexQuadratureRule<double, 2>;
475  extern template class SimplexQuadratureRule<double, 3>;
476 #endif // !DUNE_NO_EXTERN_QUADRATURERULES
477 
478 } // end namespace
479 
480 #endif // DUNE_GEOMETRY_QUADRATURERULES_HH
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition: type.hh:290
constexpr unsigned int dim() const
Return dimension of the type.
Definition: type.hh:371
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition: type.hh:131
constexpr unsigned int id() const
Return the topology id of the type.
Definition: type.hh:376
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:36
Single evaluation point in a quadrature rule.
Definition: quadraturerules.hh:44
Dune::FieldVector< ct, dim > Vector
Type used for the position of a quadrature point.
Definition: quadraturerules.hh:53
ct Field
Number type used for coordinates and quadrature weights.
Definition: quadraturerules.hh:50
const Vector & position() const
return local coordinates of integration point i
Definition: quadraturerules.hh:62
constexpr static int dimension
Dimension of the integration domain.
Definition: quadraturerules.hh:47
const ct & weight() const
return weight associated with integration point i
Definition: quadraturerules.hh:68
QuadraturePoint(const Vector &x, ct w)
set up quadrature of given order in d dimensions
Definition: quadraturerules.hh:56
Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType.
Definition: quadraturerules.hh:310
Abstract base class for quadrature rules.
Definition: quadraturerules.hh:154
virtual GeometryType type() const
return type of element
Definition: quadraturerules.hh:180
QuadratureRule(GeometryType t, int order)
Constructor for a given geometry type and a given quadrature order.
Definition: quadraturerules.hh:168
ct CoordType
The type used for coordinates.
Definition: quadraturerules.hh:174
QuadratureRule()
Default constructor.
Definition: quadraturerules.hh:161
constexpr static int d
The space dimension.
Definition: quadraturerules.hh:171
virtual int order() const
return order
Definition: quadraturerules.hh:177
QuadratureRule(GeometryType t)
Constructor for a given geometry type. Leaves the quadrature order invalid
Definition: quadraturerules.hh:165
std::vector< QuadraturePoint< ct, dim > >::const_iterator iterator
Definition: quadraturerules.hh:185
A container for all quadrature rules of dimension dim
Definition: quadraturerules.hh:200
static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
maximum quadrature order for given geometry type and quadrature type
Definition: quadraturerules.hh:259
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:266
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:272
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
auto max(ADLTag< 0 >, const V &v1, const V &v2)
implements binary Simd::max()
Definition: defaults.hh:81
Enum
Definition: quadraturerules.hh:82
@ GaussJacobi_n_0
Gauss-Legendre rules with .
Definition: quadraturerules.hh:119
@ GaussJacobi_2_0
Gauss-Legendre rules with .
Definition: quadraturerules.hh:106
@ GaussRadauRight
Gauss-Radau rules including the right endpoint.
Definition: quadraturerules.hh:144
@ GaussJacobi_1_0
Gauss-Jacobi rules with .
Definition: quadraturerules.hh:99
@ GaussLobatto
Gauss-Lobatto rules.
Definition: quadraturerules.hh:127
@ GaussRadauLeft
Gauss-Radau rules including the left endpoint.
Definition: quadraturerules.hh:135
@ GaussLegendre
Gauss-Legendre rules (default)
Definition: quadraturerules.hh:92
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 27, 22:29, 2024)