version 3.11-dev
Loading...
Searching...
No Matches
quadraturerules.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
12#ifndef DUMUX_DISCRETIZATION_QUADRATURE_RULES_HH
13#define DUMUX_DISCRETIZATION_QUADRATURE_RULES_HH
14
15#include <array>
16#include <ranges>
17#include <dune/common/std/type_traits.hh>
18#include <dune/geometry/quadraturerules.hh>
19
20#include <dumux/common/tag.hh>
23#include <dumux/common/concepts/ipdata_.hh>
28
29namespace Dumux {
30
35template<class IpData>
37{
38 using Scalar = typename IpData::GlobalPosition::value_type;
39
40public:
41 QuadraturePointData(Scalar w, IpData ip)
42 : weight_(w), ipData_(std::move(ip))
43 {}
44
45 const Scalar& weight() const { return weight_; }
46 const IpData& ipData() const { return ipData_; }
47
48private:
49 Scalar weight_;
50 IpData ipData_;
51};
52
53namespace QuadratureRules {
54
59struct MidpointQuadrature : public Utility::Tag<MidpointQuadrature> {};
60
65template<int order>
66struct DuneQuadrature : public Utility::Tag<DuneQuadrature<order>>
67{
68 static constexpr int quadratureOrder = order;
69};
70
71} // end namespace QuadratureRules
72
73namespace CVFE {
74
79template<class GridView,
82 class ElementRule = QuadratureRules::MidpointQuadrature,
83 class IntersectionRule = QuadratureRules::MidpointQuadrature,
84 class BoundaryFaceRule = QuadratureRules::MidpointQuadrature>
86{
87 using ScvQuadratureRule = ScvRule;
88 using ScvfQuadratureRule = ScvfRule;
89 using ElementQuadratureRule = ElementRule;
90 using IntersectionQuadratureRule = IntersectionRule;
91 using BoundaryFaceQuadratureRule = BoundaryFaceRule;
92};
93
94namespace Detail {
95
96template<class FVElementGeometry>
97using DefinesScvQuadratureRuleType = typename FVElementGeometry::ScvQuadratureRule;
98
99template<class FVElementGeometry>
100using DefinesScvfQuadratureRuleType = typename FVElementGeometry::ScvfQuadratureRule;
101
102template<class FVElementGeometry>
103using DefinesElementQuadratureRuleType = typename FVElementGeometry::ElementQuadratureRule;
104
105template<class FVElementGeometry>
106using DefinesIntersectionQuadratureRuleType = typename FVElementGeometry::IntersectionQuadratureRule;
107
108template<class FVElementGeometry>
109using DefinesBoundaryFaceQuadratureRuleType = typename FVElementGeometry::BoundaryFaceQuadratureRule;
110
112template<class FVElementGeometry>
115 FVElementGeometry>;
116
118template<class FVElementGeometry>
121 FVElementGeometry>;
122
124template<class FVElementGeometry>
127 FVElementGeometry>;
128
130template<class FVElementGeometry>
133 FVElementGeometry>;
134
136template<class FVElementGeometry>
139 FVElementGeometry>;
140
142template<class GridView>
144 typename GridView::template Codim<0>::Entity::Geometry::LocalCoordinate,
145 typename GridView::template Codim<0>::Entity::Geometry::GlobalCoordinate,
147 >;
148
150template<class GridView>
152 typename GridView::template Codim<0>::Entity::Geometry::LocalCoordinate,
153 typename GridView::template Codim<0>::Entity::Geometry::GlobalCoordinate
154 >;
155
156} // end namespace Detail
157
159template<class FVElementGeometry>
160auto quadratureRule(const FVElementGeometry& fvGeometry,
161 const typename FVElementGeometry::SubControlVolume& scv,
163{
164 using GridGeometry = GridDiscretization_t<FVElementGeometry>;
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();
172
173 std::array<QuadraturePointData<QIpData>, 1> result{{
174 {Extrusion::volume(fvGeometry, scv), QIpData(0, ipLocal, ipGlobal, localDofIdx)}
175 }};
176 return result;
177}
178
180template<int order, class FVElementGeometry>
181auto quadratureRule(const FVElementGeometry& fvGeometry,
182 const typename FVElementGeometry::SubControlVolume& scv,
184{
185 using GridGeometry = GridDiscretization_t<FVElementGeometry>;
186 using GridView = typename GridGeometry::GridView;
189
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();
194
195 return std::views::iota(0u, 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)
203 };
204 });
205}
206
208template<class FVElementGeometry>
209auto quadratureRule(const FVElementGeometry& fvGeometry,
210 const typename FVElementGeometry::SubControlVolumeFace& scvf,
212{
213 using GridGeometry = GridDiscretization_t<FVElementGeometry>;
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);
221
222 std::array<QuadraturePointData<QFaceIpData>, 1> result{{
223 {Extrusion::area(fvGeometry, scvf), QFaceIpData(0, scvf.unitOuterNormal(), scvf.index(), ipLocal, ipGlobal)}
224 }};
225 return result;
226}
227
229template<int order, class FVElementGeometry>
230auto quadratureRule(const FVElementGeometry& fvGeometry,
231 const typename FVElementGeometry::SubControlVolumeFace& scvf,
233{
234 using GridGeometry = GridDiscretization_t<FVElementGeometry>;
235 using GridView = typename GridGeometry::GridView;
238
240
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();
246
247 return std::views::iota(0u, 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)
255 };
256 });
257}
258
260template<class FVElementGeometry>
261auto quadratureRule(const FVElementGeometry& fvGeometry,
262 const typename FVElementGeometry::Element& element,
264{
265 using GridGeometry = GridDiscretization_t<FVElementGeometry>;
266 using GridView = typename GridGeometry::GridView;
269
270 const auto& elementGeo = fvGeometry.elementGeometry();
271 const auto ipGlobal = elementGeo.center();
272 const auto ipLocal = elementGeo.local(ipGlobal);
273
274 std::array<Dumux::QuadraturePointData<QIpData>, 1> result{{
275 {Extrusion::volume(fvGeometry, elementGeo), QIpData(0, ipLocal, ipGlobal)}
276 }};
277 return result;
278}
279
281template<int order, class FVElementGeometry>
282auto quadratureRule(const FVElementGeometry& fvGeometry,
283 const typename FVElementGeometry::Element& element,
285{
286 using GridGeometry = GridDiscretization_t<FVElementGeometry>;
287 using GridView = typename GridGeometry::GridView;
290
291 const auto& elementGeo = fvGeometry.elementGeometry();
292 const auto& quad = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension>::rule(elementGeo.type(), order);
293
294 return std::views::iota(0u, 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)
302 };
303 });
304}
305
307template<class FVElementGeometry>
308auto quadratureRule(const FVElementGeometry& fvGeometry,
311{
312 // per default we don't add any intersection information to the ipData
313 using GridGeometry = GridDiscretization_t<FVElementGeometry>;
314 using GridView = typename GridGeometry::GridView;
318 BFlag,
321
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);
326
327 std::array<Dumux::QuadraturePointData<QFaceIpData>, 1> result{{
328 {Extrusion::area(fvGeometry, isGeometry),
329 QFaceIpData(0, is.centerUnitOuterNormal(), BFlag{ is }, is.indexInInside(), ipLocal, ipGlobal)}
330 }};
331 return result;
332}
333
335template<int order, class FVElementGeometry>
336auto quadratureRule(const FVElementGeometry& fvGeometry,
339{
340 // per default we don't add any intersection information to the ipData
341 using GridGeometry = GridDiscretization_t<FVElementGeometry>;
342 using GridView = typename GridGeometry::GridView;
345 BFlag,
349
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();
356
357 return std::views::iota(0u, 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)
367 };
368 });
369}
370
372template<class FVElementGeometry>
373auto quadratureRule(const FVElementGeometry& fvGeometry,
376{
377 using GridGeometry = GridDiscretization_t<FVElementGeometry>;
378 using GridView = typename GridGeometry::GridView;
380 using LocalIndex = typename IndexTraits<GridView>::LocalIndex;
383
384 const auto& elementGeo = fvGeometry.elementGeometry();
385 const auto ipGlobal = boundaryFace.center();
386 const auto ipLocal = elementGeo.local(ipGlobal);
387
388 std::array<QuadraturePointData<QBFIpData>, 1> result{{
389 {Extrusion::area(fvGeometry, boundaryFace), QBFIpData(0, boundaryFace.unitOuterNormal(), boundaryFace.index(), ipLocal, ipGlobal)}
390 }};
391 return result;
392}
393
395template<int order, class FVElementGeometry>
396auto quadratureRule(const FVElementGeometry& fvGeometry,
399{
400 using GridGeometry = GridDiscretization_t<FVElementGeometry>;
401 using GridView = typename GridGeometry::GridView;
402 using LocalIndex = typename IndexTraits<GridView>::LocalIndex;
406
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();
412
413 return std::views::iota(0u, 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)
421 };
422 });
423}
424
426template<class FVElementGeometry>
427auto quadratureRule(const FVElementGeometry& fvGeometry, const typename FVElementGeometry::SubControlVolume& scv)
428{
429 return quadratureRule(fvGeometry, scv, typename Detail::ScvQuadratureRuleType<FVElementGeometry>{});
430}
431
433template<class FVElementGeometry>
434auto quadratureRule(const FVElementGeometry& fvGeometry, const typename FVElementGeometry::SubControlVolumeFace& scvf)
435{
436 return quadratureRule(fvGeometry, scvf, typename Detail::ScvfQuadratureRuleType<FVElementGeometry>{});
437}
438
440template<class FVElementGeometry>
441auto quadratureRule(const FVElementGeometry& fvGeometry, const typename FVElementGeometry::Element& element)
442{
443 return quadratureRule(fvGeometry, element, typename Detail::ElementQuadratureRuleType<FVElementGeometry>{});
444}
445
447template<class FVElementGeometry>
448auto quadratureRule(const FVElementGeometry& fvGeometry, const typename GridDiscretization_t<FVElementGeometry>::GridView::Intersection& intersection)
449{
450 return quadratureRule(fvGeometry, intersection, typename Detail::IntersectionQuadratureRuleType<FVElementGeometry>{});
451}
452
454template<class FVElementGeometry>
455auto quadratureRule(const FVElementGeometry& fvGeometry, const typename GridDiscretization_t<FVElementGeometry>::BoundaryFace& boundaryFace)
456{
457 return quadratureRule(fvGeometry, boundaryFace, typename Detail::BoundaryFaceQuadratureRuleType<FVElementGeometry>{});
458}
459
460} // end namespace CVFE
461
462} // end namespace Dumux
463
464#endif
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
Defines the index types used for grid and local indices.
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
Definition adapt.hh:17
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
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.