34inline auto scvfUnitNormal(
const ElementGeometry& geo,
const CornerStorage& corners)
36 using GlobalPosition =
typename ElementGeometry::GlobalCoordinate;
37 static constexpr int dim = ElementGeometry::mydimension;
38 static constexpr int dimWorld = ElementGeometry::coorddimension;
39 static_assert(dim >= 1 && dim <= 3 && dimWorld <= 3);
41 const auto normalize = [](GlobalPosition n){ n /= n.two_norm();
return n; };
43 if constexpr (dim == 1)
44 return normalize(GlobalPosition(geo.corner(1) - geo.corner(0)));
46 else if constexpr (dim == 2 && dimWorld == 2)
49 else if constexpr (dim == 2 && dimWorld == 3)
53 GlobalPosition(geo.corner(1) - geo.corner(0)),
54 GlobalPosition(geo.corner(2) - geo.corner(0))
56 return normalize(
crossProduct(elementNormal, GlobalPosition(corners[1] - corners[0])));
63 if (corners.size() == 4)
65 GlobalPosition(corners[3] - corners[0]),
66 GlobalPosition(corners[2] - corners[1])
70 GlobalPosition(corners[1] - corners[0]),
71 GlobalPosition(corners[2] - corners[0])
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
auto scvfUnitNormal(const ElementGeometry &geo, const CornerStorage &corners)
Unit normal of an interior sub-control volume face, up to sign.
Definition scvfnormal.hh:34