15#ifndef DUMUX_DISCRETIZATION_EXTRUSION_HH
16#define DUMUX_DISCRETIZATION_EXTRUSION_HH
18#include <dune/common/std/type_traits.hh>
28 template<
class FVGeo,
class Face>
29 static constexpr auto area(
const FVGeo&,
const Face& face)
30 {
return face.area(); }
33 static constexpr auto area(
const FVGeo&,
const typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry& geo)
34 {
return geo.volume(); }
36 template<
class FVGeo,
class SCV>
37 static constexpr auto volume(
const FVGeo&,
const SCV& scv)
38 {
return scv.volume(); }
41 static constexpr auto volume(
const FVGeo&,
const typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry& geo)
42 {
return geo.volume(); }
44 template<
class Geometry>
45 static constexpr auto integrationElement(
const Geometry& geo,
const typename Geometry::LocalCoordinate& x)
46 {
return geo.integrationElement(x); }
54template<
int radAx = 0>
63 template<
class FVGeo,
class Face>
64 static constexpr auto area(
const FVGeo&,
const Face& face)
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!");
71 return face.area()*2.0*M_PI*face.center()[
radialAxis];
79 static constexpr auto area(
const FVGeo&,
const typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry& geo)
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!");
86 return geo.volume()*2.0*M_PI*geo.center()[
radialAxis];
93 template<
class FVGeo,
class SCV>
94 static constexpr auto volume(
const FVGeo&,
const SCV& scv)
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!");
101 return scv.volume()*2.0*M_PI*scv.center()[
radialAxis];
108 template<
class FVGeo>
109 static constexpr auto volume(
const FVGeo&,
const typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry& geo)
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!");
116 return geo.volume()*2.0*M_PI*geo.center()[
radialAxis];
122 template<
class Geometry>
123 static constexpr auto integrationElement(
const Geometry& geo,
const typename Geometry::LocalCoordinate& x)
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!");
129 return geo.integrationElement(x)*2.0*M_PI*geo.global(x)[
radialAxis];
143 template<
class FVGeo,
class Face>
144 static constexpr auto area(
const FVGeo&,
const Face& face)
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!");
150 const auto radius = face.center()[0];
151 return 4.0*M_PI*radius*radius;
158 template<
class FVGeo>
159 static constexpr auto area(
const FVGeo&,
const typename FVGeo::GridGeometry::GridView::template Codim<1>::Entity::Geometry& geo)
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!");
165 const auto radius = geo.center()[0];
166 return 4.0*M_PI*radius*radius;
173 template<
class FVGeo,
class SCV>
174 static constexpr auto volume(
const FVGeo& fvGeometry,
const SCV& scv)
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!");
180 const auto geo = fvGeometry.geometry(scv);
181 const auto radius0 = geo.corner(0)[0];
182 const auto radius1 = geo.corner(1)[0];
184 return 4.0/3.0*M_PI*abs(radius1*radius1*radius1 - radius0*radius0*radius0);
191 template<
class FVGeo>
192 static constexpr auto volume(
const FVGeo&,
const typename FVGeo::GridGeometry::GridView::template Codim<0>::Entity::Geometry& geo)
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!");
198 const auto radius0 = geo.corner(0)[0];
199 const auto radius1 = geo.corner(1)[0];
201 return 4.0/3.0*M_PI*abs(radius1*radius1*radius1 - radius0*radius0*radius0);
207 template<
class Geometry>
208 static constexpr auto integrationElement(
const Geometry& geo,
const typename Geometry::LocalCoordinate& x)
210 static_assert(Geometry::coorddimension == 1,
"Spherical rotation only makes sense for 1D geometries!");
214 const auto radius = geo.global(x)[0];
215 return geo.integrationElement(x)*4.0*M_PI*radius*radius;
227 using E =
typename G::Extrusion;
229 using type =
typename Dune::Std::detected_or<NoExtrusion, E, T>::type;
247template<
int radialAxis>
248inline constexpr bool isRotationalExtrusion<RotationalExtrusion<radialAxis>> =
true;
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
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