4 #ifndef DUNE_GEOMETRY_QUADRATURERULES_HH
5 #define DUNE_GEOMETRY_QUADRATURERULES_HH
14 #include <dune/common/fvector.hh>
15 #include <dune/common/exceptions.hh>
16 #include <dune/common/stdstreams.hh>
17 #include <dune/common/stdthread.hh>
18 #include <dune/common/visibility.hh>
41 template<
typename ct,
int dim>
51 typedef Dune::FieldVector<ct,dim>
Vector;
79 namespace QuadratureType {
150 template<
typename ct,
int dim>
183 typedef typename std::vector<QuadraturePoint<ct,dim> >::const_iterator
iterator;
197 template<
typename ctype,
int dim>
210 typedef std::vector<std::pair<std::once_flag, QuadratureRule> >
211 QuadratureOrderVector;
214 static void initQuadratureOrderVector(QuadratureOrderVector *qov,
220 *qov = QuadratureOrderVector(1);
225 typedef std::vector<std::pair<std::once_flag, QuadratureOrderVector> >
229 static void initGeometryTypeVector(GeometryTypeVector *gtv)
237 assert(t.
dim()==dim);
239 DUNE_ASSERT_CALL_ONCE();
241 static std::vector<std::pair<
246 auto & quadratureTypeLevel = quadratureCache[qt];
247 std::call_once(quadratureTypeLevel.first, initGeometryTypeVector,
248 &quadratureTypeLevel.second);
250 auto & geometryTypeLevel =
252 std::call_once(geometryTypeLevel.first, initQuadratureOrderVector,
253 &geometryTypeLevel.second, qt, t);
256 auto & quadratureOrderLevel = geometryTypeLevel.second[dim == 0 ? 0 : p];
257 std::call_once(quadratureOrderLevel.first, initQuadratureRule,
258 &quadratureOrderLevel.second, qt, t, p);
260 return quadratureOrderLevel.second;
282 return instance()._rule(t,p,qt);
289 return instance()._rule(gt,p,qt);
295 #define DUNE_INCLUDING_IMPLEMENTATION
298 #include "quadraturerules/pointquadrature.hh"
300 #include "quadraturerules/gausslobattoquadrature.hh"
301 #include "quadraturerules/gaussquadrature.hh"
302 #include "quadraturerules/gaussradauleftquadrature.hh"
303 #include "quadraturerules/gaussradaurightquadrature.hh"
304 #include "quadraturerules/jacobi1quadrature.hh"
305 #include "quadraturerules/jacobi2quadrature.hh"
306 #include "quadraturerules/jacobiNquadrature.hh"
308 #include "quadraturerules/prismquadrature.hh"
310 #include "quadraturerules/simplexquadrature.hh"
311 #include "quadraturerules/tensorproductquadrature.hh"
313 #undef DUNE_INCLUDING_IMPLEMENTATION
323 template<
typename ctype,
int dim>
329 return TensorProductQuadratureRule<ctype,dim>::maxOrder(t.
id(), qt);
333 return TensorProductQuadratureRule<ctype,dim>(t.
id(), p, qt);
337 template<
typename ctype>
346 return std::numeric_limits<int>::max();
348 DUNE_THROW(Exception,
"Unknown GeometryType");
354 return PointQuadratureRule<ctype>();
356 DUNE_THROW(Exception,
"Unknown GeometryType");
360 template<
typename ctype>
371 return GaussQuadratureRule1D<ctype>::highest_order;
373 return Jacobi1QuadratureRule1D<ctype>::highest_order;
375 return Jacobi2QuadratureRule1D<ctype>::highest_order;
377 return GaussLobattoQuadratureRule1D<ctype>::highest_order;
379 return JacobiNQuadratureRule1D<ctype>::maxOrder();
381 return GaussRadauLeftQuadratureRule1D<ctype>::highest_order;
383 return GaussRadauRightQuadratureRule1D<ctype>::highest_order;
385 DUNE_THROW(Exception,
"Unknown QuadratureType");
388 DUNE_THROW(Exception,
"Unknown GeometryType");
396 return GaussQuadratureRule1D<ctype>(p);
398 return Jacobi1QuadratureRule1D<ctype>(p);
400 return Jacobi2QuadratureRule1D<ctype>(p);
402 return GaussLobattoQuadratureRule1D<ctype>(p);
404 return JacobiNQuadratureRule1D<ctype>(p);
406 return GaussRadauLeftQuadratureRule1D<ctype>(p);
408 return GaussRadauRightQuadratureRule1D<ctype>(p);
410 DUNE_THROW(Exception,
"Unknown QuadratureType");
413 DUNE_THROW(Exception,
"Unknown GeometryType");
417 template<
typename ctype>
425 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.
id(), qt);
428 (order,
unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
435 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
437 return SimplexQuadratureRule<ctype,dim>(p);
439 return TensorProductQuadratureRule<ctype,dim>(t.
id(), p, qt);
443 template<
typename ctype>
451 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.
id(), qt);
454 (order,
unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
457 (order,
unsigned(PrismQuadratureRule<ctype,dim>::highest_order));
465 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
467 return SimplexQuadratureRule<ctype,dim>(p);
471 && p <= PrismQuadratureRule<ctype,dim>::highest_order)
473 return PrismQuadratureRule<ctype,dim>(p);
475 return TensorProductQuadratureRule<ctype,dim>(t.
id(), p, qt);
479 #ifndef DUNE_NO_EXTERN_QUADRATURERULES
480 extern template class GaussLobattoQuadratureRule<double, 1>;
481 extern template class GaussQuadratureRule<double, 1>;
482 extern template class GaussRadauLeftQuadratureRule<double, 1>;
483 extern template class GaussRadauRightQuadratureRule<double, 1>;
484 extern template class Jacobi1QuadratureRule<double, 1>;
485 extern template class Jacobi2QuadratureRule<double, 1>;
486 extern template class JacobiNQuadratureRule<double, 1>;
487 extern template class PrismQuadratureRule<double, 3>;
488 extern template class SimplexQuadratureRule<double, 2>;
489 extern template class SimplexQuadratureRule<double, 3>;
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: affinegeometry.hh:19
Enum
Definition: quadraturerules.hh:80
@ GaussJacobi_n_0
Gauss-Legendre rules with .
Definition: quadraturerules.hh:117
@ GaussJacobi_2_0
Gauss-Legendre rules with .
Definition: quadraturerules.hh:104
@ GaussRadauRight
Gauss-Radau rules including the right endpoint.
Definition: quadraturerules.hh:142
@ GaussJacobi_1_0
Gauss-Jacobi rules with .
Definition: quadraturerules.hh:97
@ size
Definition: quadraturerules.hh:143
@ GaussLobatto
Gauss-Lobatto rules.
Definition: quadraturerules.hh:125
@ GaussRadauLeft
Gauss-Radau rules including the left endpoint.
Definition: quadraturerules.hh:133
@ GaussLegendre
Gauss-Legendre rules (default)
Definition: quadraturerules.hh:90
Exception thrown if a desired QuadratureRule is not available, because the requested order is to high...
Definition: quadraturerules.hh:34
Single evaluation point in a quadrature rule.
Definition: quadraturerules.hh:42
Dune::FieldVector< ct, dim > Vector
Type used for the position of a quadrature point.
Definition: quadraturerules.hh:51
ct Field
Number type used for coordinates and quadrature weights.
Definition: quadraturerules.hh:48
const Vector & position() const
return local coordinates of integration point i
Definition: quadraturerules.hh:60
@ dimension
Definition: quadraturerules.hh:45
ct weight_
Definition: quadraturerules.hh:73
const ct & weight() const
return weight associated with integration point i
Definition: quadraturerules.hh:66
QuadraturePoint(const Vector &x, ct w)
set up quadrature of given order in d dimensions
Definition: quadraturerules.hh:54
FieldVector< ct, dim > local
Definition: quadraturerules.hh:72
Abstract base class for quadrature rules.
Definition: quadraturerules.hh:152
virtual ~QuadratureRule()
Definition: quadraturerules.hh:179
virtual GeometryType type() const
return type of element
Definition: quadraturerules.hh:178
int delivered_order
Definition: quadraturerules.hh:187
QuadratureRule(GeometryType t, int order)
Constructor for a given geometry type and a given quadrature order.
Definition: quadraturerules.hh:166
GeometryType geometry_type
Definition: quadraturerules.hh:186
ct CoordType
The type used for coordinates.
Definition: quadraturerules.hh:172
QuadratureRule()
Default constructor.
Definition: quadraturerules.hh:159
virtual int order() const
return order
Definition: quadraturerules.hh:175
@ d
Definition: quadraturerules.hh:169
QuadratureRule(GeometryType t)
Constructor for a given geometry type. Leaves the quadrature order invalid
Definition: quadraturerules.hh:163
std::vector< QuadraturePoint< ct, dim > >::const_iterator iterator
Definition: quadraturerules.hh:183
Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType.
Definition: quadraturerules.hh:324
A container for all quadrature rules of dimension dim
Definition: quadraturerules.hh:198
static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
maximum quadrature order for given geometry type and quadrature type
Definition: quadraturerules.hh:273
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:280
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:286
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:123
constexpr bool isPrism() const
Return true if entity is a prism.
Definition: type.hh:318
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition: type.hh:288
constexpr unsigned int dim() const
Return dimension of the type.
Definition: type.hh:369
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition: type.hh:129
constexpr bool isLine() const
Return true if entity is a line segment.
Definition: type.hh:293
constexpr unsigned int id() const
Return the topology id of the type.
Definition: type.hh:374
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition: type.hh:328
static constexpr std::size_t size(std::size_t dim)
Compute total number of geometry types for the given dimension.
Definition: typeindex.hh:59
static constexpr std::size_t index(const GeometryType >)
Compute the index for the given geometry type within its dimension.
Definition: typeindex.hh:71