GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: dumux/dumux/common/pdesolver.hh
Date: 2025-04-12 19:19:20
Exec Total Coverage
Lines: 17 21 81.0%
Functions: 582 908 64.1%
Branches: 128 251 51.0%

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 Core
10 * \brief Defines a high-level interface for a PDESolver
11 */
12 #ifndef DUMUX_COMMON_PDESOLVER_HH
13 #define DUMUX_COMMON_PDESOLVER_HH
14
15 #include <memory>
16 #include <utility>
17
18 #include <dune/common/hybridutilities.hh>
19 #include <dune/common/std/type_traits.hh>
20
21 #include <dumux/common/timeloop.hh>
22
23 // forward declare
24 namespace Dune {
25 template <class FirstRow, class ... Args>
26 class MultiTypeBlockMatrix;
27 } // end namespace Dune
28
29 namespace Dumux::Detail::PDESolver {
30
31 template<class Assembler>
32 using AssemblerVariablesType = typename Assembler::Variables;
33
34 template<class Assembler>
35 inline constexpr bool assemblerExportsVariables = Dune::Std::is_detected_v<AssemblerVariablesType, Assembler>;
36
37 template<class A, bool exports = assemblerExportsVariables<A>> struct VariablesChooser;
38 template<class A> struct VariablesChooser<A, true> { using Type = AssemblerVariablesType<A>; };
39 template<class A> struct VariablesChooser<A, false> { using Type = typename A::SolutionVector; };
40
41 template<class Assembler>
42 using AssemblerVariables = typename VariablesChooser<Assembler>::Type;
43
44 } // end namespace Dumux::Detail::PDESolver
45
46 namespace Dumux {
47
48 /*!
49 * \ingroup Core
50 * \brief A high-level interface for a PDESolver
51 *
52 * A PDESolver is constructed with an assembler and a linear solver
53 * and has a method solve that linearizes (if not already linear), assembles, solves and updates
54 * given an initial solution producing a new solution.
55 *
56 * \tparam A Assembler for linearized system of the PDE
57 * \tparam LS Linear system solver
58 */
59 template<class A, class LS>
60 class PDESolver
61 {
62 using Scalar = typename A::Scalar;
63 using TimeLoop = TimeLoopBase<Scalar>;
64
65 public:
66 //! export the assembler and linear solver types
67 using Assembler = A;
68 using LinearSolver = LS;
69
70 //! export the type of variables that represent a numerical solution
71 using Variables = Detail::PDESolver::AssemblerVariables<Assembler>;
72
73 /*!
74 * \brief Constructor
75 * \param assembler pointer to the assembler of the linear system
76 * \param linearSolver pointer to the solver of the resulting linear system
77 */
78 591 PDESolver(std::shared_ptr<Assembler> assembler,
79 std::shared_ptr<LinearSolver> linearSolver)
80 1182 : assembler_(assembler)
81 591 , linearSolver_(linearSolver)
82 591 {}
83
84
2/4
✓ Branch 0 taken 562 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 562 times.
✗ Branch 3 not taken.
2248 virtual ~PDESolver() = default;
85
86 /*!
87 * \brief Solve the given PDE system (usually assemble + solve linear system + update)
88 * \param vars instance of the `Variables` class representing a numerical
89 * solution, defining primary and possibly secondary variables
90 * and information on the time level.
91 * \return bool true if the solver converged
92 * \post If converged, the given `Variables` will represent the solution. If the solver
93 * does not converge, it may be the case that they are in some intermediate (implementation-dependent) state.
94 */
95 virtual bool apply(Variables& vars) = 0;
96
97 /*!
98 * \brief Solve the given PDE system (usually assemble + solve linear system + update)
99 * \param vars instance of the `Variables` class representing a numerical
100 * solution, defining primary and possibly secondary variables
101 * and information on the time level.
102 */
103 virtual void solve(Variables& vars) = 0;
104
105 /*!
106 * \brief Solve the given PDE system with time step control
107 * \note This is used for solvers that are allowed to e.g. automatically reduce the
108 * time step if the solve was not successful
109 * \param vars instance of the `Variables` class representing a numerical solution
110 * \param timeLoop a reference to the current time loop
111 */
112 virtual void solve(Variables& vars, TimeLoop& timeLoop)
113 {
114 // per default we just forward to the method without time step control
115 solve(vars);
116 }
117
118 /*!
119 * \brief Access the assembler
120 */
121 const Assembler& assembler() const
122 { return *assembler_; }
123
124 /*!
125 * \brief Access the assembler
126 */
127
5/10
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
76938 Assembler& assembler()
128
73/160
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 376627 times.
✓ Branch 8 taken 2820 times.
✓ Branch 9 taken 3231 times.
✓ Branch 13 taken 4977 times.
✓ Branch 14 taken 87 times.
✓ Branch 18 taken 219 times.
✓ Branch 19 taken 238 times.
✓ Branch 23 taken 1296 times.
✓ Branch 24 taken 1785 times.
✓ Branch 28 taken 53 times.
✓ Branch 29 taken 311 times.
✓ Branch 31 taken 58 times.
✓ Branch 32 taken 22 times.
✓ Branch 34 taken 8 times.
✗ Branch 35 not taken.
✓ Branch 39 taken 5 times.
✗ Branch 40 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 7 times.
✓ Branch 45 taken 4 times.
✗ Branch 46 not taken.
✓ Branch 50 taken 3 times.
✓ Branch 51 taken 10 times.
✓ Branch 53 taken 1 times.
✗ Branch 54 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✓ Branch 61 taken 4 times.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✓ Branch 72 taken 4 times.
✗ Branch 73 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✓ Branch 82 taken 5 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 1 times.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✓ Branch 93 taken 2 times.
✓ Branch 94 taken 2 times.
✓ Branch 95 taken 2 times.
✗ Branch 96 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✓ Branch 110 taken 5 times.
✗ Branch 111 not taken.
✓ Branch 113 taken 1 times.
✗ Branch 114 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✓ Branch 121 taken 2 times.
✓ Branch 122 taken 2 times.
✓ Branch 123 taken 2 times.
✗ Branch 124 not taken.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✓ Branch 138 taken 3 times.
✗ Branch 139 not taken.
✓ Branch 141 taken 1 times.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✓ Branch 149 taken 2 times.
✓ Branch 150 taken 1 times.
✓ Branch 151 taken 2 times.
✗ Branch 152 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✓ Branch 166 taken 4 times.
✗ Branch 167 not taken.
✓ Branch 169 taken 1 times.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
✓ Branch 177 taken 2 times.
✓ Branch 178 taken 2 times.
✓ Branch 179 taken 2 times.
✗ Branch 180 not taken.
✗ Branch 186 not taken.
✗ Branch 187 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✓ Branch 194 taken 4 times.
✗ Branch 195 not taken.
✓ Branch 197 taken 1 times.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✓ Branch 205 taken 2 times.
✓ Branch 206 taken 2 times.
✓ Branch 207 taken 2 times.
✗ Branch 208 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✓ Branch 221 taken 1 times.
✗ Branch 222 not taken.
✓ Branch 225 taken 1 times.
✗ Branch 226 not taken.
✓ Branch 229 taken 1 times.
✗ Branch 230 not taken.
✓ Branch 233 taken 1 times.
✗ Branch 234 not taken.
✓ Branch 237 taken 1 times.
✗ Branch 238 not taken.
✓ Branch 1 taken 810 times.
✓ Branch 2 taken 13 times.
✓ Branch 5 taken 96426 times.
✓ Branch 10 taken 240 times.
✓ Branch 11 taken 332 times.
✓ Branch 21 taken 4192 times.
✓ Branch 22 taken 696 times.
✓ Branch 25 taken 856 times.
✓ Branch 26 taken 489 times.
✓ Branch 27 taken 4800 times.
✓ Branch 30 taken 2 times.
✓ Branch 6 taken 378 times.
✓ Branch 7 taken 32809 times.
✓ Branch 12 taken 621 times.
✓ Branch 15 taken 273 times.
✓ Branch 16 taken 85 times.
✓ Branch 20 taken 331 times.
✗ Branch 17 not taken.
✗ Branch 0 not taken.
✗ Branch 33 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 38 not taken.
✗ Branch 41 not taken.
✗ Branch 44 not taken.
✓ Branch 47 taken 8 times.
✗ Branch 48 not taken.
✗ Branch 37 not taken.
✓ Branch 55 taken 6 times.
✗ Branch 49 not taken.
✗ Branch 52 not taken.
1158331 { return *assembler_; }
129
130 /*!
131 * \brief Access the linear solver
132 */
133 const LinearSolver& linearSolver() const
134 { return *linearSolver_; }
135
136 protected:
137
138 /*!
139 * \brief Access the linear solver
140 */
141 84683 LinearSolver& linearSolver()
142
16/26
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 15011 times.
✓ Branch 6 taken 839 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 11 taken 12 times.
✓ Branch 14 taken 16 times.
✗ Branch 15 not taken.
✓ Branch 18 taken 4 times.
✗ Branch 19 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 5 taken 97 times.
✓ Branch 8 taken 16 times.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✓ Branch 1 taken 85 times.
✓ Branch 4 taken 5 times.
84715 { return *linearSolver_; }
143
144 /*!
145 * \brief Helper function to assure the MultiTypeBlockMatrix's sub-blocks have the correct sizes.
146 */
147 template <class FirstRow, class ... Args>
148 7605 bool checkSizesOfSubMatrices(const Dune::MultiTypeBlockMatrix<FirstRow, Args...>& matrix) const
149 {
150
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6676 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
7605 bool matrixHasCorrectSize = true;
151 using namespace Dune::Hybrid;
152
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 7593 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 929 times.
9439 forEach(std::make_index_sequence<Dune::MultiTypeBlockMatrix<FirstRow, Args...>::N()>(), [&](const auto i)
153 {
154
5/8
✗ Branch 0 not taken.
✓ Branch 1 taken 7593 times.
✓ Branch 2 taken 6676 times.
✓ Branch 3 taken 917 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 929 times.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
9439 const auto& row = matrix[i];
155
5/8
✗ Branch 0 not taken.
✓ Branch 1 taken 7593 times.
✓ Branch 2 taken 6676 times.
✓ Branch 3 taken 917 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 929 times.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
9439 const auto numRowsLeftMostBlock = row[Dune::index_constant<0>{}].N();
156
9/13
✗ Branch 0 not taken.
✓ Branch 1 taken 7593 times.
✓ Branch 2 taken 6676 times.
✓ Branch 3 taken 917 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 7593 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 917 times.
✓ Branch 8 taken 12 times.
✓ Branch 9 taken 929 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 917 times.
✓ Branch 12 taken 12 times.
7605 forEach(row, [&](const auto& subBlock)
157 {
158
8/12
✗ Branch 0 not taken.
✓ Branch 1 taken 7593 times.
✓ Branch 2 taken 6676 times.
✓ Branch 3 taken 917 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 929 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 917 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 917 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 917 times.
7605 if (subBlock.N() != numRowsLeftMostBlock)
159 matrixHasCorrectSize = false;
160 });
161 });
162
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 917 times.
917 return matrixHasCorrectSize;
163 }
164
165 /*!
166 * \brief Default implementation for any matrix type
167 */
168 template <class M>
169 bool checkSizesOfSubMatrices(const M&) const { return true; }
170
171 private:
172 std::shared_ptr<Assembler> assembler_;
173 std::shared_ptr<LinearSolver> linearSolver_;
174 };
175
176 } // namespace Dumux
177
178 #endif
179