12#ifndef DUMUX_DISCRETIZATION_QUADRATURE_RULES_HH
13#define DUMUX_DISCRETIZATION_QUADRATURE_RULES_HH
17#include <dune/common/std/type_traits.hh>
18#include <dune/geometry/quadraturerules.hh>
23#include <dumux/common/concepts/ipdata_.hh>
38 using Scalar =
typename IpData::GlobalPosition::value_type;
42 : weight_(
w), ipData_(std::move(ip))
45 const Scalar&
weight()
const {
return weight_; }
46 const IpData&
ipData()
const {
return ipData_; }
79template<
class GridView,
96template<
class FVElementGeometry>
99template<
class FVElementGeometry>
102template<
class FVElementGeometry>
105template<
class FVElementGeometry>
108template<
class FVElementGeometry>
112template<
class FVElementGeometry>
118template<
class FVElementGeometry>
124template<
class FVElementGeometry>
130template<
class FVElementGeometry>
136template<
class FVElementGeometry>
142template<
class Gr
idView>
144 typename GridView::template Codim<0>::Entity::Geometry::LocalCoordinate,
145 typename GridView::template Codim<0>::Entity::Geometry::GlobalCoordinate,
150template<
class Gr
idView>
152 typename GridView::template Codim<0>::Entity::Geometry::LocalCoordinate,
153 typename GridView::template Codim<0>::Entity::Geometry::GlobalCoordinate
159template<
class FVElementGeometry>
161 const typename FVElementGeometry::SubControlVolume& scv,
165 using GridView =
typename GridGeometry::GridView;
168 const auto& elementGeo = fvGeometry.elementGeometry();
169 const auto ipGlobal = scv.center();
170 const auto ipLocal = elementGeo.local(ipGlobal);
171 const auto localDofIdx = scv.localDofIndex();
173 std::array<QuadraturePointData<QIpData>, 1> result{{
174 {Extrusion::volume(fvGeometry, scv), QIpData(0, ipLocal, ipGlobal, localDofIdx)}
180template<
int order,
class FVElementGeometry>
182 const typename FVElementGeometry::SubControlVolume& scv,
186 using GridView =
typename GridGeometry::GridView;
190 auto scvGeo = fvGeometry.geometry(scv);
191 const auto& elementGeo = fvGeometry.elementGeometry();
192 const auto& quad = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension>::rule(scvGeo.type(), order);
193 const auto localDofIdx = scv.localDofIndex();
195 return std::views::iota(0
u, quad.size())
196 | std::views::transform([&quad, scvGeo = std::move(scvGeo), &elementGeo, localDofIdx](
const auto idx) {
197 const auto& qp = quad[idx];
198 const auto ipGlobal = scvGeo.global(qp.position());
199 const auto ipLocal = elementGeo.local(ipGlobal);
201 qp.weight() * Extrusion::integrationElement(scvGeo, qp.position()),
202 QIpData(idx, ipLocal, ipGlobal, localDofIdx)
208template<
class FVElementGeometry>
210 const typename FVElementGeometry::SubControlVolumeFace& scvf,
214 using GridView =
typename GridGeometry::GridView;
218 const auto& elementGeo = fvGeometry.elementGeometry();
219 const auto ipGlobal = scvf.ipGlobal();
220 const auto ipLocal = elementGeo.local(ipGlobal);
222 std::array<QuadraturePointData<QFaceIpData>, 1> result{{
223 {Extrusion::area(fvGeometry, scvf), QFaceIpData(0, scvf.unitOuterNormal(), scvf.index(), ipLocal, ipGlobal)}
229template<
int order,
class FVElementGeometry>
231 const typename FVElementGeometry::SubControlVolumeFace& scvf,
235 using GridView =
typename GridGeometry::GridView;
241 auto scvfGeo = fvGeometry.geometry(scvf);
242 const auto& elementGeo = fvGeometry.elementGeometry();
243 const auto& quad = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension-1>::rule(scvfGeo.type(), order);
244 auto normal = scvf.unitOuterNormal();
245 const auto scvfIndex = scvf.index();
247 return std::views::iota(0
u, quad.size())
248 | std::views::transform([&quad, scvfGeo = std::move(scvfGeo), &elementGeo,
normal = std::move(
normal), scvfIndex](
const auto idx) {
249 const auto& qp = quad[idx];
250 const auto ipGlobal = scvfGeo.global(qp.position());
251 const auto ipLocal = elementGeo.local(ipGlobal);
253 qp.weight() * Extrusion::integrationElement(scvfGeo, qp.position()),
254 QFaceIpData(idx,
normal, scvfIndex, ipLocal, ipGlobal)
260template<
class FVElementGeometry>
262 const typename FVElementGeometry::Element& element,
266 using GridView =
typename GridGeometry::GridView;
270 const auto& elementGeo = fvGeometry.elementGeometry();
271 const auto ipGlobal = elementGeo.center();
272 const auto ipLocal = elementGeo.local(ipGlobal);
274 std::array<Dumux::QuadraturePointData<QIpData>, 1> result{{
275 {Extrusion::volume(fvGeometry, elementGeo), QIpData(0, ipLocal, ipGlobal)}
281template<
int order,
class FVElementGeometry>
283 const typename FVElementGeometry::Element& element,
287 using GridView =
typename GridGeometry::GridView;
291 const auto& elementGeo = fvGeometry.elementGeometry();
292 const auto& quad = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension>::rule(elementGeo.type(), order);
294 return std::views::iota(0
u, quad.size())
295 | std::views::transform([&quad, &elementGeo](
const auto idx) {
296 const auto& qp = quad[idx];
297 const auto ipGlobal = elementGeo.global(qp.position());
298 const auto ipLocal = qp.position();
300 qp.weight() * Extrusion::integrationElement(elementGeo, qp.position()),
301 QIpData(idx, ipLocal, ipGlobal)
307template<
class FVElementGeometry>
314 using GridView =
typename GridGeometry::GridView;
322 const auto& elementGeo = fvGeometry.elementGeometry();
323 const auto isGeometry = is.geometry();
324 const auto ipGlobal = isGeometry.center();
325 const auto ipLocal = elementGeo.local(ipGlobal);
327 std::array<Dumux::QuadraturePointData<QFaceIpData>, 1> result{{
328 {Extrusion::area(fvGeometry, isGeometry),
329 QFaceIpData(0, is.centerUnitOuterNormal(), BFlag{ is }, is.indexInInside(), ipLocal, ipGlobal)}
335template<
int order,
class FVElementGeometry>
342 using GridView =
typename GridGeometry::GridView;
350 const auto& elementGeo = fvGeometry.elementGeometry();
351 auto isGeometry = is.geometry();
352 const auto& quad = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension-1>::rule(isGeometry.type(), order);
353 auto normal = is.centerUnitOuterNormal();
354 auto bFlag = BFlag{ is };
355 auto index = is.indexInInside();
357 return std::views::iota(0
u, quad.size())
358 | std::views::transform(
359 [&quad, isGeometry = std::move(isGeometry), &elementGeo,
normal = std::move(
normal),
360 bFlag = std::move(bFlag), index](
const auto idx) {
361 const auto& qp = quad[idx];
362 const auto ipGlobal = isGeometry.global(qp.position());
363 const auto ipLocal = elementGeo.local(ipGlobal);
365 qp.weight() * Extrusion::integrationElement(isGeometry, qp.position()),
366 QFaceIpData(idx,
normal, bFlag, index, ipLocal, ipGlobal)
372template<
class FVElementGeometry>
378 using GridView =
typename GridGeometry::GridView;
384 const auto& elementGeo = fvGeometry.elementGeometry();
385 const auto ipGlobal = boundaryFace.center();
386 const auto ipLocal = elementGeo.local(ipGlobal);
388 std::array<QuadraturePointData<QBFIpData>, 1> result{{
389 {Extrusion::area(fvGeometry, boundaryFace), QBFIpData(0, boundaryFace.unitOuterNormal(), boundaryFace.index(), ipLocal, ipGlobal)}
395template<
int order,
class FVElementGeometry>
401 using GridView =
typename GridGeometry::GridView;
407 auto bfGeo = fvGeometry.geometry(boundaryFace);
408 const auto& elementGeo = fvGeometry.elementGeometry();
409 const auto& quad = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension-1>::rule(bfGeo.type(), order);
410 auto normal = boundaryFace.unitOuterNormal();
411 const auto bfIdx = boundaryFace.index();
413 return std::views::iota(0
u, quad.size())
414 | std::views::transform([&quad, bfGeo = std::move(bfGeo), &elementGeo,
normal = std::move(
normal), bfIdx](
const auto idx) {
415 const auto& qp = quad[idx];
416 const auto ipGlobal = bfGeo.global(qp.position());
417 const auto ipLocal = elementGeo.local(ipGlobal);
419 qp.weight() * Extrusion::integrationElement(bfGeo, qp.position()),
420 QBFIpData(idx,
normal, bfIdx, ipLocal, ipGlobal)
426template<
class FVElementGeometry>
427auto quadratureRule(
const FVElementGeometry& fvGeometry,
const typename FVElementGeometry::SubControlVolume& scv)
433template<
class FVElementGeometry>
434auto quadratureRule(
const FVElementGeometry& fvGeometry,
const typename FVElementGeometry::SubControlVolumeFace& scvf)
440template<
class FVElementGeometry>
441auto quadratureRule(
const FVElementGeometry& fvGeometry,
const typename FVElementGeometry::Element& element)
447template<
class FVElementGeometry>
454template<
class FVElementGeometry>
Boundary flag to store e.g. in sub control volume faces.
Boundary flag to store e.g. in sub control volume faces.
Definition boundaryflag.hh:63
An interpolation point related to a face of an element.
Definition cvfe/interpolationpointdata.hh:109
Wraps interpolation point data and adds a quadrature point index for use in quadrature loops.
Definition cvfe/interpolationpointdata.hh:141
An interpolation point related to an element that includes global and local positions.
Definition cvfe/interpolationpointdata.hh:31
An interpolation point related to a localDof of an element, giving its global and local positions.
Definition cvfe/interpolationpointdata.hh:60
Traits extracting the public Extrusion type from T Defaults to NoExtrusion if no such type is found.
Definition extrusion.hh:246
An interpolation point related to a boundary face.
Definition fem/interpolationpointdata.hh:139
An interpolation point related to an intersection.
Definition fem/interpolationpointdata.hh:102
Quadrature point data with weight and interpolation point info.
Definition quadraturerules.hh:37
const Scalar & weight() const
Definition quadraturerules.hh:45
QuadraturePointData(Scalar w, IpData ip)
Definition quadraturerules.hh:41
const IpData & ipData() const
Definition quadraturerules.hh:46
Classes representing interpolation point data for control-volume finite element schemes.
Helper classes to compute the integration elements.
Shape functions and gradients at an interpolation point.
Type traits for classes providing a grid discretization.
Vector normal(const Vector &v)
Create a vector normal to the given one (v is expected to be non-zero).
Definition normal.hh:26
typename Detail::GridDiscretizationType< T >::type GridDiscretization_t
The grid discretization type of a class exporting it.
Definition griddiscretization.hh:54
Definition interpolate.hh:51
typename FVElementGeometry::IntersectionQuadratureRule DefinesIntersectionQuadratureRuleType
Definition quadraturerules.hh:106
typename FVElementGeometry::BoundaryFaceQuadratureRule DefinesBoundaryFaceQuadratureRuleType
Definition quadraturerules.hh:109
Dune::Std::detected_or_t< QuadratureRules::MidpointQuadrature, DefinesBoundaryFaceQuadratureRuleType, FVElementGeometry > BoundaryFaceQuadratureRuleType
Get BoundaryFaceQuadratureRule type (default is MidpointQuadrature).
Definition quadraturerules.hh:137
Dune::Std::detected_or_t< QuadratureRules::MidpointQuadrature, DefinesIntersectionQuadratureRuleType, FVElementGeometry > IntersectionQuadratureRuleType
Get IntersectionQuadratureRule type (default is MidpointQuadrature).
Definition quadraturerules.hh:131
Dune::Std::detected_or_t< QuadratureRules::MidpointQuadrature, DefinesElementQuadratureRuleType, FVElementGeometry > ElementQuadratureRuleType
Get ElementQuadratureRule type (default is MidpointQuadrature).
Definition quadraturerules.hh:125
Dune::Std::detected_or_t< QuadratureRules::MidpointQuadrature, DefinesScvfQuadratureRuleType, FVElementGeometry > ScvfQuadratureRuleType
Get ScvfQuadratureRule type (default is MidpointQuadrature).
Definition quadraturerules.hh:119
Dune::Std::detected_or_t< QuadratureRules::MidpointQuadrature, DefinesScvQuadratureRuleType, FVElementGeometry > ScvQuadratureRuleType
Get ScvQuadratureRule type (default is MidpointQuadrature).
Definition quadraturerules.hh:113
typename FVElementGeometry::ScvfQuadratureRule DefinesScvfQuadratureRuleType
Definition quadraturerules.hh:100
typename FVElementGeometry::ScvQuadratureRule DefinesScvQuadratureRuleType
Definition quadraturerules.hh:97
Dumux::CVFE::InterpolationPointData< typename GridView::template Codim< 0 >::Entity::Geometry::LocalCoordinate, typename GridView::template Codim< 0 >::Entity::Geometry::GlobalCoordinate > BaseIpData
Default InterpolationPointData type.
Definition quadraturerules.hh:151
typename FVElementGeometry::ElementQuadratureRule DefinesElementQuadratureRuleType
Definition quadraturerules.hh:103
Dumux::CVFE::LocalDofInterpolationPointData< typename GridView::template Codim< 0 >::Entity::Geometry::LocalCoordinate, typename GridView::template Codim< 0 >::Entity::Geometry::GlobalCoordinate, typename IndexTraits< GridView >::LocalIndex > LocalDofIpData
Default LocalDofInterpolationPointData type.
Definition quadraturerules.hh:143
Definition interpolate.hh:27
auto quadratureRule(const FVElementGeometry &fvGeometry, const typename FVElementGeometry::SubControlVolume &scv, QuadratureRules::MidpointQuadrature)
Midpoint quadrature for scv.
Definition quadraturerules.hh:160
Definition quadraturerules.hh:53
const Scalar PengRobinsonMixture< Scalar, StaticParameters >::w
Definition pengrobinsonmixture.hh:140
const Scalar PengRobinsonMixture< Scalar, StaticParameters >::u
Definition pengrobinsonmixture.hh:138
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:257
Quadrature rule traits for discretization schemes.
Definition quadraturerules.hh:86
QuadratureRules::MidpointQuadrature ElementQuadratureRule
Definition quadraturerules.hh:89
QuadratureRules::MidpointQuadrature BoundaryFaceQuadratureRule
Definition quadraturerules.hh:91
ScvRule ScvQuadratureRule
Definition quadraturerules.hh:87
QuadratureRules::MidpointQuadrature IntersectionQuadratureRule
Definition quadraturerules.hh:90
ScvfRule ScvfQuadratureRule
Definition quadraturerules.hh:88
unsigned int LocalIndex
Definition indextraits.hh:28
Dune-based quadrature rule with specified order.
Definition quadraturerules.hh:67
static constexpr int quadratureOrder
Definition quadraturerules.hh:68
Midpoint quadrature rule that uses scv/scvf centers.
Definition quadraturerules.hh:59
Helper class to create (named and comparable) tagged types Tags any given type. The tagged type is eq...
Definition tag.hh:30
Helper class to create (named and comparable) tagged types.