GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: /builds/dumux-repositories/dumux/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh
Date: 2024-05-04 19:09:25
Exec Total Coverage
Lines: 42 55 76.4%
Functions: 7 51 13.7%
Branches: 579 828 69.9%

Line Branch Exec Source
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-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5 // SPDX-License-Identifier: GPL-3.0-or-later
6 //
7 /*!
8 * \file
9 * \ingroup StaggeredDiscretization
10 * \copydoc Dumux::FreeFlowStaggeredSubControlVolumeFace
11 */
12 #ifndef DUMUX_DISCRETIZATION_STAGGERED_FREE_FLOW_SUBCONTROLVOLUMEFACE_HH
13 #define DUMUX_DISCRETIZATION_STAGGERED_FREE_FLOW_SUBCONTROLVOLUMEFACE_HH
14
15 #include <array>
16 #include <utility>
17 #include <dune/common/fvector.hh>
18 #include <dune/geometry/type.hh>
19 #include <dune/geometry/multilineargeometry.hh>
20
21 #include <dumux/common/indextraits.hh>
22 #include <dumux/discretization/subcontrolvolumefacebase.hh>
23 #include <dumux/discretization/staggered/subcontrolvolumeface.hh>
24 #include <dumux/discretization/staggered/freeflow/staggeredgeometryhelper.hh>
25
26 #include <typeinfo>
27
28 namespace Dumux {
29
30 /*!
31 * \ingroup StaggeredDiscretization
32 * \brief Default traits class to be used for the sub-control volume faces
33 * for the free-flow staggered finite volume scheme
34 * \tparam GridView the type of the grid view
35 * \tparam upwindSchemeOrder the order of the upwind scheme
36 */
37 template<class GridView, int upwindSchemeOrder>
38 struct FreeFlowStaggeredDefaultScvfGeometryTraits
39 {
40 using GridIndexType = typename IndexTraits<GridView>::GridIndex;
41 using LocalIndexType = typename IndexTraits<GridView>::LocalIndex;
42 using Scalar = typename GridView::ctype;
43 using GeometryHelper = FreeFlowStaggeredGeometryHelper<GridView, upwindSchemeOrder>;
44 using PairData = typename GeometryHelper::PairData;
45 using AxisData = typename GeometryHelper::AxisData;
46
47 using Grid = typename GridView::Grid;
48 static constexpr int dim = Grid::dimension;
49 static constexpr int dimWorld = Grid::dimensionworld;
50
51 using Element = typename GridView::template Codim<0>::Entity;
52 using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
53 using Geometry = Dune::AxisAlignedCubeGeometry<Scalar, dim-1, dimWorld>;
54 };
55
56 /*!
57 * \ingroup StaggeredDiscretization
58 * \brief Helper function to turn a given cell scvface into a fake boundary face
59 * \note This function is considered internal to staggered freeflow and may change or be deleted at any time without deprecation warning
60 */
61 template<class SubControlVolumeFace>
62 SubControlVolumeFace makeStaggeredBoundaryFace(const SubControlVolumeFace& scvf,
63 const typename SubControlVolumeFace::GlobalPosition& newCenter)
64 {
65
0/9
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
17556502 auto bf = scvf;
66 35113004 bf.setCenter(newCenter);
67 35113004 bf.setBoundary(true);
68 35113004 bf.setIsGhostFace(true);
69 return bf;
70 }
71
72 /*!
73 * \ingroup StaggeredDiscretization
74 * \brief Class for a sub control volume face in the staggered method, i.e a part of the boundary
75 * of a sub control volume we compute fluxes on. This is a specialization for free flow models.
76 */
77 template<class GV,
78 int upwindSchemeOrder,
79 class T = FreeFlowStaggeredDefaultScvfGeometryTraits<GV, upwindSchemeOrder>>
80
11/51
✓ Branch 0 taken 8221471 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 8279151 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5348 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 66332 times.
✓ Branch 9 taken 475352 times.
✓ Branch 10 taken 508848 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1698 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 49424 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✓ Branch 34 taken 24720 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 6400 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 277824 times.
✗ Branch 50 not taken.
35827788 class FreeFlowStaggeredSubControlVolumeFace
81 : public SubControlVolumeFaceBase<FreeFlowStaggeredSubControlVolumeFace<GV, upwindSchemeOrder, T>, T>
82 {
83 using ThisType = FreeFlowStaggeredSubControlVolumeFace<GV, upwindSchemeOrder, T>;
84 using ParentType = SubControlVolumeFaceBase<ThisType, T>;
85 using Geometry = typename T::Geometry;
86 using GridIndexType = typename IndexTraits<GV>::GridIndex;
87 using LocalIndexType = typename IndexTraits<GV>::LocalIndex;
88
89 using PairData = typename T::PairData;
90 using AxisData = typename T::AxisData;
91
92 using Scalar = typename T::Scalar;
93 static const int dim = GV::dimension;
94
95 static constexpr int numPairs = 2 * (dim - 1);
96
97 static constexpr bool useHigherOrder = upwindSchemeOrder > 1;
98
99 public:
100 using GlobalPosition = typename T::GlobalPosition;
101
102 static constexpr int numCornersPerFace = 2 * (dim - 1);
103
104 //! State the traits public and thus export all types
105 using Traits = T;
106
107 // The default constructor
108 FreeFlowStaggeredSubControlVolumeFace() = default;
109
110 //! Constructor with intersection
111 template <class Intersection>
112 382738 FreeFlowStaggeredSubControlVolumeFace(const Intersection& is,
113 const typename Intersection::Geometry& isGeometry,
114 GridIndexType scvfIndex,
115 const std::vector<GridIndexType>& scvIndices,
116 const typename T::GeometryHelper& geometryHelper)
117 : ParentType(),
118 area_(isGeometry.volume()),
119 center_(isGeometry.center()),
120 unitOuterNormal_(is.centerUnitOuterNormal()),
121 scvfIndex_(scvfIndex),
122 scvIndices_(scvIndices),
123 boundary_(is.boundary()),
124 axisData_(geometryHelper.axisData()),
125 1148214 pairData_(std::move(geometryHelper.pairData())),
126 localFaceIdx_(geometryHelper.localFaceIndex()),
127 dirIdx_(geometryHelper.directionIndex()),
128 382738 outerNormalSign_(sign(unitOuterNormal_[directionIndex()])),
129
4/5
✓ Branch 0 taken 2250 times.
✓ Branch 1 taken 354738 times.
✓ Branch 2 taken 28000 times.
✓ Branch 3 taken 750 times.
✗ Branch 4 not taken.
2672166 isGhostFace_(false)
130 {
131 766976 dimensions[0] = (isGeometry.corner(1) - isGeometry.corner(0)).two_norm();
132 if constexpr (dim == 3)
133 2250 dimensions[1] = (isGeometry.corner(2) - isGeometry.corner(0)).two_norm();
134 382738 }
135
136 //! The center of the sub control volume face
137 const GlobalPosition& center() const
138 {
139
28/91
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 9960 times.
✓ Branch 11 taken 29170 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 10 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1407912 times.
✓ Branch 16 taken 241964 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 10 times.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 25 taken 10 times.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 31 taken 10 times.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✓ Branch 37 taken 10 times.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✓ Branch 43 taken 10 times.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✓ Branch 49 taken 10 times.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✓ Branch 55 taken 10 times.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 61 taken 10 times.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✓ Branch 67 taken 10 times.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✓ Branch 73 taken 10 times.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✓ Branch 79 taken 10 times.
✗ Branch 80 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✓ Branch 85 taken 10 times.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✓ Branch 91 taken 10 times.
✗ Branch 92 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✓ Branch 97 taken 10 times.
✗ Branch 98 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✓ Branch 103 taken 10 times.
✗ Branch 104 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✓ Branch 109 taken 10 times.
✗ Branch 110 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✓ Branch 115 taken 10 times.
✗ Branch 116 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✓ Branch 121 taken 5 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 5 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 5 times.
✗ Branch 128 not taken.
✓ Branch 130 taken 5 times.
✗ Branch 131 not taken.
440468119 return center_;
140 }
141
142 //! The position of the dof living on the face
143 const GlobalPosition& dofPosition() const
144 {
145
2/2
✓ Branch 0 taken 864004 times.
✓ Branch 1 taken 1318948 times.
2377122 return center_;
146 }
147
148 //! The integration point for flux evaluations in global coordinates
149 const GlobalPosition& ipGlobal() const
150 {
151 // Return center for now
152
5/14
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 11928 times.
✓ Branch 5 taken 2940 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5976 times.
✓ Branch 11 taken 1488 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
605595586 return center_;
153 }
154
155 //! The area of the sub control volume face
156 Scalar area() const
157 {
158 return area_;
159 }
160
161 //! Returns boolean if the sub control volume face is on the boundary
162 bool boundary() const
163 {
164 return boundary_;
165 }
166
167 //! The unit outer normal vector
168 const GlobalPosition& unitOuterNormal() const
169 {
170 3156 return unitOuterNormal_;
171 }
172
173 //! Index of the inside sub control volume for spatial param evaluation
174 GridIndexType insideScvIdx() const
175 {
176
44/60
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 100 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 53878 times.
✓ Branch 10 taken 238649320 times.
✓ Branch 11 taken 42339956 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3895197 times.
✓ Branch 14 taken 16260347 times.
✓ Branch 15 taken 136410954 times.
✓ Branch 16 taken 30090346 times.
✓ Branch 17 taken 50151603 times.
✓ Branch 18 taken 28291040 times.
✓ Branch 19 taken 1396464 times.
✓ Branch 20 taken 613554 times.
✓ Branch 21 taken 17333007 times.
✓ Branch 22 taken 25113700 times.
✓ Branch 23 taken 50300854 times.
✓ Branch 24 taken 59122888 times.
✓ Branch 25 taken 33517104 times.
✓ Branch 26 taken 57161402 times.
✓ Branch 27 taken 6727046 times.
✓ Branch 28 taken 27029146 times.
✓ Branch 29 taken 14279742 times.
✓ Branch 30 taken 6813298 times.
✓ Branch 31 taken 3300 times.
✓ Branch 32 taken 3000 times.
✓ Branch 33 taken 936652 times.
✓ Branch 34 taken 14231788 times.
✓ Branch 35 taken 6800 times.
✓ Branch 36 taken 4608 times.
✓ Branch 37 taken 244460 times.
✓ Branch 38 taken 3600 times.
✓ Branch 39 taken 507716 times.
✓ Branch 40 taken 6173968 times.
✓ Branch 41 taken 524008 times.
✓ Branch 42 taken 449712 times.
✓ Branch 43 taken 141504 times.
✓ Branch 44 taken 168424 times.
✓ Branch 45 taken 186768 times.
✓ Branch 46 taken 52940 times.
✓ Branch 47 taken 69580 times.
✓ Branch 48 taken 152440 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 8400 times.
✓ Branch 51 taken 99120 times.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 5340 times.
✓ Branch 58 taken 55860 times.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
4881054737 return scvIndices_[0];
177 }
178
179 //! index of the outside sub control volume for spatial param evaluation
180 GridIndexType outsideScvIdx() const
181 {
182
30/50
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 53898 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 20 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 20 times.
✓ Branch 13 taken 59452 times.
✓ Branch 14 taken 17860 times.
✓ Branch 15 taken 85588 times.
✓ Branch 16 taken 21140 times.
✓ Branch 17 taken 210756 times.
✓ Branch 18 taken 52676 times.
✓ Branch 19 taken 182196 times.
✓ Branch 20 taken 20 times.
✓ Branch 21 taken 11940 times.
✓ Branch 22 taken 63440 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 20 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 20 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 20 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 20 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 20 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 20 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 20 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 20 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 20 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 20 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 20 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 20 times.
✗ Branch 47 not taken.
✓ Branch 50 taken 80 times.
✗ Branch 51 not taken.
2652071857 return scvIndices_[1];
183 }
184
185 //! The global index of this sub control volume face
186 GridIndexType index() const
187 {
188 return scvfIndex_;
189 }
190
191 //! The local index of this sub control volume face
192 LocalIndexType localFaceIdx() const
193 {
194
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 41365652 times.
✓ Branch 5 taken 372400 times.
✗ Branch 6 not taken.
95495582 return localFaceIdx_;
195 }
196
197 //! Returns the direction index of the facet (0 = x, 1 = y, 2 = z)
198 unsigned int directionIndex() const
199 {
200 return dirIdx_;
201 }
202
203 //! Returns whether the unitNormal of the face points in positive coordinate direction
204 bool normalInPosCoordDir() const
205 {
206
2/2
✓ Branch 0 taken 142268872 times.
✓ Branch 1 taken 142615596 times.
284884468 return directionSign() > 0;
207 }
208
209 //! Returns the sign of the unit outer normal's vector
210 int directionSign() const
211 {
212 return outerNormalSign_;
213 }
214
215 //! Returns the data for one sub face
216 const PairData& pairData(const int idx) const
217 {
218
30/63
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 48 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 48 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 96 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 96 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 96 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 96 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 53878 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 400406 times.
✓ Branch 29 taken 280642748 times.
✓ Branch 30 taken 346528 times.
✓ Branch 31 taken 280642748 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 3895192 times.
✓ Branch 36 taken 49 times.
✓ Branch 37 taken 289801103 times.
✓ Branch 38 taken 49 times.
✓ Branch 39 taken 285905911 times.
✓ Branch 42 taken 2 times.
✓ Branch 43 taken 3895190 times.
✓ Branch 44 taken 10881848 times.
✓ Branch 45 taken 207594792 times.
✓ Branch 46 taken 10881846 times.
✓ Branch 47 taken 203699602 times.
✓ Branch 48 taken 3703040 times.
✓ Branch 49 taken 68962968 times.
✓ Branch 50 taken 3769372 times.
✓ Branch 51 taken 72791828 times.
✓ Branch 52 taken 66332 times.
✓ Branch 53 taken 3828860 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
3787605140 return pairData_[idx];
219 }
220
221 //! Return an array of all pair data
222 const std::array<PairData, numPairs>& pairData() const
223 {
224
54/54
✓ Branch 0 taken 2808690 times.
✓ Branch 1 taken 142762694 times.
✓ Branch 2 taken 154601632 times.
✓ Branch 3 taken 77300816 times.
✓ Branch 4 taken 137380 times.
✓ Branch 5 taken 1822364 times.
✓ Branch 20 taken 400 times.
✓ Branch 21 taken 200 times.
✓ Branch 22 taken 400 times.
✓ Branch 23 taken 200 times.
✓ Branch 24 taken 400 times.
✓ Branch 25 taken 200 times.
✓ Branch 26 taken 400 times.
✓ Branch 27 taken 200 times.
✓ Branch 28 taken 400 times.
✓ Branch 29 taken 200 times.
✓ Branch 30 taken 400 times.
✓ Branch 31 taken 200 times.
✓ Branch 32 taken 400 times.
✓ Branch 33 taken 200 times.
✓ Branch 34 taken 400 times.
✓ Branch 35 taken 200 times.
✓ Branch 36 taken 400 times.
✓ Branch 37 taken 200 times.
✓ Branch 38 taken 400 times.
✓ Branch 39 taken 200 times.
✓ Branch 40 taken 400 times.
✓ Branch 41 taken 200 times.
✓ Branch 42 taken 400 times.
✓ Branch 43 taken 200 times.
✓ Branch 44 taken 400 times.
✓ Branch 45 taken 200 times.
✓ Branch 46 taken 400 times.
✓ Branch 47 taken 200 times.
✓ Branch 48 taken 400 times.
✓ Branch 49 taken 200 times.
✓ Branch 50 taken 400 times.
✓ Branch 51 taken 200 times.
✓ Branch 52 taken 400 times.
✓ Branch 53 taken 200 times.
✓ Branch 54 taken 400 times.
✓ Branch 55 taken 200 times.
✓ Branch 56 taken 400 times.
✓ Branch 57 taken 200 times.
✓ Branch 58 taken 400 times.
✓ Branch 59 taken 200 times.
✓ Branch 60 taken 400 times.
✓ Branch 61 taken 200 times.
✓ Branch 62 taken 400 times.
✓ Branch 63 taken 200 times.
✓ Branch 64 taken 400 times.
✓ Branch 65 taken 200 times.
✓ Branch 66 taken 400 times.
✓ Branch 67 taken 200 times.
381152284 return pairData_;
225 }
226
227 //! Return an array of all pair data
228 const AxisData& axisData() const
229 {
230 return axisData_;
231 }
232
233 //! Returns true if the face is a ghost face
234 bool isGhostFace() const
235 {
236 return isGhostFace_;
237 }
238
239 //! Returns the length of the face in a certain direction (adaptation of area() for 3d)
240 Scalar faceLength(const int localSubFaceIdx) const
241 {
242 48 if (dim == 3 && localSubFaceIdx > 1)
243 48 return dimensions[1];
244 else
245 582688770 return dimensions[0];
246 }
247
248 /*!
249 * \brief Check if the face has a parallel neighbor
250 *
251 * \param localSubFaceIdx The local index of the subface
252 * \param parallelDegreeIdx The index describing how many faces away from the self face
253 */
254 bool hasParallelNeighbor(const int localSubFaceIdx, const int parallelDegreeIdx) const
255 {
256
144/144
✓ Branch 0 taken 12564563 times.
✓ Branch 1 taken 253696104 times.
✓ Branch 2 taken 12564563 times.
✓ Branch 3 taken 253696104 times.
✓ Branch 4 taken 12564563 times.
✓ Branch 5 taken 253696104 times.
✓ Branch 6 taken 8237133 times.
✓ Branch 7 taken 144751331 times.
✓ Branch 8 taken 8237133 times.
✓ Branch 9 taken 144751331 times.
✓ Branch 10 taken 8237133 times.
✓ Branch 11 taken 144751331 times.
✓ Branch 12 taken 3828940 times.
✓ Branch 13 taken 21417 times.
✓ Branch 14 taken 3828940 times.
✓ Branch 15 taken 21417 times.
✓ Branch 16 taken 3828940 times.
✓ Branch 17 taken 21417 times.
✓ Branch 18 taken 21177 times.
✓ Branch 19 taken 320 times.
✓ Branch 20 taken 21177 times.
✓ Branch 21 taken 320 times.
✓ Branch 22 taken 21177 times.
✓ Branch 23 taken 320 times.
✓ Branch 24 taken 1616184 times.
✓ Branch 25 taken 38097 times.
✓ Branch 26 taken 1616184 times.
✓ Branch 27 taken 38097 times.
✓ Branch 28 taken 1616184 times.
✓ Branch 29 taken 38097 times.
✓ Branch 30 taken 2115833 times.
✓ Branch 31 taken 54198 times.
✓ Branch 32 taken 2115833 times.
✓ Branch 33 taken 54198 times.
✓ Branch 34 taken 2115833 times.
✓ Branch 35 taken 54198 times.
✓ Branch 36 taken 45315 times.
✓ Branch 37 taken 2171845 times.
✓ Branch 38 taken 45315 times.
✓ Branch 39 taken 2171845 times.
✓ Branch 40 taken 45315 times.
✓ Branch 41 taken 2171845 times.
✓ Branch 42 taken 6393416 times.
✓ Branch 43 taken 190984 times.
✓ Branch 44 taken 6393416 times.
✓ Branch 45 taken 190984 times.
✓ Branch 46 taken 6393416 times.
✓ Branch 47 taken 190984 times.
✓ Branch 48 taken 80 times.
✓ Branch 49 taken 320 times.
✓ Branch 50 taken 80 times.
✓ Branch 51 taken 320 times.
✓ Branch 52 taken 80 times.
✓ Branch 53 taken 320 times.
✓ Branch 54 taken 80 times.
✓ Branch 55 taken 320 times.
✓ Branch 56 taken 80 times.
✓ Branch 57 taken 320 times.
✓ Branch 58 taken 80 times.
✓ Branch 59 taken 320 times.
✓ Branch 60 taken 80 times.
✓ Branch 61 taken 320 times.
✓ Branch 62 taken 80 times.
✓ Branch 63 taken 320 times.
✓ Branch 64 taken 80 times.
✓ Branch 65 taken 320 times.
✓ Branch 66 taken 80 times.
✓ Branch 67 taken 320 times.
✓ Branch 68 taken 80 times.
✓ Branch 69 taken 320 times.
✓ Branch 70 taken 80 times.
✓ Branch 71 taken 320 times.
✓ Branch 72 taken 80 times.
✓ Branch 73 taken 320 times.
✓ Branch 74 taken 80 times.
✓ Branch 75 taken 320 times.
✓ Branch 76 taken 80 times.
✓ Branch 77 taken 320 times.
✓ Branch 78 taken 80 times.
✓ Branch 79 taken 320 times.
✓ Branch 80 taken 80 times.
✓ Branch 81 taken 320 times.
✓ Branch 82 taken 80 times.
✓ Branch 83 taken 320 times.
✓ Branch 84 taken 80 times.
✓ Branch 85 taken 320 times.
✓ Branch 86 taken 80 times.
✓ Branch 87 taken 320 times.
✓ Branch 88 taken 80 times.
✓ Branch 89 taken 320 times.
✓ Branch 90 taken 80 times.
✓ Branch 91 taken 320 times.
✓ Branch 92 taken 80 times.
✓ Branch 93 taken 320 times.
✓ Branch 94 taken 80 times.
✓ Branch 95 taken 320 times.
✓ Branch 96 taken 80 times.
✓ Branch 97 taken 320 times.
✓ Branch 98 taken 80 times.
✓ Branch 99 taken 320 times.
✓ Branch 100 taken 80 times.
✓ Branch 101 taken 320 times.
✓ Branch 102 taken 80 times.
✓ Branch 103 taken 320 times.
✓ Branch 104 taken 80 times.
✓ Branch 105 taken 320 times.
✓ Branch 106 taken 80 times.
✓ Branch 107 taken 320 times.
✓ Branch 108 taken 80 times.
✓ Branch 109 taken 320 times.
✓ Branch 110 taken 80 times.
✓ Branch 111 taken 320 times.
✓ Branch 112 taken 80 times.
✓ Branch 113 taken 320 times.
✓ Branch 114 taken 80 times.
✓ Branch 115 taken 320 times.
✓ Branch 116 taken 80 times.
✓ Branch 117 taken 320 times.
✓ Branch 118 taken 80 times.
✓ Branch 119 taken 320 times.
✓ Branch 120 taken 80 times.
✓ Branch 121 taken 320 times.
✓ Branch 122 taken 80 times.
✓ Branch 123 taken 320 times.
✓ Branch 124 taken 80 times.
✓ Branch 125 taken 320 times.
✓ Branch 126 taken 80 times.
✓ Branch 127 taken 320 times.
✓ Branch 128 taken 80 times.
✓ Branch 129 taken 320 times.
✓ Branch 130 taken 80 times.
✓ Branch 131 taken 320 times.
✓ Branch 132 taken 80 times.
✓ Branch 133 taken 320 times.
✓ Branch 134 taken 80 times.
✓ Branch 135 taken 320 times.
✓ Branch 136 taken 80 times.
✓ Branch 137 taken 320 times.
✓ Branch 138 taken 80 times.
✓ Branch 139 taken 320 times.
✓ Branch 140 taken 80 times.
✓ Branch 141 taken 320 times.
✓ Branch 142 taken 80 times.
✓ Branch 143 taken 320 times.
1307259771 return pairData(localSubFaceIdx).hasParallelNeighbor[parallelDegreeIdx];
257 }
258
259 /*!
260 * \brief Check if the face has a half parallel neighbor
261 *
262 * \param localSubFaceIdx The local index of the subface
263 *
264 * ------------
265 * | |
266 * | |
267 * | |
268 * -----------------------
269 * | yyyyyyyy s |
270 * | yyyyyyyy s |
271 * | yyyyyyyy s |
272 * -----------------------
273 * In this corner geometry, hasParallelNeighbor will return true for subcontrolvolumeface s belonging to the
274 * element filled by 'y's, but hasParallelNeighbor will return false for the subcontrolvolumeface that has the
275 * same dofIndex. We name this situation hasHalfParallelNeighbor.
276 */
277 bool hasHalfParallelNeighbor(const int localSubFaceIdx) const
278 {
279
14/20
✓ Branch 0 taken 10696 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10696 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10696 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 10696 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 266260267 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 266260267 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3823512 times.
✓ Branch 13 taken 5348 times.
✓ Branch 14 taken 3823512 times.
✓ Branch 15 taken 5348 times.
✓ Branch 16 taken 21097 times.
✓ Branch 17 taken 5348 times.
✓ Branch 18 taken 21097 times.
✓ Branch 19 taken 5348 times.
540263232 return pairData(localSubFaceIdx).hasHalfParallelNeighbor;
280 }
281
282 /*!
283 * \brief Check if the face has a corner parallel neighbor
284 *
285 * \param localSubFaceIdx The local index of the subface
286 *
287 * ------------
288 * | yyyyyyyy s
289 * | yyyyyyyy s
290 * | yyyyyyyy s
291 * -----------------------
292 * | | |
293 * | | |
294 * | | |
295 * -----------------------
296 * In this corner geometry, hasParallelNeighbor will return true for subcontrolvolumeface s belonging to the
297 * element filled by 'y's. However, as there also might be a boundary velocity value known at the corner, which
298 * can be used instead of the standard parallel velocity in some cases, we want to identify this situation. We
299 * name it cornerParallelNeighbor.
300 */
301 bool hasCornerParallelNeighbor(const int localSubFaceIdx) const
302 {
303
6/20
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 266260267 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 266260267 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3823512 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3823512 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 21097 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 21097 times.
540209752 return pairData(localSubFaceIdx).hasCornerParallelNeighbor;
304 }
305
306 /*!
307 * \brief Check if the face has an outer normal neighbor
308 *
309 * \param localSubFaceIdx The local index of the subface
310 */
311 bool hasOuterLateral(const int localSubFaceIdx) const
312 {
313
96/96
✓ Branch 0 taken 147416200 times.
✓ Branch 1 taken 7185832 times.
✓ Branch 2 taken 147416200 times.
✓ Branch 3 taken 7185832 times.
✓ Branch 4 taken 320 times.
✓ Branch 5 taken 80 times.
✓ Branch 6 taken 320 times.
✓ Branch 7 taken 80 times.
✓ Branch 8 taken 320 times.
✓ Branch 9 taken 80 times.
✓ Branch 10 taken 320 times.
✓ Branch 11 taken 80 times.
✓ Branch 12 taken 320 times.
✓ Branch 13 taken 80 times.
✓ Branch 14 taken 320 times.
✓ Branch 15 taken 80 times.
✓ Branch 16 taken 320 times.
✓ Branch 17 taken 80 times.
✓ Branch 18 taken 320 times.
✓ Branch 19 taken 80 times.
✓ Branch 20 taken 320 times.
✓ Branch 21 taken 80 times.
✓ Branch 22 taken 320 times.
✓ Branch 23 taken 80 times.
✓ Branch 24 taken 320 times.
✓ Branch 25 taken 80 times.
✓ Branch 26 taken 320 times.
✓ Branch 27 taken 80 times.
✓ Branch 28 taken 320 times.
✓ Branch 29 taken 80 times.
✓ Branch 30 taken 320 times.
✓ Branch 31 taken 80 times.
✓ Branch 32 taken 320 times.
✓ Branch 33 taken 80 times.
✓ Branch 34 taken 320 times.
✓ Branch 35 taken 80 times.
✓ Branch 36 taken 320 times.
✓ Branch 37 taken 80 times.
✓ Branch 38 taken 320 times.
✓ Branch 39 taken 80 times.
✓ Branch 40 taken 320 times.
✓ Branch 41 taken 80 times.
✓ Branch 42 taken 320 times.
✓ Branch 43 taken 80 times.
✓ Branch 44 taken 320 times.
✓ Branch 45 taken 80 times.
✓ Branch 46 taken 320 times.
✓ Branch 47 taken 80 times.
✓ Branch 48 taken 320 times.
✓ Branch 49 taken 80 times.
✓ Branch 50 taken 320 times.
✓ Branch 51 taken 80 times.
✓ Branch 52 taken 320 times.
✓ Branch 53 taken 80 times.
✓ Branch 54 taken 320 times.
✓ Branch 55 taken 80 times.
✓ Branch 56 taken 320 times.
✓ Branch 57 taken 80 times.
✓ Branch 58 taken 320 times.
✓ Branch 59 taken 80 times.
✓ Branch 60 taken 320 times.
✓ Branch 61 taken 80 times.
✓ Branch 62 taken 320 times.
✓ Branch 63 taken 80 times.
✓ Branch 64 taken 320 times.
✓ Branch 65 taken 80 times.
✓ Branch 66 taken 320 times.
✓ Branch 67 taken 80 times.
✓ Branch 68 taken 320 times.
✓ Branch 69 taken 80 times.
✓ Branch 70 taken 320 times.
✓ Branch 71 taken 80 times.
✓ Branch 72 taken 320 times.
✓ Branch 73 taken 80 times.
✓ Branch 74 taken 320 times.
✓ Branch 75 taken 80 times.
✓ Branch 76 taken 320 times.
✓ Branch 77 taken 80 times.
✓ Branch 78 taken 320 times.
✓ Branch 79 taken 80 times.
✓ Branch 80 taken 320 times.
✓ Branch 81 taken 80 times.
✓ Branch 82 taken 320 times.
✓ Branch 83 taken 80 times.
✓ Branch 84 taken 320 times.
✓ Branch 85 taken 80 times.
✓ Branch 86 taken 320 times.
✓ Branch 87 taken 80 times.
✓ Branch 88 taken 320 times.
✓ Branch 89 taken 80 times.
✓ Branch 90 taken 320 times.
✓ Branch 91 taken 80 times.
✓ Branch 92 taken 320 times.
✓ Branch 93 taken 80 times.
✓ Branch 94 taken 320 times.
✓ Branch 95 taken 80 times.
309222464 return pairData(localSubFaceIdx).hasOuterLateral;
314 }
315
316 /*!
317 * \brief Check if the face has a backward neighbor
318 *
319 * \param backwardIdx The index describing how many faces backward this dof is from the opposite face
320 */
321 template<bool enable = useHigherOrder, std::enable_if_t<enable, int> = 0>
322 bool hasBackwardNeighbor(const int backwardIdx) const
323 {
324
4/8
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 33266 times.
✓ Branch 5 taken 1612734 times.
✓ Branch 6 taken 33266 times.
✓ Branch 7 taken 1612734 times.
5006040 return axisData().hasBackwardNeighbor[backwardIdx];
325 }
326
327 /*!
328 * \brief Check if the face has a forward neighbor
329 *
330 * \param forwardIdx The index describing how many faces forward this dof is of the self face
331 */
332 template<bool enable = useHigherOrder, std::enable_if_t<enable, int> = 0>
333 bool hasForwardNeighbor(const int forwardIdx) const
334 {
335
4/8
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 27666 times.
✓ Branch 5 taken 1618334 times.
✓ Branch 6 taken 27666 times.
✓ Branch 7 taken 1618334 times.
5473152 return axisData().hasForwardNeighbor[forwardIdx];
336 }
337
338 //! Returns the dof of the face
339 GridIndexType dofIndex() const
340 {
341
71/79
✓ Branch 0 taken 4864 times.
✓ Branch 1 taken 32492 times.
✓ Branch 2 taken 3843540 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3945776 times.
✓ Branch 6 taken 1496000 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 155648 times.
✓ Branch 9 taken 1570144 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1024 times.
✓ Branch 13 taken 8678688 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 283200 times.
✓ Branch 16 taken 8679712 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 58765 times.
✓ Branch 19 taken 336835 times.
✓ Branch 20 taken 10150 times.
✓ Branch 21 taken 11362 times.
✓ Branch 22 taken 267288 times.
✓ Branch 23 taken 1452544 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2419200 times.
✓ Branch 26 taken 1452544 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2424000 times.
✓ Branch 29 taken 196 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 5360 times.
✓ Branch 32 taken 196 times.
✓ Branch 33 taken 60 times.
✓ Branch 34 taken 22720 times.
✓ Branch 35 taken 18388 times.
✓ Branch 36 taken 22160 times.
✓ Branch 37 taken 18388 times.
✓ Branch 38 taken 40 times.
✓ Branch 39 taken 60 times.
✓ Branch 40 taken 40 times.
✓ Branch 41 taken 60 times.
✓ Branch 42 taken 40 times.
✓ Branch 43 taken 60 times.
✓ Branch 44 taken 40 times.
✓ Branch 45 taken 60 times.
✓ Branch 46 taken 40 times.
✓ Branch 47 taken 60 times.
✓ Branch 48 taken 40 times.
✓ Branch 49 taken 60 times.
✓ Branch 50 taken 40 times.
✓ Branch 51 taken 60 times.
✓ Branch 52 taken 40 times.
✓ Branch 53 taken 60 times.
✓ Branch 54 taken 40 times.
✓ Branch 55 taken 60 times.
✓ Branch 56 taken 40 times.
✓ Branch 57 taken 60 times.
✓ Branch 58 taken 40 times.
✓ Branch 59 taken 60 times.
✓ Branch 60 taken 40 times.
✓ Branch 61 taken 60 times.
✓ Branch 62 taken 40 times.
✓ Branch 63 taken 60 times.
✓ Branch 64 taken 40 times.
✓ Branch 65 taken 60 times.
✓ Branch 66 taken 40 times.
✓ Branch 67 taken 60 times.
✓ Branch 68 taken 40 times.
✓ Branch 69 taken 60 times.
✓ Branch 70 taken 40 times.
✓ Branch 71 taken 60 times.
✓ Branch 72 taken 40 times.
✓ Branch 73 taken 60 times.
✓ Branch 74 taken 40 times.
✓ Branch 75 taken 60 times.
✓ Branch 76 taken 40 times.
✓ Branch 77 taken 60 times.
✓ Branch 78 taken 40 times.
✓ Branch 79 taken 60 times.
✓ Branch 80 taken 40 times.
121776452 return axisData().selfDof;
342 }
343
344 //! Returns the dof of the opposing face
345 GridIndexType dofIndexOpposingFace() const
346 {
347
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
77305628 return axisData().oppositeDof;
348 }
349
350 //! Returns the dof the first forward face
351 GridIndexType dofIndexForwardFace() const
352 {
353 return axisData().inAxisForwardDofs[0];
354 }
355
356 //! Returns the dof of the first backward face
357 GridIndexType dofIndexBackwardFace() const
358 {
359 return axisData().inAxisBackwardDofs[0];
360 }
361
362 //! Returns the distance between the face and the opposite one
363 Scalar selfToOppositeDistance() const
364 {
365
2/3
✓ Branch 0 taken 51 times.
✓ Branch 1 taken 145571285 times.
✗ Branch 2 not taken.
147496480 return axisData().selfToOppositeDistance;
366 }
367
368 /*!
369 * \brief Returns the distance between the parallel dofs
370 *
371 * \param localSubFaceIdx The local index of the subface
372 * \param parallelDegreeIdx The index describing how many faces away from the self
373 */
374 96 Scalar parallelDofsDistance(const int localSubFaceIdx, const int parallelDegreeIdx) const
375 {
376
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 48 times.
96 if (parallelDegreeIdx == 0)
377
16/16
✓ Branch 0 taken 21121 times.
✓ Branch 1 taken 1657359 times.
✓ Branch 2 taken 21097 times.
✓ Branch 3 taken 1657335 times.
✓ Branch 4 taken 21097 times.
✓ Branch 5 taken 1657335 times.
✓ Branch 6 taken 21097 times.
✓ Branch 7 taken 1657335 times.
✓ Branch 8 taken 21097 times.
✓ Branch 9 taken 1657335 times.
✓ Branch 10 taken 21097 times.
✓ Branch 11 taken 1657335 times.
✓ Branch 12 taken 21097 times.
✓ Branch 13 taken 1657335 times.
✓ Branch 14 taken 21097 times.
✓ Branch 15 taken 1657335 times.
1149796868 return (faceLength(localSubFaceIdx) + pairData(localSubFaceIdx).parallelCellWidths[0]) * 0.5;
378 // pairData(localSubFaceIdx).parallelCellWidths[0]) will return 0.0 if the subface perpendicular the scvf lies on a boundary
379 else
380 {
381
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
48 assert((parallelDegreeIdx == 1) && "Only the width of the first two parallel cells (indices 0 and 1) is stored for each scvf.");
382 10857865 return (pairData(localSubFaceIdx).parallelCellWidths[0] + pairData(localSubFaceIdx).parallelCellWidths[1]) * 0.5;
383 }
384 }
385
386 //! set the center to a different position
387 void setCenter(const GlobalPosition& center)
388 17556502 { center_ = center; }
389
390 //! set the boundary flag
391 void setBoundary(bool boundaryFlag)
392 17556502 { boundary_ = boundaryFlag; }
393
394 //! set the ghost face flag
395 void setIsGhostFace(bool isGhostFaceFlag)
396
5/21
✗ Branch 0 not taken.
✓ Branch 1 taken 120800 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 11928 times.
✓ Branch 5 taken 2940 times.
✓ Branch 6 taken 508848 times.
✓ Branch 7 taken 289112 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
17556502 { isGhostFace_ = isGhostFaceFlag; }
397
398 private:
399 std::array<Scalar, dim-1> dimensions;
400 Scalar area_;
401 GlobalPosition center_;
402 GlobalPosition unitOuterNormal_;
403 GridIndexType scvfIndex_;
404 std::vector<GridIndexType> scvIndices_;
405 bool boundary_;
406
407 Scalar selfToOppositeDistance_;
408 AxisData axisData_;
409 std::array<PairData, numPairs> pairData_;
410
411 int localFaceIdx_;
412 unsigned int dirIdx_;
413 int outerNormalSign_;
414 bool isGhostFace_;
415 };
416
417 } // end namespace Dumux
418
419 #endif
420