33inline auto scvfUnitNormal(
const ElementGeometry& geo,
const CornerStorage& corners)
35 using GlobalPosition =
typename ElementGeometry::GlobalCoordinate;
36 static constexpr int dim = ElementGeometry::mydimension;
37 static constexpr int dimWorld = ElementGeometry::coorddimension;
38 static_assert(dim > 1 && dim <= 3 && dimWorld <= 3);
40 const auto normalize = [](GlobalPosition n){ n /= n.two_norm();
return n; };
42 if constexpr (dim == 2 && dimWorld == 2)
45 else if constexpr (dim == 2 && dimWorld == 3)
49 GlobalPosition(geo.corner(1) - geo.corner(0)),
50 GlobalPosition(geo.corner(2) - geo.corner(0))
52 return normalize(
crossProduct(elementNormal, GlobalPosition(corners[1] - corners[0])));
57 GlobalPosition(corners[1] - corners[0]),
58 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:33