version 3.11-dev
Loading...
Searching...
No Matches
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 <concepts>
19#include <type_traits>
20
21#include <dune/common/std/type_traits.hh>
22
23namespace Dumux {
24
25namespace Detail {
26
29template<class T, class FVGeo, int codim>
30concept EntityGeometry = std::same_as<
31 std::decay_t<T>,
32 typename FVGeo::GridGeometry::GridView::template Codim<codim>::Entity::Geometry
33>;
34
35} // end namespace Detail
36
42{
43 template<class FVGeo, class Face>
45 static constexpr auto area(const FVGeo&, const Face& face)
46 { return face.area(); }
47
48 template<class FVGeo>
49 static constexpr auto area(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry& geo)
50 { return geo.volume(); }
51
52 template<class FVGeo, class SCV>
54 static constexpr auto volume(const FVGeo&, const SCV& scv)
55 { return scv.volume(); }
56
57 template<class FVGeo>
58 static constexpr auto volume(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry& geo)
59 { return geo.volume(); }
60
61 template<class Geometry>
62 static constexpr auto integrationElement(const Geometry& geo, const typename Geometry::LocalCoordinate& x)
63 { return geo.integrationElement(x); }
64};
65
71template<int radAx = 0>
73{
74 static constexpr int radialAxis = radAx;
75
80 template<class FVGeo, class Face>
82 static constexpr auto area(const FVGeo&, const Face& face)
83 {
84 static_assert(int(Face::Traits::Geometry::mydimension) == int(Face::Traits::Geometry::coorddimension-1), "Area element to be called with a codim-1-entity!");
85 static_assert(Face::Traits::Geometry::coorddimension <= 2, "Axis rotation only makes sense for geometries up to 2D!");
86 static_assert(radialAxis < int(Face::Traits::Geometry::coorddimension), "Illegal radial axis!");
87
88 // Guldinus theorem
89 return face.area()*2.0*M_PI*face.center()[radialAxis];
90 }
91
96 template<class FVGeo>
97 static constexpr auto area(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry& geo)
98 {
99 using Geometry = typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry;
100 static_assert(Geometry::coorddimension <= 2, "Axis rotation only makes sense for geometries up to 2D!");
101 static_assert(radialAxis < int(Geometry::coorddimension), "Illegal radial axis!");
102
103 // Guldinus theorem
104 return geo.volume()*2.0*M_PI*geo.center()[radialAxis];
105 }
106
111 template<class FVGeo, class SCV>
113 static constexpr auto volume(const FVGeo&, const SCV& scv)
114 {
115 static_assert(int(SCV::Traits::Geometry::mydimension) == int(SCV::Traits::Geometry::coorddimension), "Volume element to be called with a codim-0-entity!");
116 static_assert(SCV::Traits::Geometry::coorddimension <= 2, "Axis rotation only makes sense for geometries up to 2D!");
117 static_assert(radialAxis < int(SCV::Traits::Geometry::coorddimension), "Illegal radial axis!");
118
119 // Guldinus theorem
120 return scv.volume()*2.0*M_PI*scv.center()[radialAxis];
121 }
122
127 template<class FVGeo>
128 static constexpr auto volume(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry& geo)
129 {
130 using Geometry = typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry;
131 static_assert(Geometry::coorddimension <= 2, "Axis rotation only makes sense for geometries up to 2D!");
132 static_assert(radialAxis < int(Geometry::coorddimension), "Illegal radial axis!");
133
134 // Guldinus theorem
135 return geo.volume()*2.0*M_PI*geo.center()[radialAxis];
136 }
137
141 template<class Geometry>
142 static constexpr auto integrationElement(const Geometry& geo, const typename Geometry::LocalCoordinate& x)
143 {
144 static_assert(Geometry::coorddimension <= 2, "Axis rotation only makes sense for geometries up to 2D!");
145 static_assert(radialAxis < int(Geometry::coorddimension), "Illegal radial axis!");
146
147 // Multiply with the polar extrusion factor (2*pi) and the determinant of the transformation Jacobian (radius)
148 return geo.integrationElement(x)*2.0*M_PI*geo.global(x)[radialAxis];
149 }
150};
151
157{
162 template<class FVGeo, class Face>
164 static constexpr auto area(const FVGeo&, const Face& face)
165 {
166 static_assert(int(Face::Traits::Geometry::mydimension) == int(Face::Traits::Geometry::coorddimension-1), "Area element to be called with a codim-1-entity!");
167 static_assert(Face::Traits::Geometry::coorddimension == 1, "Spherical rotation only makes sense for 1D geometries!");
168
169 // sphere surface area
170 const auto radius = face.center()[0];
171 return 4.0*M_PI*radius*radius;
172 }
173
178 template<class FVGeo>
179 static constexpr auto area(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry& geo)
180 {
181 using Geometry = typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry;
182 static_assert(Geometry::coorddimension == 1, "Spherical rotation only makes sense for 1D geometries!");
183
184 // sphere surface area
185 const auto radius = geo.center()[0];
186 return 4.0*M_PI*radius*radius;
187 }
188
193 template<class FVGeo, class SCV>
195 static constexpr auto volume(const FVGeo& fvGeometry, const SCV& scv)
196 {
197 static_assert(int(SCV::Traits::Geometry::mydimension) == int(SCV::Traits::Geometry::coorddimension), "Volume element to be called with a codim-0-entity!");
198 static_assert(SCV::Traits::Geometry::coorddimension == 1, "Spherical rotation only makes sense for 1D geometries!");
199
200 // subtract two balls
201 const auto geo = fvGeometry.geometry(scv);
202 const auto radius0 = geo.corner(0)[0];
203 const auto radius1 = geo.corner(1)[0];
204 using std::abs;
205 return 4.0/3.0*M_PI*abs(radius1*radius1*radius1 - radius0*radius0*radius0);
206 }
207
212 template<class FVGeo>
213 static constexpr auto volume(const FVGeo&, const typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry& geo)
214 {
215 using Geometry = typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry;
216 static_assert(Geometry::coorddimension == 1, "Spherical rotation only makes sense for 1D geometries!");
217
218 // subtract two balls
219 const auto radius0 = geo.corner(0)[0];
220 const auto radius1 = geo.corner(1)[0];
221 using std::abs;
222 return 4.0/3.0*M_PI*abs(radius1*radius1*radius1 - radius0*radius0*radius0);
223 }
224
228 template<class Geometry>
229 static constexpr auto integrationElement(const Geometry& geo, const typename Geometry::LocalCoordinate& x)
230 {
231 static_assert(Geometry::coorddimension == 1, "Spherical rotation only makes sense for 1D geometries!");
232
233 // Multiply with the constant spherical extrusion factor (int_0^2pi int_0^pi sin(phi) dphi dtheta = 4pi)
234 // and the remaining (radius-dependent) part of determinant of the transformation Jacobian (radius*radius)
235 const auto radius = geo.global(x)[0];
236 return geo.integrationElement(x)*4.0*M_PI*radius*radius;
237 }
238};
239
244template<class T>
246{
247 template<class G>
248 using E = typename G::Extrusion;
249public:
250 using type = typename Dune::Std::detected_or<NoExtrusion, E, T>::type;
251};
252
256template<class T>
258
262template<class T>
263inline constexpr bool isRotationalExtrusion = false;
264
268template<int radialAxis>
270
271} // end namespace Dumux
272
273#endif
Traits extracting the public Extrusion type from T Defaults to NoExtrusion if no such type is found.
Definition extrusion.hh:246
typename Dune::Std::detected_or< NoExtrusion, E, T >::type type
Definition extrusion.hh:250
Definition extrusion.hh:30
Definition cvfelocalresidual.hh:25
Definition adapt.hh:17
constexpr bool isRotationalExtrusion
Convenience trait to check whether the extrusion is rotational.
Definition extrusion.hh:263
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:257
Default implementation that performs no extrusion (extrusion with identity).
Definition extrusion.hh:42
static constexpr auto area(const FVGeo &, const Face &face)
Definition extrusion.hh:45
static constexpr auto area(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 1 >::Entity::Geometry &geo)
Definition extrusion.hh:49
static constexpr auto volume(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 0 >::Entity::Geometry &geo)
Definition extrusion.hh:58
static constexpr auto integrationElement(const Geometry &geo, const typename Geometry::LocalCoordinate &x)
Definition extrusion.hh:62
static constexpr auto volume(const FVGeo &, const SCV &scv)
Definition extrusion.hh:54
Rotation symmetric extrusion policy for rotating about an external axis.
Definition extrusion.hh:73
static constexpr auto area(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 1 >::Entity::Geometry &geo)
Transformed intersection area.
Definition extrusion.hh:97
static constexpr auto area(const FVGeo &, const Face &face)
Transformed face area.
Definition extrusion.hh:82
static constexpr auto volume(const FVGeo &, const SCV &scv)
Transformed sub-control-volume volume.
Definition extrusion.hh:113
static constexpr int radialAxis
Definition extrusion.hh:74
static constexpr auto volume(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 0 >::Entity::Geometry &geo)
Transformed element volume.
Definition extrusion.hh:128
static constexpr auto integrationElement(const Geometry &geo, const typename Geometry::LocalCoordinate &x)
Integration element for quadrature rules on the reference element.
Definition extrusion.hh:142
Rotation symmetric extrusion policy for spherical rotation.
Definition extrusion.hh:157
static constexpr auto volume(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 0 >::Entity::Geometry &geo)
Transformed element volume.
Definition extrusion.hh:213
static constexpr auto integrationElement(const Geometry &geo, const typename Geometry::LocalCoordinate &x)
Integration element for quadrature rules on the reference element.
Definition extrusion.hh:229
static constexpr auto volume(const FVGeo &fvGeometry, const SCV &scv)
Transformed sub-control-volume volume.
Definition extrusion.hh:195
static constexpr auto area(const FVGeo &, const typename FVGeo::GridGeometry::GridView::template Codim< 1 >::Entity::Geometry &geo)
Transformed intersection area.
Definition extrusion.hh:179
static constexpr auto area(const FVGeo &, const Face &face)
Transformed face area.
Definition extrusion.hh:164