GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: /builds/dumux-repositories/dumux/dumux/discretization/staggered/fvgridgeometry.hh
Date: 2024-05-04 19:09:25
Exec Total Coverage
Lines: 111 127 87.4%
Functions: 16 55 29.1%
Branches: 516 953 54.1%

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::StaggeredFVGridGeometry
11 */
12 #ifndef DUMUX_DISCRETIZATION_STAGGERED_FV_GRID_GEOMETRY
13 #define DUMUX_DISCRETIZATION_STAGGERED_FV_GRID_GEOMETRY
14
15 #include <utility>
16
17 #include <dumux/common/indextraits.hh>
18 #include <dumux/discretization/basegridgeometry.hh>
19 #include <dumux/discretization/checkoverlapsize.hh>
20 #include <dumux/discretization/method.hh>
21 #include <dumux/discretization/extrusion.hh>
22
23 namespace Dumux {
24
25 /*!
26 * \ingroup StaggeredDiscretization
27 * \brief Base class for cell center of face specific auxiliary FvGridGeometry classes.
28 * Provides a common interface and a pointer to the actual gridGeometry.
29 */
30 template<class ActualGridGeometry>
31 class GridGeometryView
32 {
33 public:
34
35 102 explicit GridGeometryView(const ActualGridGeometry* actualGridGeometry)
36 102 : gridGeometry_(actualGridGeometry) {}
37
38 //! export the GridView type and the discretization method
39 using GridView = typename ActualGridGeometry::GridView;
40
41 //! export the discretization method this geometry belongs to
42 using DiscretizationMethod = DiscretizationMethods::Staggered;
43 static constexpr DiscretizationMethod discMethod{};
44
45 using LocalView = typename ActualGridGeometry::LocalView;
46
47 /*!
48 * \brief Returns true if this view if related to cell centered dofs
49 */
50 static constexpr bool isCellCenter() { return false; }
51
52 /*!
53 * \brief Returns true if this view if related to face dofs
54 */
55 static constexpr bool isFace() {return false; }
56
57 /*!
58 * \brief Return an integral constant index for cell centered dofs
59 */
60 static constexpr auto cellCenterIdx()
61 { return typename ActualGridGeometry::DofTypeIndices::CellCenterIdx{}; }
62
63 /*!
64 * \brief Return an integral constant index for face dofs
65 */
66 static constexpr auto faceIdx()
67 { return typename ActualGridGeometry::DofTypeIndices::FaceIdx{}; }
68
69 /*!
70 * \brief Return the gridView this grid geometry object lives on
71 */
72 const auto& gridView() const
73
39/92
✓ Branch 1 taken 4499 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4499 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 4499 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4499 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 20 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 4479 times.
✓ Branch 18 taken 20 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 4479 times.
✓ Branch 21 taken 20 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 4499 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 4479 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 17 times.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✓ Branch 36 taken 17 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 17 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✓ Branch 42 taken 17 times.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 17 times.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✓ Branch 48 taken 17 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 17 times.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✓ Branch 54 taken 17 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 3 times.
✗ Branch 58 not taken.
✓ Branch 60 taken 3 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 3 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 31 times.
✓ Branch 66 taken 3 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 31 times.
✓ Branch 69 taken 3 times.
✗ Branch 70 not taken.
✓ Branch 71 taken 31 times.
✓ Branch 72 taken 3 times.
✗ Branch 73 not taken.
✓ Branch 74 taken 31 times.
✓ Branch 75 taken 3 times.
✗ Branch 76 not taken.
✓ Branch 77 taken 31 times.
✓ Branch 78 taken 3 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 31 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 31 times.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✓ Branch 86 taken 31 times.
✗ Branch 87 not taken.
✓ Branch 89 taken 17 times.
✗ Branch 90 not taken.
✓ Branch 92 taken 17 times.
✗ Branch 93 not taken.
✓ Branch 95 taken 17 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 17 times.
✗ Branch 99 not taken.
36468 { return gridGeometry_->gridView(); }
74
75 /*!
76 * \brief Returns the connectivity map of which dofs have derivatives with respect
77 * to a given dof.
78 */
79 const auto& connectivityMap() const // TODO return correct map
80 204 { return gridGeometry_->connectivityMap(); }
81
82 /*!
83 * \brief Returns the mapper for vertices to indices for possibly adaptive grids.
84 */
85 const auto& vertexMapper() const
86 { return gridGeometry_->vertexMapper(); }
87
88 /*!
89 * \brief Returns the mapper for elements to indices for constant grids.
90 */
91 const auto& elementMapper() const
92
4/8
✓ Branch 1 taken 7000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7000 times.
✗ Branch 11 not taken.
500480 { return gridGeometry_->elementMapper(); }
93
94 /*!
95 * \brief Returns the actual gridGeometry we are a restriction of
96 */
97 const ActualGridGeometry& actualGridGeometry() const
98 { return *gridGeometry_; }
99
100 protected:
101 const ActualGridGeometry* gridGeometry_;
102
103 };
104
105 /*!
106 * \ingroup StaggeredDiscretization
107 * \brief Cell center specific auxiliary FvGridGeometry classes.
108 * Required for the Dumux multi-domain framework.
109 */
110 template <class ActualGridGeometry>
111 class CellCenterFVGridGeometry : public GridGeometryView<ActualGridGeometry>
112 {
113 using ParentType = GridGeometryView<ActualGridGeometry>;
114 public:
115
116
1/2
✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
51 using ParentType::ParentType;
117
118 /*!
119 * \brief Returns true because this view is related to cell centered dofs
120 */
121 static constexpr bool isCellCenter() { return true; }
122
123 /*!
124 * \brief The total number of cell centered dofs
125 */
126 std::size_t numDofs() const
127 476 { return this->gridGeometry_->numCellCenterDofs(); }
128 };
129
130 /*!
131 * \ingroup StaggeredDiscretization
132 * \brief Face specific auxiliary FvGridGeometry classes.
133 * Required for the Dumux multi-domain framework.
134 */
135 template <class ActualGridGeometry>
136 class FaceFVGridGeometry : public GridGeometryView<ActualGridGeometry>
137 {
138 using ParentType = GridGeometryView<ActualGridGeometry>;
139 public:
140
141
1/2
✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
51 using ParentType::ParentType;
142
143 /*!
144 * \brief Returns true because this view is related to face dofs
145 */
146 static constexpr bool isFace() {return true; }
147
148 /*!
149 * \brief The total number of cell centered dofs
150 */
151 std::size_t numDofs() const
152 476 { return this->gridGeometry_->numFaceDofs(); }
153 };
154
155 /*!
156 * \ingroup StaggeredDiscretization
157 * \brief Base class for the finite volume geometry vector for staggered models
158 * This builds up the sub control volumes and sub control volume faces
159 * for each element.
160 */
161 template<class GridView,
162 bool cachingEnabled,
163 class Traits>
164 class StaggeredFVGridGeometry;
165
166 /*!
167 * \ingroup StaggeredDiscretization
168 * \brief Base class for the finite volume geometry vector for staggered models
169 * This builds up the sub control volumes and sub control volume faces
170 * for each element. Specialization in case the FVElementGeometries are stored.
171 */
172 template<class GV, class T>
173 class StaggeredFVGridGeometry<GV, true, T>
174 : public BaseGridGeometry<GV, T>
175 {
176 using ThisType = StaggeredFVGridGeometry<GV, true, T>;
177 using ParentType = BaseGridGeometry<GV, T>;
178 using GridIndexType = typename IndexTraits<GV>::GridIndex;
179 using LocalIndexType = typename IndexTraits<GV>::LocalIndex;
180 using Element = typename GV::template Codim<0>::Entity;
181
182 using IntersectionMapper = typename T::IntersectionMapper;
183 using GeometryHelper = typename T::GeometryHelper;
184 using ConnectivityMap = typename T::template ConnectivityMap<ThisType>;
185
186 public:
187 //! export the traits
188 using Traits = typename T::PublicTraits;
189
190 //! export the discretization method this geometry belongs to
191 using DiscretizationMethod = DiscretizationMethods::Staggered;
192 static constexpr DiscretizationMethod discMethod{};
193
194 static constexpr int upwindSchemeOrder = T::upwindSchemeOrder;
195 static constexpr bool useHigherOrder = upwindSchemeOrder > 1;
196 static constexpr bool cachingEnabled = true;
197
198 //! export the type of the fv element geometry (the local view type)
199 using LocalView = typename T::template LocalView<ThisType, true>;
200 //! export the type of sub control volume
201 using SubControlVolume = typename T::SubControlVolume;
202 //! export the type of sub control volume
203 using SubControlVolumeFace = typename T::SubControlVolumeFace;
204 //! export the type of extrusion
205 using Extrusion = Extrusion_t<T>;
206 //! export the grid view type
207 using GridView = GV;
208 //! export the dof type indices
209 using DofTypeIndices = typename T::DofTypeIndices;
210
211 //! return a integral constant for cell center dofs
212 static constexpr auto cellCenterIdx()
213 { return typename DofTypeIndices::CellCenterIdx{}; }
214
215 //! return a integral constant for face dofs
216 static constexpr auto faceIdx()
217 { return typename DofTypeIndices::FaceIdx{}; }
218
219 //! The order of the stencil built
220 static constexpr int upwindStencilOrder()
221 { return upwindSchemeOrder; }
222
223 using CellCenterFVGridGeometryType = CellCenterFVGridGeometry<ThisType>;
224 using FaceFVGridGeometryType = FaceFVGridGeometry<ThisType>;
225
226 using FVGridGeometryTuple = std::tuple< CellCenterFVGridGeometry<ThisType>, FaceFVGridGeometry<ThisType> >;
227
228 //! Constructor
229 53 StaggeredFVGridGeometry(const GridView& gridView, const std::string& paramGroup = "")
230 : ParentType(gridView)
231
7/20
✗ Branch 1 not taken.
✓ Branch 2 taken 53 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 52 times.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
53 , intersectionMapper_(gridView)
232 {
233 // Check if the overlap size is what we expect
234
2/2
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 50 times.
53 if (!CheckOverlapSize<DiscretizationMethod>::isValid(gridView))
235 DUNE_THROW(Dune::InvalidStateException, "The staggered discretization method needs at least an overlap of 1 for parallel computations. "
236 << " Set the parameter \"Grid.Overlap\" in the input file.");
237
238
1/2
✓ Branch 1 taken 53 times.
✗ Branch 2 not taken.
53 update_();
239 53 }
240
241 //! The total number of sub control volumes
242 std::size_t numScv() const
243 {
244
9/18
✓ Branch 1 taken 1331 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1360444 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1360444 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1360444 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1360444 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 51 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 5603 times.
✓ Branch 22 taken 80 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 80 times.
✗ Branch 26 not taken.
5448921 return scvs_.size();
245 }
246
247 //! The total number of sub control volume faces
248 std::size_t numScvf() const
249 {
250 5705 return scvfs_.size();
251 }
252
253 //! The total number of boundary sub control volume faces
254 std::size_t numBoundaryScvf() const
255 {
256
2/6
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
82 return numBoundaryScvf_;
257 }
258
259
260 //! The total number of intersections
261 std::size_t numIntersections() const
262 {
263 return intersectionMapper_.numIntersections();
264 }
265
266 //! the total number of dofs
267 std::size_t numDofs() const
268 { return numCellCenterDofs() + numFaceDofs(); }
269
270 std::size_t numCellCenterDofs() const
271
12/23
✓ Branch 6 taken 17 times.
✗ Branch 7 not taken.
✓ Branch 23 taken 31 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 31 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✓ Branch 29 taken 31 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 11 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 20 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 15 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 6 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 6 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 6 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 6 times.
✗ Branch 50 not taken.
688 { return this->gridView().size(0); }
272
273 std::size_t numFaceDofs() const
274
22/36
✓ Branch 6 taken 17 times.
✗ Branch 7 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 31 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 79 times.
✓ Branch 32 taken 31 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 81 times.
✓ Branch 35 taken 31 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 94 times.
✓ Branch 38 taken 1 times.
✓ Branch 39 taken 3 times.
✓ Branch 40 taken 94 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 92 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 85 times.
✓ Branch 47 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 6 times.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 6 times.
✓ Branch 53 taken 1 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 2 times.
✗ Branch 62 not taken.
1260 { return this->gridView().size(1); }
275
276 //! update all fvElementGeometries (call this after grid adaption)
277 void update(const GridView& gridView)
278 {
279 ParentType::update(gridView);
280 updateIntersectionMapper_();
281 update_();
282 }
283
284 //! update all fvElementGeometries (call this after grid adaption)
285 void update(GridView&& gridView)
286 {
287 ParentType::update(std::move(gridView));
288 updateIntersectionMapper_();
289 update_();
290 }
291
292 //! Get a sub control volume with a global scv index
293 const SubControlVolume& scv(GridIndexType scvIdx) const
294 {
295
33/39
✓ Branch 6 taken 12248 times.
✓ Branch 7 taken 72 times.
✓ Branch 8 taken 12248 times.
✓ Branch 9 taken 72 times.
✓ Branch 11 taken 1016712 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 302736 times.
✓ Branch 14 taken 1016712 times.
✓ Branch 15 taken 4629476 times.
✓ Branch 16 taken 302736 times.
✓ Branch 17 taken 2298384 times.
✓ Branch 18 taken 4617436 times.
✓ Branch 19 taken 1494372 times.
✓ Branch 20 taken 2276904 times.
✓ Branch 21 taken 1227912 times.
✓ Branch 22 taken 1471020 times.
✓ Branch 23 taken 3424672 times.
✓ Branch 24 taken 1198400 times.
✓ Branch 25 taken 432672 times.
✓ Branch 26 taken 3407840 times.
✓ Branch 27 taken 226320 times.
✓ Branch 28 taken 426880 times.
✓ Branch 29 taken 798080 times.
✓ Branch 30 taken 221760 times.
✓ Branch 31 taken 38240 times.
✓ Branch 32 taken 798080 times.
✓ Branch 33 taken 8160 times.
✓ Branch 34 taken 38240 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 8160 times.
✓ Branch 37 taken 102468 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 48356 times.
✓ Branch 40 taken 54112 times.
✗ Branch 41 not taken.
✓ Branch 47 taken 20640 times.
✗ Branch 48 not taken.
✓ Branch 50 taken 20640 times.
✗ Branch 51 not taken.
2241856092 return scvs_[scvIdx];
296 }
297
298 //! Get a sub control volume face with a global scvf index
299 const SubControlVolumeFace& scvf(GridIndexType scvfIdx) const
300 {
301
53/60
✓ Branch 2 taken 22664 times.
✓ Branch 3 taken 68004 times.
✓ Branch 4 taken 2412226 times.
✓ Branch 5 taken 147762 times.
✓ Branch 6 taken 3643270 times.
✓ Branch 7 taken 79770 times.
✓ Branch 8 taken 1453848 times.
✓ Branch 9 taken 2392888 times.
✓ Branch 10 taken 200152 times.
✓ Branch 11 taken 1296152 times.
✓ Branch 12 taken 2350432 times.
✓ Branch 13 taken 186000 times.
✓ Branch 14 taken 2905344 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1837648 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1651648 times.
✓ Branch 20 taken 1234 times.
✓ Branch 21 taken 23382 times.
✓ Branch 22 taken 1653518 times.
✓ Branch 23 taken 5130 times.
✓ Branch 24 taken 20636 times.
✓ Branch 25 taken 47028 times.
✓ Branch 26 taken 9724 times.
✓ Branch 27 taken 12164 times.
✓ Branch 28 taken 55004 times.
✓ Branch 29 taken 287524 times.
✓ Branch 30 taken 1033070 times.
✓ Branch 31 taken 378414 times.
✓ Branch 32 taken 1864798 times.
✓ Branch 33 taken 580686 times.
✓ Branch 34 taken 592284 times.
✓ Branch 35 taken 560948 times.
✓ Branch 36 taken 35916 times.
✓ Branch 37 taken 642900 times.
✓ Branch 38 taken 19272 times.
✓ Branch 39 taken 249912 times.
✓ Branch 40 taken 327148 times.
✓ Branch 41 taken 562356 times.
✓ Branch 42 taken 388068 times.
✓ Branch 43 taken 443276 times.
✓ Branch 44 taken 413031 times.
✓ Branch 45 taken 174617 times.
✓ Branch 46 taken 49431 times.
✓ Branch 47 taken 58393 times.
✓ Branch 48 taken 3056 times.
✓ Branch 49 taken 281168 times.
✓ Branch 50 taken 33876 times.
✓ Branch 51 taken 407500 times.
✓ Branch 52 taken 31636 times.
✓ Branch 53 taken 140940 times.
✓ Branch 54 taken 22120 times.
✓ Branch 55 taken 18328 times.
✓ Branch 56 taken 22120 times.
✓ Branch 57 taken 18328 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
861892496 return scvfs_[scvfIdx];
302 }
303
304 //! Get the sub control volume face indices of an scv by global index
305 const std::vector<GridIndexType>& scvfIndicesOfScv(GridIndexType scvIdx) const
306 {
307
5/10
✓ Branch 1 taken 1360444 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1360444 times.
✗ Branch 5 not taken.
✓ Branch 11 taken 7000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7000 times.
✗ Branch 18 not taken.
326025156 return scvfIndicesOfScv_[scvIdx];
308 }
309
310 GridIndexType localToGlobalScvfIndex(GridIndexType eIdx, LocalIndexType localScvfIdx) const
311 {
312
15/19
✓ Branch 0 taken 2400 times.
✓ Branch 1 taken 600 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 12 taken 400406 times.
✓ Branch 13 taken 280642748 times.
✓ Branch 15 taken 49 times.
✓ Branch 16 taken 285905911 times.
✓ Branch 17 taken 3895192 times.
✓ Branch 18 taken 10881846 times.
✓ Branch 19 taken 207402644 times.
✓ Branch 20 taken 73515534 times.
✓ Branch 21 taken 22428 times.
✓ Branch 22 taken 169936 times.
✓ Branch 23 taken 5203712 times.
✓ Branch 24 taken 517420 times.
✓ Branch 25 taken 800 times.
1437258035 return localToGlobalScvfIndices_[eIdx][localScvfIdx];
313 }
314
315 const SubControlVolumeFace& scvf(GridIndexType eIdx, LocalIndexType localScvfIdx) const
316 {
317
45/59
✓ Branch 0 taken 2400 times.
✓ Branch 1 taken 600 times.
✓ Branch 2 taken 2400 times.
✓ Branch 3 taken 600 times.
✓ Branch 4 taken 2400 times.
✓ Branch 5 taken 600 times.
✗ 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 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 34 taken 53878 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 346528 times.
✓ Branch 37 taken 280696626 times.
✓ Branch 38 taken 346528 times.
✓ Branch 39 taken 280642748 times.
✓ Branch 40 taken 400406 times.
✓ Branch 41 taken 280642748 times.
✓ Branch 45 taken 49 times.
✓ Branch 46 taken 285905911 times.
✓ Branch 47 taken 49 times.
✓ Branch 48 taken 285905911 times.
✓ Branch 49 taken 3895241 times.
✓ Branch 50 taken 285905911 times.
✓ Branch 51 taken 3895192 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 3895192 times.
✓ Branch 54 taken 10881846 times.
✓ Branch 55 taken 203699602 times.
✓ Branch 56 taken 10881846 times.
✓ Branch 57 taken 207402644 times.
✓ Branch 58 taken 83740004 times.
✓ Branch 59 taken 207402644 times.
✓ Branch 60 taken 73515534 times.
✓ Branch 61 taken 3712962 times.
✓ Branch 62 taken 73515534 times.
✓ Branch 63 taken 22428 times.
✓ Branch 64 taken 658308 times.
✓ Branch 65 taken 22428 times.
✓ Branch 66 taken 169936 times.
✓ Branch 67 taken 5181512 times.
✓ Branch 68 taken 169936 times.
✓ Branch 69 taken 5203712 times.
✓ Branch 70 taken 651224 times.
✓ Branch 71 taken 5203712 times.
✓ Branch 72 taken 517420 times.
✓ Branch 73 taken 35508 times.
✓ Branch 74 taken 517420 times.
✓ Branch 75 taken 800 times.
✓ Branch 76 taken 35200 times.
✓ Branch 77 taken 800 times.
4311774105 return scvf(localToGlobalScvfIndex(eIdx, localScvfIdx));
318 }
319
320 /*!
321 * \brief Returns the connectivity map of which dofs have derivatives with respect
322 * to a given dof.
323 */
324 const ConnectivityMap &connectivityMap() const
325
3/6
✓ Branch 3 taken 51 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 51 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 12550432 times.
✗ Branch 10 not taken.
20802790 { return connectivityMap_; }
326
327 //! Returns a pointer the cell center specific auxiliary class. Required for the multi-domain FVAssembler's ctor.
328 std::unique_ptr<CellCenterFVGridGeometry<ThisType>> cellCenterFVGridGeometryPtr() const
329 {
330
1/2
✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
51 return std::make_unique<CellCenterFVGridGeometry<ThisType>>(this);
331 }
332
333 //! Returns a pointer the face specific auxiliary class. Required for the multi-domain FVAssembler's ctor.
334 std::unique_ptr<FaceFVGridGeometry<ThisType>> faceFVGridGeometryPtr() const
335 {
336
1/2
✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
51 return std::make_unique<FaceFVGridGeometry<ThisType>>(this);
337 }
338
339 //! Return a copy of the cell center specific auxiliary class.
340 CellCenterFVGridGeometry<ThisType> cellCenterFVGridGeometry() const
341 {
342 return CellCenterFVGridGeometry<ThisType>(this);
343 }
344
345 //! Return a copy of the face specific auxiliary class.
346 FaceFVGridGeometry<ThisType> faceFVGridGeometry() const
347 {
348 return FaceFVGridGeometry<ThisType>(this);
349 }
350
351 //! Returns whether one of the geometry's scvfs lies on a boundary
352 bool hasBoundaryScvf(GridIndexType eIdx) const
353
8/10
✓ Branch 0 taken 166013 times.
✓ Branch 1 taken 1522103 times.
✓ Branch 2 taken 166013 times.
✓ Branch 3 taken 1522103 times.
✓ Branch 4 taken 535315 times.
✓ Branch 5 taken 1602253 times.
✓ Branch 6 taken 535315 times.
✓ Branch 7 taken 1602253 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
7651368 { return hasBoundaryScvf_[eIdx]; }
354
355 private:
356
357 void updateIntersectionMapper_()
358 {
359 intersectionMapper_.update(this->gridView());
360 }
361
362 53 void update_()
363 {
364 // clear containers (necessary after grid refinement)
365
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 53 times.
53 scvs_.clear();
366 53 scvfs_.clear();
367 53 scvfIndicesOfScv_.clear();
368 53 localToGlobalScvfIndices_.clear();
369
370 // determine size of containers
371 106 std::size_t numScvs = this->gridView().size(0);
372 53 std::size_t numScvf = 0;
373
1/2
✓ Branch 2 taken 89778 times.
✗ Branch 3 not taken.
96831 for (const auto& element : elements(this->gridView()))
374 179450 numScvf += element.subEntities(1);
375
376 // reserve memory
377 53 scvs_.resize(numScvs);
378 53 scvfs_.reserve(numScvf);
379 53 scvfIndicesOfScv_.resize(numScvs);
380 53 localToGlobalScvfIndices_.resize(numScvs);
381 53 hasBoundaryScvf_.assign(numScvs, false);
382
383 // Build the scvs and scv faces
384 53 GridIndexType scvfIdx = 0;
385 53 numBoundaryScvf_ = 0;
386
1/2
✓ Branch 2 taken 89778 times.
✗ Branch 3 not taken.
179556 for (const auto& element : elements(this->gridView()))
387 {
388 179450 auto eIdx = this->elementMapper().index(element);
389
390 // reserve memory for the localToGlobalScvfIdx map
391 89725 auto numLocalFaces = intersectionMapper_.numFaces(element);
392 179450 localToGlobalScvfIndices_[eIdx].resize(numLocalFaces);
393
394
2/3
✓ Branch 2 taken 125 times.
✓ Branch 3 taken 89600 times.
✗ Branch 4 not taken.
269050 scvs_[eIdx] = SubControlVolume(element.geometry(), eIdx);
395
396 // the element-wise index sets for finite volume geometry
397
2/6
✓ Branch 1 taken 89725 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 89725 times.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
269175 std::vector<GridIndexType> scvfsIndexSet;
398
1/2
✓ Branch 1 taken 89725 times.
✗ Branch 2 not taken.
89725 scvfsIndexSet.reserve(numLocalFaces);
399
400 179450 GeometryHelper geometryHelper(element, this->gridView());
401
402
12/17
✓ Branch 1 taken 7000 times.
✓ Branch 2 taken 82725 times.
✓ Branch 3 taken 331150 times.
✓ Branch 4 taken 7000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7000 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 28000 times.
✓ Branch 13 taken 7000 times.
✓ Branch 14 taken 28000 times.
✓ Branch 15 taken 7000 times.
✓ Branch 17 taken 28000 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 28000 times.
✗ Branch 21 not taken.
552600 for (const auto& intersection : intersections(this->gridView(), element))
403 {
404
2/3
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 359124 times.
✗ Branch 2 not taken.
359150 geometryHelper.updateLocalFace(intersectionMapper_, intersection);
405
2/2
✓ Branch 0 taken 356456 times.
✓ Branch 1 taken 2694 times.
359150 const int localFaceIndex = geometryHelper.localFaceIndex();
406
407 // inner sub control volume faces
408
2/2
✓ Branch 0 taken 356456 times.
✓ Branch 1 taken 2694 times.
359150 if (intersection.neighbor())
409 {
410
3/6
✓ Branch 1 taken 27400 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 27400 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 27400 times.
✗ Branch 8 not taken.
1032086 auto nIdx = this->elementMapper().index(intersection.outside());
411
5/12
✓ Branch 1 taken 353162 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 353162 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 353162 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 353162 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 353162 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
1059486 scvfs_.emplace_back(intersection,
412 intersection.geometry(),
413 scvfIdx,
414 std::vector<GridIndexType>({eIdx, nIdx}),
415 geometryHelper);
416
2/4
✓ Branch 1 taken 353162 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 353162 times.
✗ Branch 5 not taken.
706324 localToGlobalScvfIndices_[eIdx][localFaceIndex] = scvfIdx;
417
1/2
✓ Branch 1 taken 353162 times.
✗ Branch 2 not taken.
353162 scvfsIndexSet.push_back(scvfIdx++);
418 }
419 // boundary sub control volume faces
420
1/2
✓ Branch 0 taken 5388 times.
✗ Branch 1 not taken.
5988 else if (intersection.boundary())
421 {
422
6/13
✓ Branch 1 taken 5388 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 600 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 5988 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5388 times.
✓ Branch 8 taken 600 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 5388 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
17964 scvfs_.emplace_back(intersection,
423 intersection.geometry(),
424 scvfIdx,
425
4/7
✓ Branch 1 taken 5388 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 600 times.
✓ Branch 4 taken 5388 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5388 times.
✗ Branch 8 not taken.
11976 std::vector<GridIndexType>({eIdx, this->gridView().size(0) + numBoundaryScvf_++}),
426 geometryHelper);
427
2/4
✓ Branch 1 taken 5988 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5988 times.
✗ Branch 5 not taken.
11976 localToGlobalScvfIndices_[eIdx][localFaceIndex] = scvfIdx;
428
1/4
✓ Branch 1 taken 5988 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
5988 scvfsIndexSet.push_back(scvfIdx++);
429
430 17964 hasBoundaryScvf_[eIdx] = true;
431 }
432 }
433
434 // Save the scvf indices belonging to this scv to build up fv element geometries fast
435
2/4
✓ Branch 1 taken 89725 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 89725 times.
✗ Branch 5 not taken.
179450 scvfIndicesOfScv_[eIdx] = scvfsIndexSet;
436 }
437
438 // build the connectivity map for an efficient assembly
439 53 connectivityMap_.update(*this);
440 53 }
441
442 // mappers
443 ConnectivityMap connectivityMap_;
444 IntersectionMapper intersectionMapper_;
445
446 std::vector<SubControlVolume> scvs_;
447 std::vector<SubControlVolumeFace> scvfs_;
448 std::vector<std::vector<GridIndexType>> scvfIndicesOfScv_;
449 std::vector<std::vector<GridIndexType>> localToGlobalScvfIndices_;
450 GridIndexType numBoundaryScvf_;
451 std::vector<bool> hasBoundaryScvf_;
452 };
453
454 /*!
455 * \ingroup StaggeredDiscretization
456 * \brief Base class for the finite volume geometry vector for staggered models
457 * This builds up the sub control volumes and sub control volume faces
458 * for each element. Specialization in case the FVElementGeometries are stored.
459 */
460 template<class GV, class T>
461 class StaggeredFVGridGeometry<GV, false, T>
462 : public BaseGridGeometry<GV, T>
463 {
464 using ThisType = StaggeredFVGridGeometry<GV, false, T>;
465 using ParentType = BaseGridGeometry<GV, T>;
466 using GridIndexType = typename IndexTraits<GV>::GridIndex;
467 using LocalIndexType = typename IndexTraits<GV>::LocalIndex;
468 using Element = typename GV::template Codim<0>::Entity;
469
470 using IntersectionMapper = typename T::IntersectionMapper;
471 using ConnectivityMap = typename T::template ConnectivityMap<ThisType>;
472
473 public:
474 //! export the traits
475 using Traits = typename T::PublicTraits;
476
477 //! export the discretization method this geometry belongs to
478 using DiscretizationMethod = DiscretizationMethods::Staggered;
479 static constexpr DiscretizationMethod discMethod{};
480
481 static constexpr int upwindSchemeOrder = T::upwindSchemeOrder;
482 static constexpr bool useHigherOrder = upwindSchemeOrder > 1;
483 static constexpr bool cachingEnabled = false;
484
485 using GeometryHelper = typename T::GeometryHelper;
486
487 //! export the type of the fv element geometry (the local view type)
488 using LocalView = typename T::template LocalView<ThisType, false>;
489 //! export the type of sub control volume
490 using SubControlVolume = typename T::SubControlVolume;
491 //! export the type of sub control volume
492 using SubControlVolumeFace = typename T::SubControlVolumeFace;
493 //! export the type of extrusion
494 using Extrusion = Extrusion_t<T>;
495 //! export the grid view type
496 using GridView = GV;
497 //! export the dof type indices
498 using DofTypeIndices = typename T::DofTypeIndices;
499
500 //! return a integral constant for cell center dofs
501 static constexpr auto cellCenterIdx()
502 { return typename DofTypeIndices::CellCenterIdx{}; }
503
504 //! return a integral constant for face dofs
505 static constexpr auto faceIdx()
506 { return typename DofTypeIndices::FaceIdx{}; }
507
508 //! The order of the stencil built
509 static constexpr int upwindStencilOrder()
510 { return upwindSchemeOrder; }
511
512 using CellCenterFVGridGeometryType = CellCenterFVGridGeometry<ThisType>;
513 using FaceFVGridGeometryType = FaceFVGridGeometry<ThisType>;
514
515 using FVGridGeometryTuple = std::tuple< CellCenterFVGridGeometry<ThisType>, FaceFVGridGeometry<ThisType> >;
516
517 //! Constructor
518 1 StaggeredFVGridGeometry(const GridView& gridView, const std::string& paramGroup = "")
519 : ParentType(gridView)
520
4/10
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
1 , intersectionMapper_(gridView)
521 {
522 // Check if the overlap size is what we expect
523
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
1 if (!CheckOverlapSize<DiscretizationMethod>::isValid(gridView))
524 DUNE_THROW(Dune::InvalidStateException, "The staggered discretization method needs at least an overlap of 1 for parallel computations. "
525 << " Set the parameter \"Grid.Overlap\" in the input file.");
526
527
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 update_();
528 1 }
529
530
531 //! update all fvElementGeometries (call this after grid adaption)
532 void update(const GridView& gridView)
533 {
534 ParentType::update(gridView);
535 updateIntersectionMapper_();
536 update_();
537 }
538
539 //! update all fvElementGeometries (call this after grid adaption)
540 void update(GridView&& gridView)
541 {
542 ParentType::update(std::move(gridView));
543 updateIntersectionMapper_();
544 update_();
545 }
546
547 //! The total number of sub control volumes
548 std::size_t numScv() const
549 {
550 return numScvs_;
551 }
552
553 //! The total number of sub control volume faces
554 std::size_t numScvf() const
555 {
556 return numScvf_;
557 }
558
559 //! The total number of boundary sub control volume faces
560 std::size_t numBoundaryScvf() const
561 {
562 return numBoundaryScvf_;
563 }
564
565 //! The total number of intersections
566 std::size_t numIntersections() const
567 {
568 return intersectionMapper_.numIntersections();
569 }
570
571 //! the total number of dofs
572 std::size_t numDofs() const
573 { return numCellCenterDofs() + numFaceDofs(); }
574
575 std::size_t numCellCenterDofs() const
576
72/144
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 47 taken 1 times.
✗ Branch 48 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 53 taken 1 times.
✗ Branch 54 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 68 taken 1 times.
✗ Branch 69 not taken.
✓ Branch 71 taken 1 times.
✗ Branch 72 not taken.
✓ Branch 74 taken 1 times.
✗ Branch 75 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 89 taken 1 times.
✗ Branch 90 not taken.
✓ Branch 92 taken 1 times.
✗ Branch 93 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 101 taken 1 times.
✗ Branch 102 not taken.
✓ Branch 104 taken 1 times.
✗ Branch 105 not taken.
✓ Branch 107 taken 1 times.
✗ Branch 108 not taken.
✓ Branch 110 taken 1 times.
✗ Branch 111 not taken.
✓ Branch 113 taken 1 times.
✗ Branch 114 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
✓ Branch 119 taken 1 times.
✗ Branch 120 not taken.
✓ Branch 122 taken 1 times.
✗ Branch 123 not taken.
✓ Branch 125 taken 1 times.
✗ Branch 126 not taken.
✓ Branch 128 taken 1 times.
✗ Branch 129 not taken.
✓ Branch 131 taken 1 times.
✗ Branch 132 not taken.
✓ Branch 134 taken 1 times.
✗ Branch 135 not taken.
✓ Branch 137 taken 1 times.
✗ Branch 138 not taken.
✓ Branch 140 taken 1 times.
✗ Branch 141 not taken.
✓ Branch 143 taken 1 times.
✗ Branch 144 not taken.
✓ Branch 146 taken 1 times.
✗ Branch 147 not taken.
✓ Branch 149 taken 1 times.
✗ Branch 150 not taken.
✓ Branch 152 taken 1 times.
✗ Branch 153 not taken.
✓ Branch 155 taken 1 times.
✗ Branch 156 not taken.
✓ Branch 158 taken 1 times.
✗ Branch 159 not taken.
✓ Branch 161 taken 1 times.
✗ Branch 162 not taken.
✓ Branch 164 taken 1 times.
✗ Branch 165 not taken.
✓ Branch 167 taken 1 times.
✗ Branch 168 not taken.
✓ Branch 170 taken 1 times.
✗ Branch 171 not taken.
✓ Branch 173 taken 1 times.
✗ Branch 174 not taken.
✓ Branch 176 taken 1 times.
✗ Branch 177 not taken.
✓ Branch 179 taken 1 times.
✗ Branch 180 not taken.
✓ Branch 182 taken 1 times.
✗ Branch 183 not taken.
✓ Branch 185 taken 1 times.
✗ Branch 186 not taken.
✓ Branch 188 taken 1 times.
✗ Branch 189 not taken.
✓ Branch 191 taken 1 times.
✗ Branch 192 not taken.
✓ Branch 194 taken 1 times.
✗ Branch 195 not taken.
✓ Branch 197 taken 1 times.
✗ Branch 198 not taken.
✓ Branch 200 taken 1 times.
✗ Branch 201 not taken.
✓ Branch 203 taken 1 times.
✗ Branch 204 not taken.
✓ Branch 206 taken 1 times.
✗ Branch 207 not taken.
✓ Branch 209 taken 1 times.
✗ Branch 210 not taken.
✓ Branch 212 taken 1 times.
✗ Branch 213 not taken.
✓ Branch 215 taken 1 times.
✗ Branch 216 not taken.
49 { return this->gridView().size(0); }
577
578 std::size_t numFaceDofs() const
579
72/144
✓ Branch 145 taken 1 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 1 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 1 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 1 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 1 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 1 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 1 times.
✗ Branch 164 not taken.
✓ Branch 166 taken 1 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 1 times.
✗ Branch 170 not taken.
✓ Branch 172 taken 1 times.
✗ Branch 173 not taken.
✓ Branch 175 taken 1 times.
✗ Branch 176 not taken.
✓ Branch 178 taken 1 times.
✗ Branch 179 not taken.
✓ Branch 181 taken 1 times.
✗ Branch 182 not taken.
✓ Branch 184 taken 1 times.
✗ Branch 185 not taken.
✓ Branch 187 taken 1 times.
✗ Branch 188 not taken.
✓ Branch 190 taken 1 times.
✗ Branch 191 not taken.
✓ Branch 193 taken 1 times.
✗ Branch 194 not taken.
✓ Branch 196 taken 1 times.
✗ Branch 197 not taken.
✓ Branch 199 taken 1 times.
✗ Branch 200 not taken.
✓ Branch 202 taken 1 times.
✗ Branch 203 not taken.
✓ Branch 205 taken 1 times.
✗ Branch 206 not taken.
✓ Branch 208 taken 1 times.
✗ Branch 209 not taken.
✓ Branch 211 taken 1 times.
✗ Branch 212 not taken.
✓ Branch 214 taken 1 times.
✗ Branch 215 not taken.
✓ Branch 217 taken 1 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 1 times.
✗ Branch 221 not taken.
✓ Branch 223 taken 1 times.
✗ Branch 224 not taken.
✓ Branch 226 taken 1 times.
✗ Branch 227 not taken.
✓ Branch 229 taken 1 times.
✗ Branch 230 not taken.
✓ Branch 232 taken 1 times.
✗ Branch 233 not taken.
✓ Branch 235 taken 1 times.
✗ Branch 236 not taken.
✓ Branch 238 taken 1 times.
✗ Branch 239 not taken.
✓ Branch 241 taken 1 times.
✗ Branch 242 not taken.
✓ Branch 244 taken 1 times.
✗ Branch 245 not taken.
✓ Branch 247 taken 1 times.
✗ Branch 248 not taken.
✓ Branch 250 taken 1 times.
✗ Branch 251 not taken.
✓ Branch 253 taken 1 times.
✗ Branch 254 not taken.
✓ Branch 256 taken 1 times.
✗ Branch 257 not taken.
✓ Branch 259 taken 1 times.
✗ Branch 260 not taken.
✓ Branch 262 taken 1 times.
✗ Branch 263 not taken.
✓ Branch 265 taken 1 times.
✗ Branch 266 not taken.
✓ Branch 268 taken 1 times.
✗ Branch 269 not taken.
✓ Branch 271 taken 1 times.
✗ Branch 272 not taken.
✓ Branch 274 taken 1 times.
✗ Branch 275 not taken.
✓ Branch 277 taken 1 times.
✗ Branch 278 not taken.
✓ Branch 280 taken 1 times.
✗ Branch 281 not taken.
✓ Branch 283 taken 1 times.
✗ Branch 284 not taken.
✓ Branch 286 taken 1 times.
✗ Branch 287 not taken.
✓ Branch 289 taken 1 times.
✗ Branch 290 not taken.
✓ Branch 292 taken 1 times.
✗ Branch 293 not taken.
✓ Branch 295 taken 1 times.
✗ Branch 296 not taken.
✓ Branch 298 taken 1 times.
✗ Branch 299 not taken.
✓ Branch 301 taken 1 times.
✗ Branch 302 not taken.
✓ Branch 304 taken 1 times.
✗ Branch 305 not taken.
✓ Branch 307 taken 1 times.
✗ Branch 308 not taken.
✓ Branch 310 taken 1 times.
✗ Branch 311 not taken.
✓ Branch 313 taken 1 times.
✗ Branch 314 not taken.
✓ Branch 316 taken 1 times.
✗ Branch 317 not taken.
✓ Branch 319 taken 1 times.
✗ Branch 320 not taken.
✓ Branch 322 taken 1 times.
✗ Branch 323 not taken.
✓ Branch 325 taken 1 times.
✗ Branch 326 not taken.
✓ Branch 328 taken 1 times.
✗ Branch 329 not taken.
✓ Branch 331 taken 1 times.
✗ Branch 332 not taken.
✓ Branch 334 taken 1 times.
✗ Branch 335 not taken.
✓ Branch 337 taken 1 times.
✗ Branch 338 not taken.
✓ Branch 340 taken 1 times.
✗ Branch 341 not taken.
✓ Branch 343 taken 1 times.
✗ Branch 344 not taken.
✓ Branch 346 taken 1 times.
✗ Branch 347 not taken.
✓ Branch 349 taken 1 times.
✗ Branch 350 not taken.
✓ Branch 352 taken 1 times.
✗ Branch 353 not taken.
✓ Branch 355 taken 1 times.
✗ Branch 356 not taken.
✓ Branch 358 taken 1 times.
✗ Branch 359 not taken.
144 { return this->gridView().size(1); }
580
581 const std::vector<GridIndexType>& scvfIndicesOfScv(GridIndexType scvIdx) const
582 17570 { return scvfIndicesOfScv_[scvIdx]; }
583
584 GridIndexType localToGlobalScvfIndex(GridIndexType eIdx, LocalIndexType localScvfIdx) const
585 {
586 12600 return localToGlobalScvfIndices_[eIdx][localScvfIdx];
587 }
588
589 /*!
590 * \brief Returns the connectivity map of which dofs have derivatives with respect
591 * to a given dof.
592 */
593 const ConnectivityMap &connectivityMap() const
594
25/50
✗ Branch 0 not taken.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 25 times.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 25 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 25 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 25 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 25 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 25 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 25 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 25 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 25 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 25 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 25 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 25 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 25 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 25 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 25 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 25 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 25 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 25 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 25 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 25 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 25 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 25 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 4800 times.
✗ Branch 50 not taken.
5400 { return connectivityMap_; }
595
596 //! Returns a pointer the cell center specific auxiliary class. Required for the multi-domain FVAssembler's ctor.
597 std::unique_ptr<CellCenterFVGridGeometry<ThisType>> cellCenterFVGridGeometryPtr() const
598 {
599 return std::make_unique<CellCenterFVGridGeometry<ThisType>>(this);
600 }
601
602 //! Returns a pointer the face specific auxiliary class. Required for the multi-domain FVAssembler's ctor.
603 std::unique_ptr<FaceFVGridGeometry<ThisType>> faceFVGridGeometryPtr() const
604 {
605 return std::make_unique<FaceFVGridGeometry<ThisType>>(this);
606 }
607
608 //! Return a copy of the cell center specific auxiliary class.
609 CellCenterFVGridGeometry<ThisType> cellCenterFVGridGeometry() const
610 {
611 return CellCenterFVGridGeometry<ThisType>(this);
612 }
613
614 //! Return a copy of the face specific auxiliary class.
615 FaceFVGridGeometry<ThisType> faceFVGridGeometry() const
616 {
617 return FaceFVGridGeometry<ThisType>(this);
618 }
619
620 //! Return a reference to the intersection mapper
621 const IntersectionMapper& intersectionMapper() const
622 {
623 35140 return intersectionMapper_;
624 }
625
626 //! Return the neighbor volVar indices for all scvfs in the scv with index scvIdx
627 const std::vector<GridIndexType>& neighborVolVarIndices(GridIndexType scvIdx) const
628 17570 { return neighborVolVarIndices_[scvIdx]; }
629
630 private:
631
632 void updateIntersectionMapper_()
633 {
634 intersectionMapper_.update(this->gridView());
635 }
636
637 1 void update_()
638 {
639 // clear containers (necessary after grid refinement)
640 1 scvfIndicesOfScv_.clear();
641 1 neighborVolVarIndices_.clear();
642 1 localToGlobalScvfIndices_.clear();
643
644 1 numScvs_ = numCellCenterDofs();
645 1 numScvf_ = 0;
646 1 numBoundaryScvf_ = 0;
647 1 scvfIndicesOfScv_.resize(numScvs_);
648 1 localToGlobalScvfIndices_.resize(numScvs_);
649 1 neighborVolVarIndices_.resize(numScvs_);
650
651 // Build the scvs and scv faces
652
1/2
✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
52 for (const auto& element : elements(this->gridView()))
653 {
654 50 auto eIdx = this->elementMapper().index(element);
655
656 // the element-wise index sets for finite volume geometry
657
1/2
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
25 auto numLocalFaces = intersectionMapper_.numFaces(element);
658
1/4
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
50 std::vector<GridIndexType> scvfsIndexSet;
659
1/2
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
25 scvfsIndexSet.reserve(numLocalFaces);
660
2/4
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
50 localToGlobalScvfIndices_[eIdx].resize(numLocalFaces);
661
662
3/6
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 25 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 25 times.
✗ Branch 6 not taken.
75 std::vector<GridIndexType> neighborVolVarIndexSet;
663
1/2
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
25 neighborVolVarIndexSet.reserve(numLocalFaces);
664
665
2/2
✓ Branch 2 taken 25 times.
✓ Branch 3 taken 100 times.
150 for (const auto& intersection : intersections(this->gridView(), element))
666 {
667
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
100 const auto localFaceIndex = intersection.indexInInside();
668
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 localToGlobalScvfIndices_[eIdx][localFaceIndex] = numScvf_;
669
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
100 scvfsIndexSet.push_back(numScvf_++);
670
671
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 10 times.
100 if (intersection.neighbor())
672 {
673 240 const auto nIdx = this->elementMapper().index(intersection.outside());
674
1/2
✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
80 neighborVolVarIndexSet.emplace_back(nIdx);
675 }
676 else
677
1/4
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
20 neighborVolVarIndexSet.emplace_back(numScvs_ + numBoundaryScvf_++);
678 }
679
680 // Save the scvf indices belonging to this scv to build up fv element geometries fast
681
2/4
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
50 scvfIndicesOfScv_[eIdx] = scvfsIndexSet;
682
2/4
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
50 neighborVolVarIndices_[eIdx] = neighborVolVarIndexSet;
683 }
684
685 // build the connectivity map for an efficient assembly
686 1 connectivityMap_.update(*this);
687 1 }
688
689 //! Information on the global number of geometries
690 std::size_t numScvs_;
691 std::size_t numScvf_;
692 std::size_t numBoundaryScvf_;
693 std::vector<std::vector<GridIndexType>> localToGlobalScvfIndices_;
694 std::vector<std::vector<GridIndexType>> neighborVolVarIndices_;
695
696 // mappers
697 ConnectivityMap connectivityMap_;
698 IntersectionMapper intersectionMapper_;
699
700 //! vectors that store the global data
701 std::vector<std::vector<GridIndexType>> scvfIndicesOfScv_;
702 };
703
704 } // end namespace
705
706 #endif
707