25#ifndef DUMUX_DISCRETIZATION_BOX_GEOMETRY_HELPER_HH
26#define DUMUX_DISCRETIZATION_BOX_GEOMETRY_HELPER_HH
30#include <dune/common/exceptions.hh>
32#include <dune/geometry/type.hh>
33#include <dune/geometry/typeindex.hh>
34#include <dune/geometry/referenceelements.hh>
35#include <dune/geometry/multilineargeometry.hh>
47 template<
int mydim,
int cdim >
50 using Type = std::array< Dune::FieldVector< ct, cdim >, (1<<(mydim)) >;
57 static const bool v =
true;
58 static const unsigned int topologyId = Dune::GeometryTypes::cube(mydim).id();
64template<Dune::GeometryType::Id gt>
70 using Key = std::pair<std::uint8_t, std::uint8_t>;
71 static constexpr std::array<std::array<Key, 2>, 2> keys = {{
80 using Key = std::pair<std::uint8_t, std::uint8_t>;
81 static constexpr std::array<std::array<Key, 4>, 3> keys = {{
91 using Key = std::pair<std::uint8_t, std::uint8_t>;
92 static constexpr std::array<std::array<Key, 4>, 4> keys = {{
103 using Key = std::pair<std::uint8_t, std::uint8_t>;
104 static constexpr std::array<std::array<Key, 8>, 4> keys = {{
105 {
Key{0, 3},
Key{0, 2},
Key{1, 2},
Key{0, 1},
Key{3, 2},
Key{1, 1},
Key{2, 1},
Key{0, 0} },
106 {
Key{1, 3},
Key{2, 2},
Key{0, 2},
Key{0, 1},
Key{4, 2},
Key{3, 1},
Key{1, 1},
Key{0, 0} },
107 {
Key{2, 3},
Key{1, 2},
Key{2, 2},
Key{0, 1},
Key{5, 2},
Key{2, 1},
Key{3, 1},
Key{0, 0} },
108 {
Key{3, 3},
Key{3, 2},
Key{5, 2},
Key{2, 1},
Key{4, 2},
Key{1, 1},
Key{3, 1},
Key{0, 0} }
115 using Key = std::pair<std::uint8_t, std::uint8_t>;
116 static constexpr std::array<std::array<Key, 8>, 6> keys = {{
117 {
Key{0, 3},
Key{3, 2},
Key{4, 2},
Key{3, 1},
Key{0, 2},
Key{0, 1},
Key{1, 1},
Key{0, 0} },
118 {
Key{1, 3},
Key{5, 2},
Key{3, 2},
Key{3, 1},
Key{1, 2},
Key{2, 1},
Key{0, 1},
Key{0, 0} },
119 {
Key{2, 3},
Key{4, 2},
Key{5, 2},
Key{3, 1},
Key{2, 2},
Key{1, 1},
Key{2, 1},
Key{0, 0} },
120 {
Key{3, 3},
Key{7, 2},
Key{6, 2},
Key{4, 1},
Key{0, 2},
Key{1, 1},
Key{0, 1},
Key{0, 0} },
121 {
Key{4, 3},
Key{6, 2},
Key{8, 2},
Key{4, 1},
Key{1, 2},
Key{0, 1},
Key{2, 1},
Key{0, 0} },
122 {
Key{5, 3},
Key{8, 2},
Key{7, 2},
Key{4, 1},
Key{2, 2},
Key{2, 1},
Key{1, 1},
Key{0, 0} }
129 using Key = std::pair<std::uint8_t, std::uint8_t>;
130 static constexpr std::array<std::array<Key, 8>, 8> keys = {{
131 {
Key{0, 3},
Key{6, 2},
Key{4, 2},
Key{4, 1},
Key{0, 2},
Key{2, 1},
Key{0, 1},
Key{0, 0} },
132 {
Key{1, 3},
Key{5, 2},
Key{6, 2},
Key{4, 1},
Key{1, 2},
Key{1, 1},
Key{2, 1},
Key{0, 0} },
133 {
Key{2, 3},
Key{4, 2},
Key{7, 2},
Key{4, 1},
Key{2, 2},
Key{0, 1},
Key{3, 1},
Key{0, 0} },
134 {
Key{3, 3},
Key{7, 2},
Key{5, 2},
Key{4, 1},
Key{3, 2},
Key{3, 1},
Key{1, 1},
Key{0, 0} },
135 {
Key{4, 3},
Key{8, 2},
Key{10, 2},
Key{5, 1},
Key{0, 2},
Key{0, 1},
Key{2, 1},
Key{0, 0} },
136 {
Key{5, 3},
Key{10, 2},
Key{9, 2},
Key{5, 1},
Key{1, 2},
Key{2, 1},
Key{1, 1},
Key{0, 0} },
137 {
Key{6, 3},
Key{11, 2},
Key{8, 2},
Key{5, 1},
Key{2, 2},
Key{3, 1},
Key{0, 1},
Key{0, 0} },
138 {
Key{7, 3},
Key{9, 2},
Key{11, 2},
Key{5, 1},
Key{3, 2},
Key{1, 1},
Key{3, 1},
Key{0, 0} }
142template<Dune::GeometryType::Id gt>
148 using Key = std::pair<std::uint8_t, std::uint8_t>;
149 static constexpr std::array<std::array<Key, 1>, 1> keys = {{
157 using Key = std::pair<std::uint8_t, std::uint8_t>;
158 static constexpr std::array<std::array<Key, 2>, 3> keys = {{
168 using Key = std::pair<std::uint8_t, std::uint8_t>;
169 static constexpr std::array<std::array<Key, 2>, 4> keys = {{
180 using Key = std::pair<std::uint8_t, std::uint8_t>;
181 static constexpr std::array<std::array<Key, 4>, 6> keys = {{
194 using Key = std::pair<std::uint8_t, std::uint8_t>;
195 static constexpr std::array<std::array<Key, 4>, 9> keys = {{
211 using Key = std::pair<std::uint8_t, std::uint8_t>;
212 static constexpr std::array<std::array<Key, 4>, 12> keys = {{
229template<
class S,
class Geo,
class KeyArray, std::size_t... I>
232 using Dune::referenceElement;
233 const auto ref = referenceElement(geo);
235 return { geo.global(ref.position(key[I].first, key[I].second))... };
239template<
class S,
class Geo,
class T, std::
size_t N,
class Indices = std::make_index_sequence<N>>
242 return keyToCornerStorageImpl<S>(geo, key, Indices{});
247template<
class S,
class Geo,
class KeyArray, std::size_t... I>
250 using Dune::referenceElement;
251 const auto ref = referenceElement(geo);
254 return { geo.global(ref.position(ref.subEntity(i, c, key[I].first, c+key[I].second), c+key[I].second))... };
259template<
class S,
class Geo,
class T, std::
size_t N,
class Indices = std::make_index_sequence<N>>
262 return subEntityKeyToCornerStorageImpl<S>(geo, i, c, key, Indices{});
268template<
class Gr
idView,
int dim,
class ScvType,
class ScvfType>
272template <
class Gr
idView,
class ScvType,
class ScvfType>
276 using Scalar =
typename GridView::ctype;
277 using GlobalPosition =
typename Dune::FieldVector<Scalar, GridView::dimensionworld>;
278 using ScvCornerStorage =
typename ScvType::Traits::CornerStorage;
279 using ScvfCornerStorage =
typename ScvfType::Traits::CornerStorage;
280 using ScvGeometry =
typename ScvType::Traits::Geometry;
281 using ScvfGeometry =
typename ScvfType::Traits::Geometry;
283 using Element =
typename GridView::template Codim<0>::Entity;
284 using Intersection =
typename GridView::Intersection;
286 static constexpr int dim = 1;
297 return Detail::Box::keyToCornerStorage<ScvCornerStorage>(geo_, Corners::keys[localScvIdx]);
309 return Detail::Box::keyToCornerStorage<ScvfCornerStorage>(geo_, Corners::keys[localScvfIdx]);
316 return ScvfCornerStorage{{ geo_.corner(localFacetIndex) }};
320 [[deprecated(
"Will be removed after release 3.6. Use other signature.")]]
322 const typename Intersection::Geometry& geometry,
323 unsigned int indexInIntersection)
const
325 return getBoundaryScvfCorners(is.indexInInside(), indexInIntersection);
329 GlobalPosition
normal(
const ScvfCornerStorage& scvfCorners,
330 const std::vector<unsigned int>& scvIndices)
const
332 auto normal = geo_.corner(1) - geo_.corner(0);
338 [[deprecated(
"Will be removed after 3.6. Use volume from geometry/volume.hh")]]
339 Scalar
scvVolume(
const ScvCornerStorage& scvCorners)
const
341 return (scvCorners[1] - scvCorners[0]).two_norm();
345 [[deprecated(
"Will be removed after 3.6. Use volume from geometry/volume.hh")]]
346 Scalar
scvfArea(
const ScvfCornerStorage& scvfCorners)
const
354 return referenceElement(geo_).size(dim-1);
360 return referenceElement(geo_).size(dim);
368 const typename Element::Geometry& geo_;
372template <
class Gr
idView,
class ScvType,
class ScvfType>
375 using Scalar =
typename GridView::ctype;
376 using GlobalPosition =
typename Dune::FieldVector<Scalar, GridView::dimensionworld>;
377 using ScvCornerStorage =
typename ScvType::Traits::CornerStorage;
378 using ScvfCornerStorage =
typename ScvfType::Traits::CornerStorage;
380 using Element =
typename GridView::template Codim<0>::Entity;
381 using Intersection =
typename GridView::Intersection;
383 static constexpr auto dim = GridView::dimension;
384 static constexpr auto dimWorld = GridView::dimensionworld;
395 const auto type = geo_.type();
396 if (type == Dune::GeometryTypes::triangle)
399 return Detail::Box::keyToCornerStorage<ScvCornerStorage>(geo_, Corners::keys[localScvIdx]);
401 else if (type == Dune::GeometryTypes::quadrilateral)
404 return Detail::Box::keyToCornerStorage<ScvCornerStorage>(geo_, Corners::keys[localScvIdx]);
407 DUNE_THROW(Dune::NotImplemented,
"Box scv geometries for dim=" << dim
408 <<
" dimWorld=" << dimWorld
409 <<
" type=" << type);
416 const auto type = geo_.type();
417 if (type == Dune::GeometryTypes::triangle)
420 return Detail::Box::keyToCornerStorage<ScvfCornerStorage>(geo_, Corners::keys[localScvfIdx]);
422 else if (type == Dune::GeometryTypes::quadrilateral)
425 return Detail::Box::keyToCornerStorage<ScvfCornerStorage>(geo_, Corners::keys[localScvfIdx]);
428 DUNE_THROW(Dune::NotImplemented,
"Box scvf geometries for dim=" << dim
429 <<
" dimWorld=" << dimWorld
430 <<
" type=" << type);
435 unsigned int indexInFacet)
const
441 constexpr int facetCodim = 1;
442 return Detail::Box::subEntityKeyToCornerStorage<ScvfCornerStorage>(geo_, localFacetIndex, facetCodim, Corners::keys[indexInFacet]);
446 [[deprecated(
"Will be removed after release 3.6. Use other signature.")]]
448 const typename Intersection::Geometry& isGeometry,
449 unsigned int indexInIntersection)
const
451 return getBoundaryScvfCorners(is.indexInInside(), indexInIntersection);
455 template <
int w = dimWorld>
456 typename std::enable_if<w == 3, GlobalPosition>::type
457 normal(
const ScvfCornerStorage& scvfCorners,
458 const std::vector<unsigned int>& scvIndices)
const
460 const auto v1 = geo_.corner(1) - geo_.corner(0);
461 const auto v2 = geo_.corner(2) - geo_.corner(0);
463 const auto t = scvfCorners[1] - scvfCorners[0];
468 const auto v = geo_.corner(scvIndices[1]) - geo_.corner(scvIndices[0]);
477 template <
int w = dimWorld>
478 typename std::enable_if<w == 2, GlobalPosition>::type
479 normal(
const ScvfCornerStorage& scvfCorners,
480 const std::vector<unsigned int>& scvIndices)
const
483 const auto t = scvfCorners[1] - scvfCorners[0];
484 GlobalPosition
normal({-t[1], t[0]});
488 const auto v = geo_.corner(scvIndices[1]) - geo_.corner(scvIndices[0]);
497 template <
int w = dimWorld>
498 [[deprecated(
"Will be removed after 3.6. Use volume from geometry/volume.hh")]]
499 typename std::enable_if<w == 3, Scalar>::type
506 template <
int w = dimWorld>
507 [[deprecated(
"Will be removed after 3.6. Use volume from geometry/volume.hh")]]
508 typename std::enable_if<w == 2, Scalar>::type
518 [[deprecated(
"Will be removed after 3.6. Use volume from geometry/volume.hh")]]
521 return (p[1]-p[0]).two_norm();
527 return referenceElement(geo_).size(dim-1);
533 return referenceElement(geo_).size(dim);
541 const typename Element::Geometry& geo_;
545template <
class Gr
idView,
class ScvType,
class ScvfType>
548 using Scalar =
typename GridView::ctype;
549 using GlobalPosition =
typename Dune::FieldVector<Scalar, GridView::dimensionworld>;
550 using ScvCornerStorage =
typename ScvType::Traits::CornerStorage;
551 using ScvfCornerStorage =
typename ScvfType::Traits::CornerStorage;
553 using Element =
typename GridView::template Codim<0>::Entity;
554 using Intersection =
typename GridView::Intersection;
556 static constexpr auto dim = GridView::dimension;
557 static constexpr auto dimWorld = GridView::dimensionworld;
567 const auto type = geo_.type();
568 if (type == Dune::GeometryTypes::tetrahedron)
571 return Detail::Box::keyToCornerStorage<ScvCornerStorage>(geo_, Corners::keys[localScvIdx]);
573 else if (type == Dune::GeometryTypes::prism)
576 return Detail::Box::keyToCornerStorage<ScvCornerStorage>(geo_, Corners::keys[localScvIdx]);
578 else if (type == Dune::GeometryTypes::hexahedron)
581 return Detail::Box::keyToCornerStorage<ScvCornerStorage>(geo_, Corners::keys[localScvIdx]);
584 DUNE_THROW(Dune::NotImplemented,
"Box scv geometries for dim=" << dim
585 <<
" dimWorld=" << dimWorld
586 <<
" type=" << type);
593 const auto type = geo_.type();
594 if (type == Dune::GeometryTypes::tetrahedron)
597 return Detail::Box::keyToCornerStorage<ScvfCornerStorage>(geo_, Corners::keys[localScvfIdx]);
599 else if (type == Dune::GeometryTypes::prism)
602 return Detail::Box::keyToCornerStorage<ScvfCornerStorage>(geo_, Corners::keys[localScvfIdx]);
604 else if (type == Dune::GeometryTypes::hexahedron)
607 return Detail::Box::keyToCornerStorage<ScvfCornerStorage>(geo_, Corners::keys[localScvfIdx]);
610 DUNE_THROW(Dune::NotImplemented,
"Box scvf geometries for dim=" << dim
611 <<
" dimWorld=" << dimWorld
612 <<
" type=" << type);
617 unsigned int indexInFacet)
const
619 constexpr int facetCodim = 1;
624 using Dune::referenceElement;
625 const auto type = referenceElement(geo_).type(localFacetIndex, facetCodim);
626 if (type == Dune::GeometryTypes::triangle)
629 return Detail::Box::subEntityKeyToCornerStorage<ScvfCornerStorage>(geo_, localFacetIndex, facetCodim, Corners::keys[indexInFacet]);
631 else if (type == Dune::GeometryTypes::quadrilateral)
634 return Detail::Box::subEntityKeyToCornerStorage<ScvfCornerStorage>(geo_, localFacetIndex, facetCodim, Corners::keys[indexInFacet]);
637 DUNE_THROW(Dune::NotImplemented,
"Box boundary scvf geometries for dim=" << dim
638 <<
" dimWorld=" << dimWorld
639 <<
" type=" << type);
643 [[deprecated(
"Will be removed after release 3.6. Use other signature.")]]
645 const typename Intersection::Geometry& isGeometry,
646 unsigned int indexInIntersection)
const
648 return getBoundaryScvfCorners(is.indexInInside(), indexInIntersection);
652 GlobalPosition
normal(
const ScvfCornerStorage& p,
653 const std::vector<unsigned int>& scvIndices)
const
658 const auto v = geo_.corner(scvIndices[1]) - geo_.corner(scvIndices[0]);
667 [[deprecated(
"Will be removed after 3.6. Use volume from geometry/volume.hh")]]
671 const auto v = p[7]-p[0];
678 [[deprecated(
"Will be removed after 3.6. Use volume from geometry/volume.hh")]]
688 return referenceElement(geo_).size(dim-1);
694 return referenceElement(geo_).size(dim);
702 const typename Element::Geometry& geo_;
Define some often used mathematical functions.
Vector normal(const Vector &v)
Create a vector normal to the given one (v is expected to be non-zero)
Definition: normal.hh:38
Dune::FieldVector< Scalar, 3 > crossProduct(const Dune::FieldVector< Scalar, 3 > &vec1, const Dune::FieldVector< Scalar, 3 > &vec2)
Cross product of two vectors in three-dimensional Euclidean space.
Definition: math.hh:654
Scalar tripleProduct(const Dune::FieldVector< Scalar, 3 > &vec1, const Dune::FieldVector< Scalar, 3 > &vec2, const Dune::FieldVector< Scalar, 3 > &vec3)
Triple product of three vectors in three-dimensional Euclidean space retuning scalar.
Definition: math.hh:683
Adaption of the non-isothermal two-phase two-component flow model to problems with CO2.
Definition: adapt.hh:29
Definition: deprecated.hh:149
S subEntityKeyToCornerStorage(const Geo &geo, unsigned int i, unsigned int c, const std::array< T, N > &key)
Definition: boxgeometryhelper.hh:260
S subEntityKeyToCornerStorageImpl(const Geo &geo, unsigned int i, unsigned int c, const KeyArray &key, std::index_sequence< I... >)
Definition: boxgeometryhelper.hh:248
S keyToCornerStorage(const Geo &geo, const std::array< T, N > &key)
Definition: boxgeometryhelper.hh:240
S keyToCornerStorageImpl(const Geo &geo, const KeyArray &key, std::index_sequence< I... >)
Definition: boxgeometryhelper.hh:230
CVFE< CVFEMethods::PQ1 > Box
Definition: method.hh:83
constexpr Line line
Definition: couplingmanager1d3d_line.hh:43
Traits for an efficient corner storage for box method sub control volumes.
Definition: boxgeometryhelper.hh:44
Definition: boxgeometryhelper.hh:49
std::array< Dune::FieldVector< ct, cdim >,(1<<(mydim)) > Type
Definition: boxgeometryhelper.hh:50
Definition: boxgeometryhelper.hh:56
static const bool v
Definition: boxgeometryhelper.hh:57
static const unsigned int topologyId
Definition: boxgeometryhelper.hh:58
Definition: boxgeometryhelper.hh:65
Definition: boxgeometryhelper.hh:69
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:70
Definition: boxgeometryhelper.hh:79
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:80
Definition: boxgeometryhelper.hh:90
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:91
Definition: boxgeometryhelper.hh:102
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:103
Definition: boxgeometryhelper.hh:114
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:115
Definition: boxgeometryhelper.hh:128
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:129
Definition: boxgeometryhelper.hh:143
Definition: boxgeometryhelper.hh:147
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:148
Definition: boxgeometryhelper.hh:156
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:157
Definition: boxgeometryhelper.hh:167
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:168
Definition: boxgeometryhelper.hh:179
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:180
Definition: boxgeometryhelper.hh:193
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:194
Definition: boxgeometryhelper.hh:210
std::pair< std::uint8_t, std::uint8_t > Key
Definition: boxgeometryhelper.hh:211
Create sub control volumes and sub control volume face geometries.
Definition: boxgeometryhelper.hh:269
Scalar scvfArea(const ScvfCornerStorage &scvfCorners) const
get scvf area
Definition: boxgeometryhelper.hh:346
const Element::Geometry & elementGeometry() const
the wrapped element geometry
Definition: boxgeometryhelper.hh:364
std::size_t numInteriorScvf() const
number of sub control volume faces (number of edges)
Definition: boxgeometryhelper.hh:352
BoxGeometryHelper(const typename Element::Geometry &geometry)
Definition: boxgeometryhelper.hh:289
ScvCornerStorage getScvCorners(unsigned int localScvIdx) const
Create a vector with the scv corners.
Definition: boxgeometryhelper.hh:294
ScvfCornerStorage getBoundaryScvfCorners(unsigned int localFacetIndex, unsigned int) const
Create the sub control volume face geometries on the boundary.
Definition: boxgeometryhelper.hh:313
GlobalPosition normal(const ScvfCornerStorage &scvfCorners, const std::vector< unsigned int > &scvIndices) const
get scvf normal vector
Definition: boxgeometryhelper.hh:329
std::size_t numScv() const
number of sub control volumes (number of vertices)
Definition: boxgeometryhelper.hh:358
ScvGeometry scvGeometry(unsigned int localScvIdx) const
Definition: boxgeometryhelper.hh:300
ScvfCornerStorage getScvfCorners(unsigned int localScvfIdx) const
Create a vector with the corners of sub control volume faces.
Definition: boxgeometryhelper.hh:306
ScvfCornerStorage getBoundaryScvfCorners(const Intersection &is, const typename Intersection::Geometry &geometry, unsigned int indexInIntersection) const
Create the sub control volume face geometries on the boundary.
Definition: boxgeometryhelper.hh:321
Scalar scvVolume(const ScvCornerStorage &scvCorners) const
get scv volume
Definition: boxgeometryhelper.hh:339
std::size_t numScv() const
number of sub control volumes (number of vertices)
Definition: boxgeometryhelper.hh:531
std::enable_if< w==2, GlobalPosition >::type normal(const ScvfCornerStorage &scvfCorners, const std::vector< unsigned int > &scvIndices) const
get scvf normal vector for dim == 2, dimworld == 2
Definition: boxgeometryhelper.hh:479
std::size_t numInteriorScvf() const
number of sub control volume faces (number of edges)
Definition: boxgeometryhelper.hh:525
Scalar scvfArea(const ScvfCornerStorage &p) const
get scvf area
Definition: boxgeometryhelper.hh:519
ScvfCornerStorage getScvfCorners(unsigned int localScvfIdx) const
Create a vector with the corners of sub control volume faces.
Definition: boxgeometryhelper.hh:413
BoxGeometryHelper(const typename Element::Geometry &geometry)
Definition: boxgeometryhelper.hh:387
std::enable_if< w==3, Scalar >::type scvVolume(const ScvCornerStorage &p) const
get scv volume for dim == 2, dimworld == 3
Definition: boxgeometryhelper.hh:500
ScvfCornerStorage getBoundaryScvfCorners(const Intersection &is, const typename Intersection::Geometry &isGeometry, unsigned int indexInIntersection) const
Create the sub control volume face geometries on the boundary.
Definition: boxgeometryhelper.hh:447
ScvfCornerStorage getBoundaryScvfCorners(unsigned int localFacetIndex, unsigned int indexInFacet) const
Create the sub control volume face geometries on the boundary.
Definition: boxgeometryhelper.hh:434
const Element::Geometry & elementGeometry() const
the wrapped element geometry
Definition: boxgeometryhelper.hh:537
ScvCornerStorage getScvCorners(unsigned int localScvIdx) const
Create a vector with the scv corners.
Definition: boxgeometryhelper.hh:392
std::enable_if< w==2, Scalar >::type scvVolume(const ScvCornerStorage &p) const
get scv volume for dim == 2, dimworld == 2
Definition: boxgeometryhelper.hh:509
std::enable_if< w==3, GlobalPosition >::type normal(const ScvfCornerStorage &scvfCorners, const std::vector< unsigned int > &scvIndices) const
get scvf normal vector for dim == 2, dimworld == 3
Definition: boxgeometryhelper.hh:457
Scalar scvfArea(const ScvfCornerStorage &p) const
get scvf area
Definition: boxgeometryhelper.hh:679
ScvfCornerStorage getBoundaryScvfCorners(unsigned localFacetIndex, unsigned int indexInFacet) const
Create the sub control volume face geometries on the boundary.
Definition: boxgeometryhelper.hh:616
ScvfCornerStorage getBoundaryScvfCorners(const Intersection &is, const typename Intersection::Geometry &isGeometry, unsigned int indexInIntersection) const
Create the sub control volume face geometries on the boundary.
Definition: boxgeometryhelper.hh:644
GlobalPosition normal(const ScvfCornerStorage &p, const std::vector< unsigned int > &scvIndices) const
get scvf normal vector
Definition: boxgeometryhelper.hh:652
BoxGeometryHelper(const typename Element::Geometry &geometry)
Definition: boxgeometryhelper.hh:560
Scalar scvVolume(const ScvCornerStorage &p) const
get scv volume
Definition: boxgeometryhelper.hh:668
const Element::Geometry & elementGeometry() const
the wrapped element geometry
Definition: boxgeometryhelper.hh:698
ScvCornerStorage getScvCorners(unsigned int localScvIdx) const
Create a vector with the scv corners.
Definition: boxgeometryhelper.hh:565
ScvfCornerStorage getScvfCorners(unsigned int localScvfIdx) const
Create a vector with the scvf corners.
Definition: boxgeometryhelper.hh:590
std::size_t numScv() const
number of sub control volumes (number of vertices)
Definition: boxgeometryhelper.hh:692
std::size_t numInteriorScvf() const
number of sub control volume faces (number of edges)
Definition: boxgeometryhelper.hh:686