6#ifndef DUNE_GEOMETRY_QUADRATURERULES_HH
7#define DUNE_GEOMETRY_QUADRATURERULES_HH
16#include <dune/common/fvector.hh>
17#include <dune/common/exceptions.hh>
18#include <dune/common/stdstreams.hh>
19#include <dune/common/stdthread.hh>
20#include <dune/common/visibility.hh>
43 template<
typename ct,
int dim>
53 typedef Dune::FieldVector<ct,dim>
Vector;
81 namespace QuadratureType {
152 template<
typename ct,
int dim>
171 constexpr static int d = dim;
185 typedef typename std::vector<QuadraturePoint<ct,dim> >::const_iterator
iterator;
199 template<
typename ctype,
int dim>
206 using QuadratureOrderVector = std::vector<std::pair<std::once_flag, QuadratureRule> >;
209 using GeometryTypeVector = std::vector<std::pair<std::once_flag, QuadratureOrderVector> >;
212 using QuadratureCacheVector = std::vector<std::pair<std::once_flag, GeometryTypeVector> >;
217 assert(t.
dim()==dim);
219 DUNE_ASSERT_CALL_ONCE();
223 auto& [ onceFlagQuadratureType, geometryTypes ] = quadratureCache[qt];
225 std::call_once(onceFlagQuadratureType, [&types = geometryTypes]{
231 std::call_once(onceFlagGeometryType, [&, &orders = quadratureOrders]{
234 orders = QuadratureOrderVector(numRules);
238 auto& [ onceFlagQuadratureOrder, quadratureRule ] = quadratureOrders[dim == 0 ? 0 : p];
240 std::call_once(onceFlagQuadratureOrder, [&, &
rule = quadratureRule]{
244 return quadratureRule;
268 return instance()._rule(t,p,qt);
275 return instance()._rule(gt,p,qt);
281#define DUNE_INCLUDING_IMPLEMENTATION
284#include "quadraturerules/pointquadrature.hh"
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"
294#include "quadraturerules/prismquadrature.hh"
296#include "quadraturerules/simplexquadrature.hh"
297#include "quadraturerules/tensorproductquadrature.hh"
299#undef DUNE_INCLUDING_IMPLEMENTATION
309 template<
typename ctype,
int dim>
315 return TensorProductQuadratureRule<ctype,dim>::maxOrder(t.
id(), qt);
319 return TensorProductQuadratureRule<ctype,dim>(t.
id(), p, qt);
323 template<
typename ctype>
326 constexpr static int dim = 0;
332 return std::numeric_limits<int>::max();
334 DUNE_THROW(Exception,
"Unknown GeometryType");
340 return PointQuadratureRule<ctype>();
342 DUNE_THROW(Exception,
"Unknown GeometryType");
346 template<
typename ctype>
349 constexpr static int dim = 1;
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;
371 DUNE_THROW(Exception,
"Unknown QuadratureType");
374 DUNE_THROW(Exception,
"Unknown GeometryType");
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);
396 DUNE_THROW(Exception,
"Unknown QuadratureType");
399 DUNE_THROW(Exception,
"Unknown GeometryType");
403 template<
typename ctype>
406 constexpr static int dim = 2;
411 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.
id(), qt);
414 (order,
unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
421 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
423 return SimplexQuadratureRule<ctype,dim>(p);
425 return TensorProductQuadratureRule<ctype,dim>(t.
id(), p, qt);
429 template<
typename ctype>
432 constexpr static int dim = 3;
437 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.
id(), qt);
440 (order,
unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
443 (order,
unsigned(PrismQuadratureRule<ctype,dim>::highest_order));
451 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
453 return SimplexQuadratureRule<ctype,dim>(p);
457 && p <= PrismQuadratureRule<ctype,dim>::highest_order)
459 return PrismQuadratureRule<ctype,dim>(p);
461 return TensorProductQuadratureRule<ctype,dim>(t.
id(), p, qt);
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>;
Helper classes to provide indices for geometrytypes for use in a vector.
A unique label for each type of element that can occur in a grid.
Definition affinegeometry.hh:21
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
@ size
Definition quadraturerules.hh:145
@ 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
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
const Vector & position() const
return local coordinates of integration point i
Definition quadraturerules.hh:62
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 ct & weight() const
return weight associated with integration point i
Definition quadraturerules.hh:68
ct weight_
Definition quadraturerules.hh:75
static constexpr int dimension
Dimension of the integration domain.
Definition quadraturerules.hh:47
QuadraturePoint(const Vector &x, ct w)
set up quadrature of given order in d dimensions
Definition quadraturerules.hh:56
FieldVector< ct, dim > local
Definition quadraturerules.hh:74
Abstract base class for quadrature rules.
Definition quadraturerules.hh:154
virtual ~QuadratureRule()
Definition quadraturerules.hh:181
static constexpr int d
The space dimension.
Definition quadraturerules.hh:171
virtual GeometryType type() const
return type of element
Definition quadraturerules.hh:180
int delivered_order
Definition quadraturerules.hh:189
QuadratureRule(GeometryType t, int order)
Constructor for a given geometry type and a given quadrature order.
Definition quadraturerules.hh:168
GeometryType geometry_type
Definition quadraturerules.hh:188
ct CoordType
The type used for coordinates.
Definition quadraturerules.hh:174
QuadratureRule()
Default constructor.
Definition quadraturerules.hh:161
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
Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType.
Definition quadraturerules.hh:310
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::BasicType t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
select the appropriate QuadratureRule for GeometryType t and order p
Definition quadraturerules.hh:272
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
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:126
constexpr bool isPrism() const
Return true if entity is a prism.
Definition type.hh:321
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition type.hh:291
constexpr unsigned int dim() const
Return dimension of the type.
Definition type.hh:372
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition type.hh:132
constexpr bool isLine() const
Return true if entity is a line segment.
Definition type.hh:296
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:377
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition type.hh:331
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 >)
Compute the index for the given geometry type within its dimension.
Definition typeindex.hh:73