13#ifndef DUMUX_POROUSMEDIUMFLOW_BOXDFM_GEOMETRY_HELPER_HH
14#define DUMUX_POROUSMEDIUMFLOW_BOXDFM_GEOMETRY_HELPER_HH
16#include <dune/common/fvector.hh>
17#include <dune/common/reservedvector.hh>
18#include <dune/geometry/multilineargeometry.hh>
30 template<
int mydim,
int cdim >
33 using Type = Dune::ReservedVector< Dune::FieldVector< ct, cdim >, (1<<(mydim)) >;
40 static const bool v =
true;
41 static const unsigned int topologyId = Dune::GeometryTypes::cube(mydim).id();
46template<
class Gr
idView,
int dim,
class ScvType,
class ScvfType>
50template <
class Gr
idView,
class ScvType,
class ScvfType>
55 using Intersection =
typename GridView::Intersection;
56 using ScvfCornerStorage =
typename ScvfType::Traits::CornerStorage;
58 static constexpr auto dim = GridView::dimension;
59 using Scalar =
typename GridView::ctype;
64 using ParentType::ParentType;
71 const auto ref = referenceElement(geo);
72 return ScvfCornerStorage({ geo.global(ref.position(localFacetIndex, 1)) });
77 typename ScvfType::Traits::GlobalPosition
79 const Intersection& is,
80 unsigned int edgeIndexInIntersection)
const
83 const auto ref = referenceElement(geo);
84 const auto v0 = ref.subEntity(is.indexInInside(), 1, 0, dim);
85 const auto v1 = ref.subEntity(is.indexInInside(), 1, 1, dim);
86 auto normal = geo.corner(v1) - geo.corner(v0);
93template <
class Gr
idView,
class ScvType,
class ScvfType>
98 using Intersection =
typename GridView::Intersection;
99 using ScvfCornerStorage =
typename ScvfType::Traits::CornerStorage;
101 static constexpr auto dim = GridView::dimension;
102 static constexpr auto dimWorld = GridView::dimensionworld;
103 using Scalar =
typename GridView::ctype;
108 using ParentType::ParentType;
112 unsigned int indexInFacet)
const
114 constexpr int facetCodim = 1;
120 const auto& ref = referenceElement(geo);
121 const auto type = ref.type(localFacetIndex, facetCodim);
122 if (type == Dune::GeometryTypes::triangle)
126 localFacetIndex, facetCodim, Corners::keys[indexInFacet]);
129 else if (type == Dune::GeometryTypes::quadrilateral)
133 localFacetIndex, facetCodim, Corners::keys[indexInFacet]);
136 DUNE_THROW(Dune::NotImplemented,
"Box fracture scvf geometries for dim=" << dim
137 <<
" dimWorld=" << dimWorld
138 <<
" type=" << type);
142 typename ScvfType::Traits::GlobalPosition
144 const Intersection& is,
145 unsigned int edgeIndexInIntersection)
const
148 const auto refElement = referenceElement(geo);
151 typename ScvfType::Traits::GlobalPosition c[4];
153 const auto corners = refElement.size(is.indexInInside(), 1, dim);
154 for (
int i = 0; i < corners; ++i)
156 const auto vIdxLocal = refElement.subEntity(is.indexInInside(), 1, i, dim);
157 c[i] = geo.corner(vIdxLocal);
161 const auto gridEdge = [&] ()
166 if (edgeIndexInIntersection == 0)
return c[1]-c[0];
167 else if (edgeIndexInIntersection == 1)
return c[2]-c[0];
168 else if (edgeIndexInIntersection == 2)
return c[2]-c[1];
169 else DUNE_THROW(Dune::InvalidStateException,
"Invalid edge index");
171 else if (corners == 4)
173 if (edgeIndexInIntersection == 0)
return c[2]-c[0];
174 else if (edgeIndexInIntersection == 1)
return c[3]-c[1];
175 else if (edgeIndexInIntersection == 2)
return c[1]-c[0];
176 else if (edgeIndexInIntersection == 3)
return c[3]-c[2];
177 else DUNE_THROW(Dune::InvalidStateException,
"Invalid edge index");
180 DUNE_THROW(Dune::InvalidStateException,
"Invalid face geometry");
184 assert(scvfCorners.size() == 2);
185 const auto scvfEdge = scvfCorners[1]-scvfCorners[0];
Helper class constructing the dual grid finite volume geometries for the box discretizazion method.
ScvfCornerStorage getFractureScvfCorners(unsigned int localFacetIndex, unsigned int) const
Get the corners of the (d-1)-dimensional fracture scvf.
Definition porousmediumflow/boxdfm/geometryhelper.hh:67
ScvfType::Traits::GlobalPosition fractureNormal(const ScvfCornerStorage &p, const Intersection &is, unsigned int edgeIndexInIntersection) const
Definition porousmediumflow/boxdfm/geometryhelper.hh:78
ScvfCornerStorage getFractureScvfCorners(unsigned int localFacetIndex, unsigned int indexInFacet) const
Create the sub control volume face geometries on an intersection marked as fracture.
Definition porousmediumflow/boxdfm/geometryhelper.hh:111
ScvfType::Traits::GlobalPosition fractureNormal(const ScvfCornerStorage &scvfCorners, const Intersection &is, unsigned int edgeIndexInIntersection) const
get fracture scvf normal vector
Definition porousmediumflow/boxdfm/geometryhelper.hh:143
Create sub control volumes and sub control volume face geometries.
Definition porousmediumflow/boxdfm/geometryhelper.hh:47
std::enable_if< w==3, GlobalPosition >::type normal(const ScvfCornerStorage &scvfCorners, const std::array< LocalIndexType, 2 > &scvIndices) const
get scvf normal vector for dim == 2, dimworld == 3
Definition boxgeometryhelper.hh:492
BoxGeometryHelper(const typename Element::Geometry &geometry)
Definition boxgeometryhelper.hh:406
const Element::Geometry & elementGeometry() const
the wrapped element geometry
Definition boxgeometryhelper.hh:550
BoxGeometryHelper(const typename Element::Geometry &geometry)
Definition boxgeometryhelper.hh:593
const Element::Geometry & elementGeometry() const
the wrapped element geometry
Definition boxgeometryhelper.hh:733
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:671
S subEntityKeyToCornerStorage(const ReferenceElement &ref, Transformation &&trans, unsigned int i, unsigned int c, const std::array< T, N > &key)
Definition boxgeometryhelper.hh:247
Definition porousmediumflow/boxdfm/geometryhelper.hh:32
Dune::ReservedVector< Dune::FieldVector< ct, cdim >,(1<<(mydim)) > Type
Definition porousmediumflow/boxdfm/geometryhelper.hh:33
Definition porousmediumflow/boxdfm/geometryhelper.hh:39
static const bool v
Definition porousmediumflow/boxdfm/geometryhelper.hh:40
static const unsigned int topologyId
Definition porousmediumflow/boxdfm/geometryhelper.hh:41
Definition porousmediumflow/boxdfm/geometryhelper.hh:26
Definition boxgeometryhelper.hh:132