version 3.11-dev
extrusion.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//
15#ifndef DUMUX_DISCRETIZATION_EXTRUSION_HH
16#define DUMUX_DISCRETIZATION_EXTRUSION_HH
17
18#include <dune/common/std/type_traits.hh>
19
20namespace Dumux {
21
27{
28 template<class FVGeo, class Face>
29 static constexpr auto area(const FVGeo&, const Face& face)
30 { return face.area(); }
31
32 template<class FVGeo>
33 static constexpr auto area(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry& geo)
34 { return geo.volume(); }
35
36 template<class FVGeo, class SCV>
37 static constexpr auto volume(const FVGeo&, const SCV& scv)
38 { return scv.volume(); }
39
40 template<class FVGeo>
41 static constexpr auto volume(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry& geo)
42 { return geo.volume(); }
43
44 template<class Geometry>
45 static constexpr auto integrationElement(const Geometry& geo, const typename Geometry::LocalCoordinate& x)
46 { return geo.integrationElement(x); }
47};
48
54template<int radAx = 0>
56{
57 static constexpr int radialAxis = radAx;
58
63 template<class FVGeo, class Face>
64 static constexpr auto area(const FVGeo&, const Face& face)
65 {
66 static_assert(int(Face::Traits::Geometry::mydimension) == int(Face::Traits::Geometry::coorddimension-1), "Area element to be called with a codim-1-entity!");
67 static_assert(Face::Traits::Geometry::coorddimension <= 2, "Axis rotation only makes sense for geometries up to 2D!");
68 static_assert(radialAxis < int(Face::Traits::Geometry::coorddimension), "Illegal radial axis!");
69
70 // Guldinus theorem
71 return face.area()*2.0*M_PI*face.center()[radialAxis];
72 }
73
78 template<class FVGeo>
79 static constexpr auto area(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry& geo)
80 {
81 using Geometry = typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry;
82 static_assert(Geometry::coorddimension <= 2, "Axis rotation only makes sense for geometries up to 2D!");
83 static_assert(radialAxis < int(Geometry::coorddimension), "Illegal radial axis!");
84
85 // Guldinus theorem
86 return geo.volume()*2.0*M_PI*geo.center()[radialAxis];
87 }
88
93 template<class FVGeo, class SCV>
94 static constexpr auto volume(const FVGeo&, const SCV& scv)
95 {
96 static_assert(int(SCV::Traits::Geometry::mydimension) == int(SCV::Traits::Geometry::coorddimension), "Volume element to be called with a codim-0-entity!");
97 static_assert(SCV::Traits::Geometry::coorddimension <= 2, "Axis rotation only makes sense for geometries up to 2D!");
98 static_assert(radialAxis < int(SCV::Traits::Geometry::coorddimension), "Illegal radial axis!");
99
100 // Guldinus theorem
101 return scv.volume()*2.0*M_PI*scv.center()[radialAxis];
102 }
103
108 template<class FVGeo>
109 static constexpr auto volume(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry& geo)
110 {
111 using Geometry = typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry;
112 static_assert(Geometry::coorddimension <= 2, "Axis rotation only makes sense for geometries up to 2D!");
113 static_assert(radialAxis < int(Geometry::coorddimension), "Illegal radial axis!");
114
115 // Guldinus theorem
116 return geo.volume()*2.0*M_PI*geo.center()[radialAxis];
117 }
118
122 template<class Geometry>
123 static constexpr auto integrationElement(const Geometry& geo, const typename Geometry::LocalCoordinate& x)
124 {
125 static_assert(Geometry::coorddimension <= 2, "Axis rotation only makes sense for geometries up to 2D!");
126 static_assert(radialAxis < int(Geometry::coorddimension), "Illegal radial axis!");
127
128 // Multiply with the polar extrusion factor (2*pi) and the determinant of the transformation Jacobian (radius)
129 return geo.integrationElement(x)*2.0*M_PI*geo.global(x)[radialAxis];
130 }
131};
132
138{
143 template<class FVGeo, class Face>
144 static constexpr auto area(const FVGeo&, const Face& face)
145 {
146 static_assert(int(Face::Traits::Geometry::mydimension) == int(Face::Traits::Geometry::coorddimension-1), "Area element to be called with a codim-1-entity!");
147 static_assert(Face::Traits::Geometry::coorddimension == 1, "Spherical rotation only makes sense for 1D geometries!");
148
149 // sphere surface area
150 const auto radius = face.center()[0];
151 return 4.0*M_PI*radius*radius;
152 }
153
158 template<class FVGeo>
159 static constexpr auto area(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry& geo)
160 {
161 using Geometry = typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry;
162 static_assert(Geometry::coorddimension == 1, "Spherical rotation only makes sense for 1D geometries!");
163
164 // sphere surface area
165 const auto radius = geo.center()[0];
166 return 4.0*M_PI*radius*radius;
167 }
168
173 template<class FVGeo, class SCV>
174 static constexpr auto volume(const FVGeo& fvGeometry, const SCV& scv)
175 {
176 static_assert(int(SCV::Traits::Geometry::mydimension) == int(SCV::Traits::Geometry::coorddimension), "Volume element to be called with a codim-0-entity!");
177 static_assert(SCV::Traits::Geometry::coorddimension == 1, "Spherical rotation only makes sense for 1D geometries!");
178
179 // subtract two balls
180 const auto geo = fvGeometry.geometry(scv);
181 const auto radius0 = geo.corner(0)[0];
182 const auto radius1 = geo.corner(1)[0];
183 using std::abs;
184 return 4.0/3.0*M_PI*abs(radius1*radius1*radius1 - radius0*radius0*radius0);
185 }
186
191 template<class FVGeo>
192 static constexpr auto volume(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry& geo)
193 {
194 using Geometry = typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry;
195 static_assert(Geometry::coorddimension == 1, "Spherical rotation only makes sense for 1D geometries!");
196
197 // subtract two balls
198 const auto radius0 = geo.corner(0)[0];
199 const auto radius1 = geo.corner(1)[0];
200 using std::abs;
201 return 4.0/3.0*M_PI*abs(radius1*radius1*radius1 - radius0*radius0*radius0);
202 }
203
207 template<class Geometry>
208 static constexpr auto integrationElement(const Geometry& geo, const typename Geometry::LocalCoordinate& x)
209 {
210 static_assert(Geometry::coorddimension == 1, "Spherical rotation only makes sense for 1D geometries!");
211
212 // Multiply with the constant spherical extrusion factor (int_0^2pi int_0^pi sin(phi) dphi dtheta = 4pi)
213 // and the remaining (radius-dependent) part of determinant of the transformation Jacobian (radius*radius)
214 const auto radius = geo.global(x)[0];
215 return geo.integrationElement(x)*4.0*M_PI*radius*radius;
216 }
217};
218
223template<class T>
225{
226 template<class G>
227 using E = typename G::Extrusion;
228public:
229 using type = typename Dune::Std::detected_or<NoExtrusion, E, T>::type;
230};
231
235template<class T>
237
241template<class T>
242inline constexpr bool isRotationalExtrusion = false;
243
247template<int radialAxis>
248inline constexpr bool isRotationalExtrusion<RotationalExtrusion<radialAxis>> = true;
249
250} // end namespace Dumux
251
252#endif
Traits extracting the public Extrusion type from T Defaults to NoExtrusion if no such type is found.
Definition: extrusion.hh:225
typename Dune::Std::detected_or< NoExtrusion, E, T >::type type
Definition: extrusion.hh:229
Definition: adapt.hh:17
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition: extrusion.hh:236
constexpr bool isRotationalExtrusion
Convenience trait to check whether the extrusion is rotational.
Definition: extrusion.hh:242
Default implementation that performs no extrusion (extrusion with identity)
Definition: extrusion.hh:27
static constexpr auto area(const FVGeo &, const Face &face)
Definition: extrusion.hh:29
static constexpr auto area(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 1 >::Entity::Geometry &geo)
Definition: extrusion.hh:33
static constexpr auto volume(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 0 >::Entity::Geometry &geo)
Definition: extrusion.hh:41
static constexpr auto integrationElement(const Geometry &geo, const typename Geometry::LocalCoordinate &x)
Definition: extrusion.hh:45
static constexpr auto volume(const FVGeo &, const SCV &scv)
Definition: extrusion.hh:37
Rotation symmetric extrusion policy for rotating about an external axis.
Definition: extrusion.hh:56
static constexpr auto area(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 1 >::Entity::Geometry &geo)
Transformed intersection area.
Definition: extrusion.hh:79
static constexpr auto area(const FVGeo &, const Face &face)
Transformed face area.
Definition: extrusion.hh:64
static constexpr auto volume(const FVGeo &, const SCV &scv)
Transformed sub-control-volume volume.
Definition: extrusion.hh:94
static constexpr int radialAxis
Definition: extrusion.hh:57
static constexpr auto volume(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 0 >::Entity::Geometry &geo)
Transformed element volume.
Definition: extrusion.hh:109
static constexpr auto integrationElement(const Geometry &geo, const typename Geometry::LocalCoordinate &x)
Integration element for quadrature rules on the reference element.
Definition: extrusion.hh:123
Rotation symmetric extrusion policy for spherical rotation.
Definition: extrusion.hh:138
static constexpr auto volume(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 0 >::Entity::Geometry &geo)
Transformed element volume.
Definition: extrusion.hh:192
static constexpr auto integrationElement(const Geometry &geo, const typename Geometry::LocalCoordinate &x)
Integration element for quadrature rules on the reference element.
Definition: extrusion.hh:208
static constexpr auto volume(const FVGeo &fvGeometry, const SCV &scv)
Transformed sub-control-volume volume.
Definition: extrusion.hh:174
static constexpr auto area(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 1 >::Entity::Geometry &geo)
Transformed intersection area.
Definition: extrusion.hh:159
static constexpr auto area(const FVGeo &, const Face &face)
Transformed face area.
Definition: extrusion.hh:144