version 3.11-dev
Loading...
Searching...
No Matches
scvfnormal.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
12#ifndef DUMUX_DISCRETIZATION_SCVF_NORMAL_HH
13#define DUMUX_DISCRETIZATION_SCVF_NORMAL_HH
14
15#include <dumux/common/math.hh>
17
18namespace Dumux::Detail {
19
33template<class ElementGeometry, class CornerStorage>
34inline auto scvfUnitNormal(const ElementGeometry& geo, const CornerStorage& corners)
35{
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);
40
41 const auto normalize = [](GlobalPosition n){ n /= n.two_norm(); return n; };
42
43 if constexpr (dim == 1)
44 return normalize(GlobalPosition(geo.corner(1) - geo.corner(0)));
45
46 else if constexpr (dim == 2 && dimWorld == 2)
47 return Dumux::unitNormal(GlobalPosition(corners[1] - corners[0]));
48
49 else if constexpr (dim == 2 && dimWorld == 3)
50 {
51 // A segment's two corners do not determine the element plane.
52 const auto elementNormal = crossProduct(
53 GlobalPosition(geo.corner(1) - geo.corner(0)),
54 GlobalPosition(geo.corner(2) - geo.corner(0))
55 );
56 return normalize(crossProduct(elementNormal, GlobalPosition(corners[1] - corners[0])));
57 }
58
59 else
60 {
61 // mean normal of a possibly non-planar quadrilateral (lexicographic corner order):
62 // the direction of its vector area
63 if (corners.size() == 4)
64 return normalize(crossProduct(
65 GlobalPosition(corners[3] - corners[0]),
66 GlobalPosition(corners[2] - corners[1])
67 ));
68
69 return normalize(crossProduct(
70 GlobalPosition(corners[1] - corners[0]),
71 GlobalPosition(corners[2] - corners[0])
72 ));
73 }
74}
75
76} // end namespace Dumux::Detail
77
78#endif
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
Vector unitNormal(const Vector &v)
Create a vector normal to the given one (v is expected to be non-zero).
Definition normal.hh:58
Define some often used mathematical functions.
Definition cvfelocalresidual.hh:25
Helper functions for normals.