13#ifndef DUMUX_DISCRETIZATION_PQ1BUBBLE_GEOMETRY_HELPER_HH
14#define DUMUX_DISCRETIZATION_PQ1BUBBLE_GEOMETRY_HELPER_HH
19#include <dune/common/exceptions.hh>
20#include <dune/common/rangeutilities.hh>
21#include <dune/common/reservedvector.hh>
23#include <dune/geometry/type.hh>
24#include <dune/geometry/referenceelements.hh>
25#include <dune/geometry/multilineargeometry.hh>
46 template<
int mydim,
int cdim >
49 using Type = Dune::ReservedVector< Dune::FieldVector< ct, cdim >, (1<<mydim)>;
56template<Dune::GeometryType::Id gt>
62 using Key = std::pair<std::uint8_t, std::uint8_t>;
63 static constexpr std::array<std::array<Key, 2>, 1>
keys = {{
71 using Key = std::pair<std::uint8_t, std::uint8_t>;
72 static constexpr std::array<std::array<Key, 3>, 1>
keys = {{
80 using Key = std::pair<std::uint8_t, std::uint8_t>;
81 static constexpr std::array<std::array<Key, 4>, 1>
keys = {{
89 using Key = std::pair<std::uint8_t, std::uint8_t>;
90 static constexpr std::array<std::array<Key, 4>, 1>
keys = {{
98 using Key = std::pair<std::uint8_t, std::uint8_t>;
99 static constexpr std::array<std::array<Key, 6>, 1>
keys = {{
100 {
Key{0, 1},
Key{2, 1},
Key{3, 1},
Key{1, 1},
Key{4, 1},
Key{5, 1} }
105template<Dune::GeometryType::Id gt>
111 using Key = std::pair<std::uint8_t, std::uint8_t>;
112 static constexpr std::array<std::array<Key, 1>, 1>
keys = {{
120 using Key = std::pair<std::uint8_t, std::uint8_t>;
121 static constexpr std::array<std::array<Key, 2>, 3>
keys = {{
131 using Key = std::pair<std::uint8_t, std::uint8_t>;
132 static constexpr std::array<std::array<Key, 2>, 4>
keys = {{
143 using Key = std::pair<std::uint8_t, std::uint8_t>;
144 static constexpr std::array<std::array<Key, 3>, 4>
keys = {{
155 using Key = std::pair<std::uint8_t, std::uint8_t>;
156 static constexpr std::array<std::array<Key, 3>, 8>
keys = {{
174template <
class Gr
idView,
class ScvType,
class ScvfType>
177 using Scalar =
typename GridView::ctype;
178 using GlobalPosition =
typename Dune::FieldVector<Scalar, GridView::dimensionworld>;
179 using ScvCornerStorage =
typename ScvType::Traits::CornerStorage;
180 using ScvfCornerStorage =
typename ScvfType::Traits::CornerStorage;
181 using LocalIndexType =
typename ScvType::Traits::LocalIndexType;
183 using Element =
typename GridView::template Codim<0>::Entity;
184 using Intersection =
typename GridView::Intersection;
186 static constexpr auto dim = GridView::dimension;
187 static constexpr auto dimWorld = GridView::dimensionworld;
195 , boxHelper_(geometry)
201 return getScvCorners(geo_.type(), [&](
const auto& local){ return geo_.global(local); }, localScvIdx);
205 template<
class Transformation>
206 static ScvCornerStorage
getScvCorners(Dune::GeometryType type, Transformation&& trans,
unsigned int localScvIdx)
209 const auto& ref = Dune::referenceElement<Scalar, dim>(type);
210 const auto numBoxScv = ref.size(dim);
212 if (localScvIdx < numBoxScv)
213 return BoxHelper::getScvCorners(type, trans, localScvIdx);
215 const auto localOverlappingScvIdx = localScvIdx-numBoxScv;
216 if (type == Dune::GeometryTypes::triangle)
221 else if (type == Dune::GeometryTypes::quadrilateral)
226 else if (type == Dune::GeometryTypes::tetrahedron)
231 else if (type == Dune::GeometryTypes::hexahedron)
237 DUNE_THROW(Dune::NotImplemented,
"PQ1Bubble scv geometries for dim=" << dim
238 <<
" dimWorld=" << dimWorld
239 <<
" type=" << type);
245 const auto type = geo_.type();
246 const auto numBoxScv = boxHelper_.numScv();
247 if (localScvIdx < numBoxScv)
248 return Dune::GeometryTypes::cube(dim);
249 else if (type == Dune::GeometryTypes::simplex(dim))
250 return Dune::GeometryTypes::simplex(dim);
251 else if (type == Dune::GeometryTypes::quadrilateral)
252 return Dune::GeometryTypes::quadrilateral;
253 else if (type == Dune::GeometryTypes::hexahedron)
254 return Dune::GeometryTypes::none(dim);
256 DUNE_THROW(Dune::NotImplemented,
"PQ1Bubble scv geometries for dim=" << dim
257 <<
" dimWorld=" << dimWorld
258 <<
" type=" << type);
264 return getScvfCorners(geo_.type(), [&](
const auto& local){ return geo_.global(local); }, localScvfIdx);
268 template<
class Transformation>
269 static ScvfCornerStorage
getScvfCorners(Dune::GeometryType type, Transformation&& trans,
unsigned int localScvfIdx)
272 const auto& ref = Dune::referenceElement<Scalar, dim>(type);
273 const auto numBoxScvf = ref.size(dim-1);
275 if (localScvfIdx < numBoxScvf)
276 return BoxHelper::getScvfCorners(type, trans, localScvfIdx);
278 const auto localOverlappingScvfIdx = localScvfIdx-numBoxScvf;
279 if (type == Dune::GeometryTypes::triangle)
284 else if (type == Dune::GeometryTypes::quadrilateral)
289 else if (type == Dune::GeometryTypes::tetrahedron)
294 else if (type == Dune::GeometryTypes::hexahedron)
300 DUNE_THROW(Dune::NotImplemented,
"PQ1Bubble scvf geometries for dim=" << dim
301 <<
" dimWorld=" << dimWorld
302 <<
" type=" << type);
307 const auto numBoxScvf = boxHelper_.numInteriorScvf();
308 if (localScvfIdx < numBoxScvf)
309 return Dune::GeometryTypes::cube(dim-1);
311 return Dune::GeometryTypes::simplex(dim-1);
316 unsigned int indexInFacet)
const
318 return boxHelper_.getBoundaryScvfCorners(localFacetIndex, indexInFacet);
323 return Dune::GeometryTypes::cube(dim-1);
326 GlobalPosition
normal(
const ScvfCornerStorage& p,
const std::array<LocalIndexType, 2>& scvPair)
346 return BoxHelper::numInteriorScvf(type) + Dune::referenceElement<Scalar, dim>(type).size(dim);
352 return Dune::referenceElement<Scalar, dim>(type).size(localFacetIndex, 1, dim);
358 return boxHelper_.numScv() + 1;
362 Scalar
scvVolume(
unsigned int localScvIdx,
const ScvCornerStorage& p)
const
365 if constexpr (dim == 3)
366 if (scvType == Dune::GeometryTypes::none(dim))
367 return octahedronVolume_(p);
371 [&](
unsigned int i){
return p[i]; }
383 const auto numVertexDofs = Dune::referenceElement<Scalar, dim>(geo_.type()).size(dim);
384 if (localDofIdx < numVertexDofs)
385 return geo_.corner(localDofIdx);
387 return geo_.center();
392 const auto numEdges = referenceElement(geo_).size(dim-1);
393 if (localScvfIndex < numEdges)
395 static_cast<LocalIndexType
>(referenceElement(geo_).subEntity(localScvfIndex, dim-1, 0, dim)),
396 static_cast<LocalIndexType
>(referenceElement(geo_).subEntity(localScvfIndex, dim-1, 1, dim))
401 static_cast<LocalIndexType
>(localScvfIndex-numEdges)
407 const LocalIndexType insideScvIdx
408 =
static_cast<LocalIndexType
>(referenceElement(geo_).subEntity(localFacetIndex, 1, localIsScvfIndex, dim));
409 return { insideScvIdx, insideScvIdx };
414 if (localScvfIndex < boxHelper_.numInteriorScvf())
427 if (localScvIndex < boxHelper_.numScv())
434 static Element::Geometry::LocalCoordinate
localScvfCenter(Dune::GeometryType type,
unsigned int localScvfIdx)
440 static Element::Geometry::LocalCoordinate
localBoundaryScvfCenter(Dune::GeometryType type,
unsigned int localFacetIndex,
unsigned int indexInFace)
442 return Dumux::center(BoxHelper::getBoundaryScvfCorners(type, [&](
const auto& local){
return local; }, localFacetIndex, indexInFace));
446 Scalar octahedronVolume_(
const ScvCornerStorage& p)
const
455 typename Element::Geometry geo_;
456 BoxHelper boxHelper_;
459template <
class Gr
idView,
class ScvType,
class ScvfType, std::
size_t numCubeBubbleDofs>
462 using Scalar =
typename GridView::ctype;
463 using GlobalPosition =
typename Dune::FieldVector<Scalar, GridView::dimensionworld>;
464 using ScvCornerStorage =
typename ScvType::Traits::CornerStorage;
465 using ScvfCornerStorage =
typename ScvfType::Traits::CornerStorage;
466 using LocalIndexType =
typename ScvType::Traits::LocalIndexType;
468 using Element =
typename GridView::template Codim<0>::Entity;
469 using Intersection =
typename GridView::Intersection;
471 static constexpr auto dim = GridView::dimension;
472 static constexpr auto dimWorld = GridView::dimensionworld;
480 , boxHelper_(geometry)
486 return getScvCorners(geo_.type(), [&](
const auto& local){ return geo_.global(local); }, localScvIdx);
490 template<
class Transformation>
491 static ScvCornerStorage
getScvCorners(Dune::GeometryType type, Transformation&& trans,
unsigned int localScvIdx)
494 const auto& ref = Dune::referenceElement<Scalar, dim>(type);
495 const auto numBoxScv = ref.size(dim);
497 if (localScvIdx < numBoxScv)
498 return BoxHelper::getScvCorners(type, trans, localScvIdx);
500 DUNE_THROW(Dune::NotImplemented,
"PQ1Bubble scv corners call for hybrid dofs");
506 const auto numBoxScv = boxHelper_.numScv();
508 if (localScvIdx < numBoxScv)
509 return Dune::GeometryTypes::cube(dim);
511 DUNE_THROW(Dune::NotImplemented,
"PQ1Bubble scv geometry call for hybrid dofs");
517 return getScvfCorners(geo_.type(), [&](
const auto& local){ return geo_.global(local); }, localScvfIdx);
521 template<
class Transformation>
522 static ScvfCornerStorage
getScvfCorners(Dune::GeometryType type, Transformation&& trans,
unsigned int localScvfIdx)
525 const auto& ref = Dune::referenceElement<Scalar, dim>(type);
526 const auto numBoxScvf = ref.size(dim-1);
528 if (localScvfIdx < numBoxScvf)
529 return BoxHelper::getScvfCorners(type, trans, localScvfIdx);
531 DUNE_THROW(Dune::NotImplemented,
"PQ1Bubble scvf corners call for hybrid dofs");
536 const auto numBoxScvf = boxHelper_.numInteriorScvf();
537 if (localScvfIdx < numBoxScvf)
538 return Dune::GeometryTypes::cube(dim-1);
540 DUNE_THROW(Dune::NotImplemented,
"PQ1Bubble interior scvf geometry type call for hybrid dofs");
545 unsigned int indexInFacet)
const
547 return boxHelper_.getBoundaryScvfCorners(localFacetIndex, indexInFacet);
552 return Dune::GeometryTypes::cube(dim-1);
555 GlobalPosition
normal(
const ScvfCornerStorage& p,
const std::array<LocalIndexType, 2>& scvPair)
575 return BoxHelper::numInteriorScvf(type);
581 return Dune::referenceElement<Scalar, dim>(type).size(localFacetIndex, 1, dim);
587 return boxHelper_.numScv();
591 Scalar
scvVolume(
unsigned int localScvIdx,
const ScvCornerStorage& p)
const
597 [&](
unsigned int i){
return p[i]; }
604 return type.isCube() ? numCubeBubbleDofs : 1;
609 const auto numVertexDofs = Dune::referenceElement<Scalar, dim>(geo_.type()).size(dim);
610 if (localDofIdx < numVertexDofs)
611 return geo_.corner(localDofIdx);
613 return geo_.center();
618 const auto numEdges = referenceElement(geo_).size(dim-1);
619 if (localScvfIndex < numEdges)
621 static_cast<LocalIndexType
>(referenceElement(geo_).subEntity(localScvfIndex, dim-1, 0, dim)),
622 static_cast<LocalIndexType
>(referenceElement(geo_).subEntity(localScvfIndex, dim-1, 1, dim))
625 DUNE_THROW(Dune::NotImplemented,
"PQ1Bubble scv pair call for hybrid dofs");
630 const LocalIndexType insideScvIdx
631 =
static_cast<LocalIndexType
>(referenceElement(geo_).subEntity(localFacetIndex, 1, localIsScvfIndex, dim));
632 return { insideScvIdx, insideScvIdx };
645 static Element::Geometry::LocalCoordinate
localScvfCenter(Dune::GeometryType type,
unsigned int localScvfIdx)
651 static Element::Geometry::LocalCoordinate
localBoundaryScvfCenter(Dune::GeometryType type,
unsigned int localFacetIndex,
unsigned int indexInFace)
653 return Dumux::center(BoxHelper::getBoundaryScvfCorners(type, [&](
const auto& local){
return local; }, localFacetIndex, indexInFace));
657 typename Element::Geometry geo_;
Helper class constructing the dual grid finite volume geometries for the box discretizazion method.
Compute the center point of a convex polytope geometry or a random-access container of corner points.
Create sub control volumes and sub control volume face geometries.
Definition boxgeometryhelper.hh:262
PQ1BubbleDofHelper< GridView, numCubeBubbleDofs > DofHelper
Definition discretization/pq1bubble/geometryhelper.hh:476
static auto numInteriorScvf(Dune::GeometryType type)
number of interior sub control volume faces
Definition discretization/pq1bubble/geometryhelper.hh:573
std::array< LocalIndexType, 2 > getScvPairForScvf(unsigned int localScvfIndex) const
Definition discretization/pq1bubble/geometryhelper.hh:616
static Element::Geometry::LocalCoordinate localScvfCenter(Dune::GeometryType type, unsigned int localScvfIdx)
local scvf center
Definition discretization/pq1bubble/geometryhelper.hh:645
bool isOverlappingScv(unsigned int localScvIndex) const
Definition discretization/pq1bubble/geometryhelper.hh:641
HybridPQ1BubbleGeometryHelper(const typename Element::Geometry &geometry)
Definition discretization/pq1bubble/geometryhelper.hh:478
const Element::Geometry & elementGeometry() const
the wrapped element geometry
Definition discretization/pq1bubble/geometryhelper.hh:569
static Element::Geometry::LocalCoordinate localBoundaryScvfCenter(Dune::GeometryType type, unsigned int localFacetIndex, unsigned int indexInFace)
local boundary scvf center
Definition discretization/pq1bubble/geometryhelper.hh:651
static ScvfCornerStorage getScvfCorners(Dune::GeometryType type, Transformation &&trans, unsigned int localScvfIdx)
Create a vector with the corners of sub control volume faces.
Definition discretization/pq1bubble/geometryhelper.hh:522
ScvfCornerStorage getBoundaryScvfCorners(unsigned int localFacetIndex, unsigned int indexInFacet) const
Create the sub control volume face geometries on the boundary.
Definition discretization/pq1bubble/geometryhelper.hh:544
Dune::GeometryType getScvGeometryType(unsigned int localScvIdx) const
Definition discretization/pq1bubble/geometryhelper.hh:503
Dune::GeometryType getInteriorScvfGeometryType(unsigned int localScvfIdx) const
Definition discretization/pq1bubble/geometryhelper.hh:534
static ScvCornerStorage getScvCorners(Dune::GeometryType type, Transformation &&trans, unsigned int localScvIdx)
Create a vector with the scv corners.
Definition discretization/pq1bubble/geometryhelper.hh:491
bool isOverlappingBoundaryScvf(unsigned int localFacetIndex) const
Definition discretization/pq1bubble/geometryhelper.hh:638
static std::size_t numNonCVLocalDofs(Dune::GeometryType type)
number of hybrid dofs (overrides base: for cube elements there are numCubeBubbleDofs extra dofs)
Definition discretization/pq1bubble/geometryhelper.hh:602
static auto numBoundaryScvf(Dune::GeometryType type, unsigned int localFacetIndex)
number of boundary sub control volume faces for face localFacetIndex
Definition discretization/pq1bubble/geometryhelper.hh:579
Scalar scvVolume(unsigned int localScvIdx, const ScvCornerStorage &p) const
get scv volume
Definition discretization/pq1bubble/geometryhelper.hh:591
std::array< LocalIndexType, 2 > getScvPairForBoundaryScvf(unsigned int localFacetIndex, unsigned int localIsScvfIndex) const
Definition discretization/pq1bubble/geometryhelper.hh:628
GlobalPosition dofPosition(unsigned int localDofIdx) const
Definition discretization/pq1bubble/geometryhelper.hh:607
bool isOverlappingScvf(unsigned int localScvfIndex) const
Definition discretization/pq1bubble/geometryhelper.hh:635
ScvfCornerStorage getScvfCorners(unsigned int localScvfIdx) const
Create a vector with the corners of sub control volume faces.
Definition discretization/pq1bubble/geometryhelper.hh:515
ScvCornerStorage getScvCorners(unsigned int localScvIdx) const
Create a vector with the scv corners.
Definition discretization/pq1bubble/geometryhelper.hh:484
std::size_t numScv() const
number of sub control volumes (number of codim-1 entities)
Definition discretization/pq1bubble/geometryhelper.hh:585
GlobalPosition normal(const ScvfCornerStorage &p, const std::array< LocalIndexType, 2 > &scvPair)
Definition discretization/pq1bubble/geometryhelper.hh:555
Dune::GeometryType getBoundaryScvfGeometryType(unsigned int localScvfIdx) const
Definition discretization/pq1bubble/geometryhelper.hh:550
Dof helper for the PQ1Bubble method, providing the number of dofs and their positions.
Definition pq1bubble/dofhelper.hh:36
static std::size_t numElementDofs(Dune::GeometryType type)
Definition pq1bubble/dofhelper.hh:48
PQ1BubbleGeometryHelper(const typename Element::Geometry &geometry)
Definition discretization/pq1bubble/geometryhelper.hh:193
static auto numBoundaryScvf(Dune::GeometryType type, unsigned int localFacetIndex)
number of boundary sub control volume faces for face localFacetIndex
Definition discretization/pq1bubble/geometryhelper.hh:350
bool isOverlappingBoundaryScvf(unsigned int localFacetIndex) const
Definition discretization/pq1bubble/geometryhelper.hh:420
bool isOverlappingScvf(unsigned int localScvfIndex) const
Definition discretization/pq1bubble/geometryhelper.hh:412
static std::size_t numNonCVLocalDofs(Dune::GeometryType type)
number of hybrid dofs (overrides base: PQ1Bubble uses no non-CV dofs in the FV context)
Definition discretization/pq1bubble/geometryhelper.hh:376
GlobalPosition normal(const ScvfCornerStorage &p, const std::array< LocalIndexType, 2 > &scvPair)
Definition discretization/pq1bubble/geometryhelper.hh:326
std::size_t numScv() const
number of sub control volumes (number of codim-1 entities)
Definition discretization/pq1bubble/geometryhelper.hh:356
static auto numInteriorScvf(Dune::GeometryType type)
number of interior sub control volume faces
Definition discretization/pq1bubble/geometryhelper.hh:344
static ScvfCornerStorage getScvfCorners(Dune::GeometryType type, Transformation &&trans, unsigned int localScvfIdx)
Create a vector with the corners of sub control volume faces.
Definition discretization/pq1bubble/geometryhelper.hh:269
static ScvCornerStorage getScvCorners(Dune::GeometryType type, Transformation &&trans, unsigned int localScvIdx)
Create a vector with the scv corners.
Definition discretization/pq1bubble/geometryhelper.hh:206
Dune::GeometryType getBoundaryScvfGeometryType(unsigned int localScvfIdx) const
Definition discretization/pq1bubble/geometryhelper.hh:321
static Element::Geometry::LocalCoordinate localBoundaryScvfCenter(Dune::GeometryType type, unsigned int localFacetIndex, unsigned int indexInFace)
local boundary scvf center
Definition discretization/pq1bubble/geometryhelper.hh:440
PQ1BubbleDofHelper< GridView, 1 > DofHelper
Definition discretization/pq1bubble/geometryhelper.hh:191
ScvfCornerStorage getBoundaryScvfCorners(unsigned int localFacetIndex, unsigned int indexInFacet) const
Create the sub control volume face geometries on the boundary.
Definition discretization/pq1bubble/geometryhelper.hh:315
std::array< LocalIndexType, 2 > getScvPairForScvf(unsigned int localScvfIndex) const
Definition discretization/pq1bubble/geometryhelper.hh:390
GlobalPosition dofPosition(unsigned int localDofIdx) const
Definition discretization/pq1bubble/geometryhelper.hh:381
Dune::GeometryType getInteriorScvfGeometryType(unsigned int localScvfIdx) const
Definition discretization/pq1bubble/geometryhelper.hh:305
bool isOverlappingScv(unsigned int localScvIndex) const
Definition discretization/pq1bubble/geometryhelper.hh:425
Scalar scvVolume(unsigned int localScvIdx, const ScvCornerStorage &p) const
get scv volume
Definition discretization/pq1bubble/geometryhelper.hh:362
const Element::Geometry & elementGeometry() const
the wrapped element geometry
Definition discretization/pq1bubble/geometryhelper.hh:340
ScvfCornerStorage getScvfCorners(unsigned int localScvfIdx) const
Create a vector with the corners of sub control volume faces.
Definition discretization/pq1bubble/geometryhelper.hh:262
std::array< LocalIndexType, 2 > getScvPairForBoundaryScvf(unsigned int localFacetIndex, unsigned int localIsScvfIndex) const
Definition discretization/pq1bubble/geometryhelper.hh:405
static Element::Geometry::LocalCoordinate localScvfCenter(Dune::GeometryType type, unsigned int localScvfIdx)
local scvf center
Definition discretization/pq1bubble/geometryhelper.hh:434
ScvCornerStorage getScvCorners(unsigned int localScvIdx) const
Create a vector with the scv corners.
Definition discretization/pq1bubble/geometryhelper.hh:199
Dune::GeometryType getScvGeometryType(unsigned int localScvIdx) const
Definition discretization/pq1bubble/geometryhelper.hh:242
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:700
auto scvfUnitNormal(const ElementGeometry &geo, const CornerStorage &corners)
Unit normal of an interior sub-control volume face, up to sign.
Definition scvfnormal.hh:33
auto convexPolytopeVolume(Dune::GeometryType type, const CornerF &c)
Compute the volume of several common geometry types.
Definition volume.hh:41
Corners::value_type center(const Corners &corners)
The center of a given list of corners.
Definition center.hh:24
Class representing dofs on elements for control-volume finite element schemes.
Define some often used mathematical functions.
S keyToCornerStorage(const ReferenceElement &ref, Transformation &&trans, const std::array< T, N > &key)
Definition boxgeometryhelper.hh:233
Definition discretization/pq1bubble/geometryhelper.hh:54
Definition common/pdesolver.hh:24
Dof helper for the PQ1Bubble method, providing the number of dofs and their positions.
Normal vector of a sub-control volume face of an element-local dual grid.
static constexpr std::array< std::array< Key, 6 >, 1 > keys
Definition discretization/pq1bubble/geometryhelper.hh:99
std::pair< std::uint8_t, std::uint8_t > Key
Definition discretization/pq1bubble/geometryhelper.hh:98
std::pair< std::uint8_t, std::uint8_t > Key
Definition discretization/pq1bubble/geometryhelper.hh:62
static constexpr std::array< std::array< Key, 2 >, 1 > keys
Definition discretization/pq1bubble/geometryhelper.hh:63
static constexpr std::array< std::array< Key, 4 >, 1 > keys
Definition discretization/pq1bubble/geometryhelper.hh:81
std::pair< std::uint8_t, std::uint8_t > Key
Definition discretization/pq1bubble/geometryhelper.hh:80
static constexpr std::array< std::array< Key, 4 >, 1 > keys
Definition discretization/pq1bubble/geometryhelper.hh:90
std::pair< std::uint8_t, std::uint8_t > Key
Definition discretization/pq1bubble/geometryhelper.hh:89
static constexpr std::array< std::array< Key, 3 >, 1 > keys
Definition discretization/pq1bubble/geometryhelper.hh:72
std::pair< std::uint8_t, std::uint8_t > Key
Definition discretization/pq1bubble/geometryhelper.hh:71
Definition discretization/pq1bubble/geometryhelper.hh:57
std::pair< std::uint8_t, std::uint8_t > Key
Definition discretization/pq1bubble/geometryhelper.hh:155
static constexpr std::array< std::array< Key, 3 >, 8 > keys
Definition discretization/pq1bubble/geometryhelper.hh:156
static constexpr std::array< std::array< Key, 1 >, 1 > keys
Definition discretization/pq1bubble/geometryhelper.hh:112
std::pair< std::uint8_t, std::uint8_t > Key
Definition discretization/pq1bubble/geometryhelper.hh:111
std::pair< std::uint8_t, std::uint8_t > Key
Definition discretization/pq1bubble/geometryhelper.hh:131
static constexpr std::array< std::array< Key, 2 >, 4 > keys
Definition discretization/pq1bubble/geometryhelper.hh:132
static constexpr std::array< std::array< Key, 3 >, 4 > keys
Definition discretization/pq1bubble/geometryhelper.hh:144
std::pair< std::uint8_t, std::uint8_t > Key
Definition discretization/pq1bubble/geometryhelper.hh:143
static constexpr std::array< std::array< Key, 2 >, 3 > keys
Definition discretization/pq1bubble/geometryhelper.hh:121
std::pair< std::uint8_t, std::uint8_t > Key
Definition discretization/pq1bubble/geometryhelper.hh:120
Definition discretization/pq1bubble/geometryhelper.hh:106
Definition discretization/pq1bubble/geometryhelper.hh:48
Dune::ReservedVector< Dune::FieldVector< ct, cdim >,(1<< mydim)> Type
Definition discretization/pq1bubble/geometryhelper.hh:49
Traits for an efficient corner storage for the PQ1Bubble method.
Definition discretization/pq1bubble/geometryhelper.hh:42
Compute the volume of several common geometry types.