GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: dumux/dumux/discretization/staggered/freeflow/gridvolumevariables.hh
Date: 2025-04-12 19:19:20
Exec Total Coverage
Lines: 57 60 95.0%
Functions: 118 118 100.0%
Branches: 169 494 34.2%

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-FileCopyrightText: 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::StaggeredGridVolumeVariables
11 */
12 #ifndef DUMUX_DISCRETIZATION_STAGGERED_GRID_VOLUMEVARIABLES_HH
13 #define DUMUX_DISCRETIZATION_STAGGERED_GRID_VOLUMEVARIABLES_HH
14
15 #include <dune/common/exceptions.hh>
16 #include <dune/common/rangeutilities.hh>
17
18 // make the local view function available whenever we use this class
19 #include <dumux/discretization/localview.hh>
20 #include <dumux/discretization/staggered/elementsolution.hh>
21 #include <dumux/discretization/staggered/freeflow/elementvolumevariables.hh>
22
23 namespace Dumux {
24
25 template<class P, class VV>
26 struct StaggeredGridDefaultGridVolumeVariablesTraits
27 {
28 using Problem = P;
29 using VolumeVariables = VV;
30 using PrimaryVariables = typename VV::PrimaryVariables;
31
32 template<class GridVolumeVariables, bool cachingEnabled>
33 using LocalView = StaggeredElementVolumeVariables<GridVolumeVariables, cachingEnabled>;
34
35 //! Returns the primary variables used for the boundary volVars and checks for admissible
36 //! combinations for boundary conditions.
37 template<class Problem, class SolutionVector, class Element, class SubControlVolumeFace>
38 706024 static PrimaryVariables getBoundaryPriVars(const Problem& problem,
39 const SolutionVector& sol,
40 const Element& element,
41 const SubControlVolumeFace& scvf)
42 {
43 using CellCenterPrimaryVariables = typename SolutionVector::value_type;
44 using Indices = typename VolumeVariables::Indices;
45 static constexpr auto dim = PrimaryVariables::dimension - CellCenterPrimaryVariables::dimension;
46 static constexpr auto offset = dim;
47
48 706024 const auto bcTypes = problem.boundaryTypes(element, scvf);
49 706024 PrimaryVariables boundaryPriVars(0.0);
50
51 // make sure to not use outflow BC for momentum balance
52
2/2
✓ Branch 0 taken 1411088 times.
✓ Branch 1 taken 705544 times.
2118072 for(int i = 0; i < dim; ++i)
53 {
54
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1411088 times.
1412048 if(bcTypes.isOutflow(Indices::velocity(i)))
55
0/20
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 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.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
1412048 DUNE_THROW(Dune::InvalidStateException, "Outflow condition cannot be used for velocity. Set only a Dirichlet value for pressure instead.");
56 }
57
58
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 705544 times.
706024 if(bcTypes.isOutflow(Indices::pressureIdx))
59
2/22
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 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.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 33 taken 259608 times.
✓ Branch 34 taken 445936 times.
706024 DUNE_THROW(Dune::InvalidStateException, "Outflow condition cannot be used for pressure. Set only a Dirichlet value for velocity instead.");
60
61 // Determine the pressure value at a boundary with a Dirichlet condition for velocity.
62 // This just takes the value of the adjacent inner cell.
63
4/6
✓ Branch 0 taken 259608 times.
✓ Branch 1 taken 445936 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 259608 times.
✓ Branch 4 taken 445936 times.
✗ Branch 5 not taken.
706024 if(bcTypes.isDirichlet(Indices::velocity(scvf.directionIndex())))
64 {
65
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 445936 times.
446056 if(bcTypes.isDirichlet(Indices::pressureIdx))
66 DUNE_THROW(Dune::InvalidStateException, "A Dirichlet condition for velocity must not be combined with a Dirichlet condition for pressure");
67 else
68 446056 boundaryPriVars[Indices::pressureIdx] = sol[scvf.insideScvIdx()][Indices::pressureIdx - offset];
69 // TODO: pressure could be extrapolated to the boundary
70 }
71
72 // Determine the pressure value for a boundary with a Dirichlet condition for pressure.
73 // Takes a value specified in the problem.
74
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 508434 times.
508914 if(bcTypes.isDirichlet(Indices::pressureIdx))
75 {
76
2/4
✓ Branch 0 taken 197110 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 197110 times.
197110 if(bcTypes.isDirichlet(Indices::velocity(scvf.directionIndex())))
77
0/20
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 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.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
53912 DUNE_THROW(Dune::InvalidStateException, "A Dirichlet condition for velocity must not be combined with a Dirichlet condition for pressure");
78 else
79 197110 boundaryPriVars[Indices::pressureIdx] = problem.dirichlet(element, scvf)[Indices::pressureIdx];
80 }
81
82 // Return for isothermal single-phase systems ...
83 if(CellCenterPrimaryVariables::dimension == 1)
84 return boundaryPriVars;
85
86 // ... or handle values for components, temperature, etc.
87
2/2
✓ Branch 0 taken 2123928 times.
✓ Branch 1 taken 639252 times.
2765100 for(int eqIdx = offset; eqIdx < PrimaryVariables::dimension; ++eqIdx)
88 {
89
2/2
✓ Branch 0 taken 639252 times.
✓ Branch 1 taken 1484676 times.
2125408 if(eqIdx == Indices::pressureIdx)
90 639692 continue;
91
92
3/4
✓ Branch 0 taken 676590 times.
✓ Branch 1 taken 808086 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 676590 times.
1485716 if(bcTypes.isDirichlet(eqIdx))
93 808506 boundaryPriVars[eqIdx] = problem.dirichlet(element, scvf)[eqIdx];
94
7/8
✓ Branch 0 taken 211052 times.
✓ Branch 1 taken 465538 times.
✓ Branch 2 taken 109882 times.
✓ Branch 3 taken 101170 times.
✓ Branch 4 taken 900 times.
✓ Branch 5 taken 108982 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 900 times.
677490 else if(bcTypes.isOutflow(eqIdx) || bcTypes.isSymmetry() || bcTypes.isNeumann(eqIdx))
95 675690 boundaryPriVars[eqIdx] = sol[scvf.insideScvIdx()][eqIdx - offset];
96 }
97
98 // make sure that a potential outflow condition is set for all components
99 std::array<bool, VolumeVariables::numFluidComponents() - 1> isComponentOutflow;
100
2/2
✓ Branch 0 taken 291188 times.
✓ Branch 1 taken 281508 times.
931120 for(int compIdx = 1; compIdx < VolumeVariables::numFluidComponents(); ++compIdx)
101 {
102 291428 const auto eqIdx = VolumeVariables::Indices::conti0EqIdx + compIdx;
103 291428 isComponentOutflow[compIdx -1] = bcTypes.isOutflow(eqIdx);
104 }
105
106
3/4
✓ Branch 0 taken 83636 times.
✓ Branch 1 taken 197872 times.
✓ Branch 2 taken 83636 times.
✗ Branch 3 not taken.
365384 if(Dune::any_true(isComponentOutflow) && !Dune::all_true(isComponentOutflow))
107
0/20
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 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.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
639692 DUNE_THROW(Dune::InvalidStateException, "Outflow condition must be set for all components!");
108
109 return boundaryPriVars;
110 }
111 };
112
113 /*!
114 * \ingroup StaggeredDiscretization
115 * \brief Grid volume variables class for staggered models
116 */
117 template<class Traits, bool cachingEnabled>
118 class StaggeredGridVolumeVariables;
119
120 /*!
121 * \ingroup StaggeredDiscretization
122 * \brief Grid volume variables class for staggered models.
123 Specialization in case of storing the volume variables
124 */
125 template<class Traits>
126 1334 class StaggeredGridVolumeVariables<Traits, /*cachingEnabled*/true>
127 {
128 using ThisType = StaggeredGridVolumeVariables<Traits, true>;
129 using PrimaryVariables = typename Traits::VolumeVariables::PrimaryVariables;
130
131 public:
132 //! export the problem type
133 using Problem = typename Traits::Problem;
134
135 //! export the type of the indices
136 using Indices = typename Traits::VolumeVariables::Indices;
137
138 //! export the type of the VolumeVariables
139 using VolumeVariables = typename Traits::VolumeVariables;
140
141 //! make it possible to query if caching is enabled
142 static constexpr bool cachingEnabled = true;
143
144 //! export the type of the local view
145 using LocalView = typename Traits::template LocalView<ThisType, cachingEnabled>;
146
147
1/2
✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
51 StaggeredGridVolumeVariables(const Problem& problem) : problemPtr_(&problem) {}
148
149 //! Update all volume variables
150 template<class GridGeometry, class SolutionVector>
151 5604 void update(const GridGeometry& gridGeometry, const SolutionVector& sol)
152 {
153
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5604 times.
5604 if (sol.size() != gridGeometry.numScv())
154 DUNE_THROW(Dune::InvalidStateException, "The solution vector passed to the GridVolumeVariables has the wrong size.\n"
155 << "Make sure to initialize the gridVariables correctly: \n\n"
156 << "auto ffSol = partial(sol, ffFaceIdx, ffCellCenterIdx); \n"
157 << "ffGridVariables->init(ffSol);\n\n");
158
159 5604 volumeVariables_.resize(gridGeometry.numScv());
160 5604 auto fvGeometry = localView(gridGeometry);
161
1/2
✓ Branch 2 taken 1693304 times.
✗ Branch 3 not taken.
5068704 for (const auto& element : elements(gridGeometry.gridView()))
162 {
163 1687700 fvGeometry.bindElement(element);
164
2/2
✓ Branch 0 taken 1687700 times.
✓ Branch 1 taken 1687700 times.
3375400 for (auto&& scv : scvs(fvGeometry))
165 {
166 // construct a privars object from the cell center solution vector
167
1/2
✓ Branch 1 taken 444604 times.
✗ Branch 2 not taken.
1687700 const auto& cellCenterPriVars = sol[scv.dofIndex()];
168 1687700 PrimaryVariables priVars = makePriVarsFromCellCenterPriVars<PrimaryVariables>(cellCenterPriVars);
169
170
1/2
✓ Branch 1 taken 1687700 times.
✗ Branch 2 not taken.
1687700 auto elemSol = elementSolution<typename GridGeometry::LocalView>(std::move(priVars));
171
2/4
✓ Branch 1 taken 1687700 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 407900 times.
✗ Branch 4 not taken.
2095600 volumeVariables_[scv.dofIndex()].update(elemSol, problem(), element, scv);
172 }
173 }
174 5604 }
175
176 6014686838 const VolumeVariables& volVars(const std::size_t scvIdx) const
177 6014686838 { return volumeVariables_[scvIdx]; }
178
179 VolumeVariables& volVars(const std::size_t scvIdx)
180 { return volumeVariables_[scvIdx]; }
181
182 template<class SubControlVolume, typename std::enable_if_t<!std::is_integral<SubControlVolume>::value, int> = 0>
183 const VolumeVariables& volVars(const SubControlVolume& scv) const
184 { return volumeVariables_[scv.dofIndex()]; }
185
186 template<class SubControlVolume, typename std::enable_if_t<!std::is_integral<SubControlVolume>::value, int> = 0>
187 22228590 VolumeVariables& volVars(const SubControlVolume& scv)
188 22228590 { return volumeVariables_[scv.dofIndex()]; }
189
190
1/2
✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
51 const Problem& problem() const
191
28/36
✓ Branch 1 taken 1331 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 120800 times.
✓ Branch 9 taken 15000 times.
✓ Branch 10 taken 360140 times.
✓ Branch 12 taken 15000 times.
✓ Branch 13 taken 360140 times.
✓ Branch 16 taken 3300 times.
✓ Branch 17 taken 97008 times.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 15 times.
✓ Branch 22 taken 20000 times.
✓ Branch 23 taken 434096 times.
✓ Branch 26 taken 14 times.
✓ Branch 27 taken 79 times.
✓ Branch 30 taken 1 times.
✓ Branch 31 taken 79 times.
✓ Branch 32 taken 50 times.
✓ Branch 33 taken 2578 times.
✓ Branch 35 taken 1 times.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✓ Branch 8 taken 985432 times.
✓ Branch 11 taken 985432 times.
✓ Branch 15 taken 604756 times.
✓ Branch 18 taken 35 times.
✓ Branch 21 taken 1233604 times.
✓ Branch 24 taken 35 times.
✗ Branch 14 not taken.
✗ Branch 25 not taken.
✗ Branch 6 not taken.
✗ Branch 28 not taken.
✗ Branch 34 not taken.
✓ Branch 39 taken 2 times.
13674283 { return *problemPtr_; }
192
193 //! Returns the primary variables used for the boundary volVars and checks for admissible
194 //! combinations for boundary conditions.
195 template<class... Args>
196 705064 PrimaryVariables getBoundaryPriVars(Args&&... args) const
197 {
198
1/2
✓ Branch 1 taken 705064 times.
✗ Branch 2 not taken.
705064 return Traits::getBoundaryPriVars(std::forward<Args>(args)...);
199 }
200
201 private:
202 const Problem* problemPtr_;
203 std::vector<VolumeVariables> volumeVariables_;
204 };
205
206
207 /*!
208 * \ingroup StaggeredDiscretization
209 * \brief Grid volume variables class for staggered models.
210 Specialization in case of not storing the volume variables
211 */
212 template<class Traits>
213 class StaggeredGridVolumeVariables<Traits, /*cachingEnabled*/false>
214 {
215 using ThisType = StaggeredGridVolumeVariables<Traits, false>;
216 using PrimaryVariables = typename Traits::VolumeVariables::PrimaryVariables;
217
218 public:
219 //! export the problem type
220 using Problem = typename Traits::Problem;
221
222 //! export the type of the VolumeVariables
223 using VolumeVariables = typename Traits::VolumeVariables;
224
225 //! make it possible to query if caching is enabled
226 static constexpr bool cachingEnabled = false;
227
228 //! export the type of the local view
229 using LocalView = typename Traits::template LocalView<ThisType, cachingEnabled>;
230
231
24/48
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
24 StaggeredGridVolumeVariables(const Problem& problem) : problemPtr_(&problem) {}
232
233 template<class GridGeometry, class SolutionVector>
234 48 void update(const GridGeometry& gridGeometry, const SolutionVector& sol)
235 {
236
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
48 if (sol.size() != gridGeometry.numScv())
237 DUNE_THROW(Dune::InvalidStateException, "The solution vector passed to the GridVolumeVariables has the wrong size.\n"
238 << "Make sure to initialize the gridVariables correctly: \n\n"
239 << "auto ffSol = partial(sol, ffFaceIdx, ffCellCenterIdx); \n"
240 << "ffGridVariables->init(ffSol);\n\n");
241 48 }
242
243
24/48
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
24 const Problem& problem() const
244
24/96
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 120 not taken.
✓ Branch 121 taken 1 times.
✗ Branch 122 not taken.
✓ Branch 123 taken 1 times.
✗ Branch 124 not taken.
✓ Branch 125 taken 1 times.
✗ Branch 126 not taken.
✓ Branch 127 taken 1 times.
✗ Branch 128 not taken.
✓ Branch 129 taken 1 times.
✗ Branch 130 not taken.
✓ Branch 131 taken 1 times.
✗ Branch 132 not taken.
✓ Branch 133 taken 1 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 1 times.
✗ Branch 136 not taken.
✓ Branch 137 taken 1 times.
✗ Branch 138 not taken.
✓ Branch 139 taken 1 times.
✗ Branch 140 not taken.
✓ Branch 141 taken 1 times.
✗ Branch 142 not taken.
✓ Branch 143 taken 1 times.
✗ Branch 144 not taken.
✓ Branch 145 taken 1 times.
✗ Branch 146 not taken.
✓ Branch 147 taken 1 times.
✗ Branch 148 not taken.
✓ Branch 149 taken 1 times.
✗ Branch 150 not taken.
✓ Branch 151 taken 1 times.
✗ Branch 152 not taken.
✓ Branch 153 taken 1 times.
✗ Branch 154 not taken.
✓ Branch 155 taken 1 times.
✗ Branch 156 not taken.
✓ Branch 157 taken 1 times.
✗ Branch 158 not taken.
✓ Branch 159 taken 1 times.
✗ Branch 160 not taken.
✓ Branch 161 taken 1 times.
✗ Branch 162 not taken.
✓ Branch 163 taken 1 times.
✗ Branch 164 not taken.
✓ Branch 165 taken 1 times.
✗ Branch 166 not taken.
✓ Branch 167 taken 1 times.
648 { return *problemPtr_;}
245
246 //! Returns the primary variables used for the boundary volVars and checks for admissible
247 //! combinations for boundary conditions.
248 template<class... Args>
249 480 PrimaryVariables getBoundaryPriVars(Args&&... args) const
250 {
251
24/48
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 20 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 20 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 20 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 20 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 20 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 20 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 20 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 20 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 20 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 20 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 20 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 20 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 20 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 20 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 20 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 20 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 20 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 20 times.
✗ Branch 71 not taken.
480 return Traits::getBoundaryPriVars(std::forward<Args>(args)...);
252 }
253
254 private:
255
256 const Problem* problemPtr_;
257 };
258
259 } // end namespace Dumux
260
261 #endif
262