GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: /builds/dumux-repositories/dumux/dumux/multidomain/couplingjacobianpattern.hh
Date: 2024-05-04 19:09:25
Exec Total Coverage
Lines: 56 56 100.0%
Functions: 133 136 97.8%
Branches: 136 195 69.7%

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 MultiDomain
10 * \brief Helper function to generate Jacobian pattern for multi domain models
11 */
12 #ifndef DUMUX_MUTLIDOMAIN_COUPLING_JACOBIAN_PATTERN_HH
13 #define DUMUX_MUTLIDOMAIN_COUPLING_JACOBIAN_PATTERN_HH
14
15 #include <type_traits>
16 #include <dune/common/indices.hh>
17 #include <dune/istl/matrixindexset.hh>
18 #include <dumux/discretization/method.hh>
19
20 namespace Dumux {
21
22 /*!
23 * \ingroup MultiDomain
24 * \brief Helper function to generate coupling Jacobian pattern (off-diagonal blocks)
25 * for cell-centered schemes
26 */
27 template<bool isImplicit, class CouplingManager, class GridGeometryI, class GridGeometryJ, std::size_t i, std::size_t j,
28 typename std::enable_if_t<( (GridGeometryI::discMethod == DiscretizationMethods::cctpfa)
29 || (GridGeometryI::discMethod == DiscretizationMethods::ccmpfa) ), int> = 0>
30 366 Dune::MatrixIndexSet getCouplingJacobianPattern(const CouplingManager& couplingManager,
31 Dune::index_constant<i> domainI,
32 const GridGeometryI& gridGeometryI,
33 Dune::index_constant<j> domainJ,
34 const GridGeometryJ& gridGeometryJ)
35 {
36
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
366 const auto numDofsI = gridGeometryI.numDofs();
37
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
366 const auto numDofsJ = gridGeometryJ.numDofs();
38
1/2
✓ Branch 1 taken 144 times.
✗ Branch 2 not taken.
366 Dune::MatrixIndexSet pattern;
39
1/2
✓ Branch 1 taken 144 times.
✗ Branch 2 not taken.
366 pattern.resize(numDofsI, numDofsJ);
40
41 // matrix pattern for implicit Jacobians
42 if (isImplicit)
43 {
44
17/19
✓ Branch 1 taken 140 times.
✓ Branch 2 taken 1903 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2042 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 951779 times.
✓ Branch 7 taken 1812 times.
✓ Branch 8 taken 68383 times.
✓ Branch 9 taken 555868 times.
✓ Branch 10 taken 998 times.
✓ Branch 11 taken 68383 times.
✓ Branch 12 taken 3536 times.
✓ Branch 13 taken 6 times.
✓ Branch 14 taken 71919 times.
✓ Branch 15 taken 6 times.
✓ Branch 17 taken 3536 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3536 times.
✗ Branch 21 not taken.
5218058 for (const auto& elementI : elements(gridGeometryI.gridView()))
45 {
46
1/2
✓ Branch 1 taken 630577 times.
✗ Branch 2 not taken.
2695441 const auto& stencil = couplingManager.couplingStencil(domainI, elementI, domainJ);
47
2/4
✓ Branch 1 taken 72911 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 72911 times.
✗ Branch 5 not taken.
5390882 const auto globalI = gridGeometryI.elementMapper().index(elementI);
48
4/4
✓ Branch 0 taken 1585198 times.
✓ Branch 1 taken 957087 times.
✓ Branch 2 taken 1585198 times.
✓ Branch 3 taken 957087 times.
12482615 for (const auto globalJ : stencil)
49
1/2
✓ Branch 1 taken 1585198 times.
✗ Branch 2 not taken.
2198146 pattern.add(globalI, globalJ);
50 }
51 }
52
53 // matrix pattern for explicit Jacobians
54 // -> diagonal matrix, so coupling block is empty
55 // just return the empty pattern
56
57 366 return pattern;
58 }
59
60 /*!
61 * \ingroup MultiDomain
62 * \brief Helper function to generate coupling Jacobian pattern (off-diagonal blocks)
63 * for the staggered scheme (degrees of freedom on cell centers)
64 */
65 template<bool isImplicit, class CouplingManager, class GridGeometryI, class GridGeometryJ, std::size_t i, std::size_t j,
66 typename std::enable_if_t<(GridGeometryI::discMethod == DiscretizationMethods::staggered &&
67 GridGeometryI::isCellCenter()), int> = 0>
68 102 Dune::MatrixIndexSet getCouplingJacobianPattern(const CouplingManager& couplingManager,
69 Dune::index_constant<i> domainI,
70 const GridGeometryI& gridGeometryI,
71 Dune::index_constant<j> domainJ,
72 const GridGeometryJ& gridGeometryJ)
73 {
74 102 Dune::MatrixIndexSet pattern(gridGeometryI.numDofs(), gridGeometryJ.numDofs());
75
76
4/8
✓ Branch 1 taken 68 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 68 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 160716 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 7000 times.
✗ Branch 11 not taken.
612724 for (const auto& elementI : elements(gridGeometryI.gridView()))
77 {
78
2/4
✓ Branch 1 taken 7000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7000 times.
✗ Branch 5 not taken.
605520 const auto ccGlobalI = gridGeometryI.elementMapper().index(elementI);
79
6/6
✓ Branch 1 taken 408424 times.
✓ Branch 2 taken 82592 times.
✓ Branch 3 taken 359124 times.
✓ Branch 4 taken 160648 times.
✓ Branch 5 taken 28756 times.
✓ Branch 6 taken 78056 times.
1590968 for (auto&& faceGlobalJ : couplingManager.couplingStencil(domainI, elementI, domainJ))
80
1/2
✓ Branch 1 taken 359124 times.
✗ Branch 2 not taken.
644104 pattern.add(ccGlobalI, faceGlobalJ);
81 }
82
83 102 return pattern;
84 }
85
86 /*!
87 * \ingroup MultiDomain
88 * \brief Helper function to generate coupling Jacobian pattern (off-diagonal blocks)
89 * for the staggered scheme (degrees of freedom on faces)
90 */
91 template<bool isImplicit, class CouplingManager, class GridGeometryI, class GridGeometryJ, std::size_t i, std::size_t j,
92 typename std::enable_if_t<(GridGeometryI::discMethod == DiscretizationMethods::staggered &&
93 GridGeometryI::isFace()), int> = 0>
94 68 Dune::MatrixIndexSet getCouplingJacobianPattern(const CouplingManager& couplingManager,
95 Dune::index_constant<i> domainI,
96 const GridGeometryI& gridGeometryI,
97 Dune::index_constant<j> domainJ,
98 const GridGeometryJ& gridGeometryJ)
99 {
100 68 Dune::MatrixIndexSet pattern(gridGeometryI.numDofs(), gridGeometryJ.numDofs());
101
102
1/2
✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
68 auto fvGeometry = localView(gridGeometryI);
103
4/8
✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 34 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 18570 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 7000 times.
✗ Branch 11 not taken.
321432 for (const auto& elementI : elements(gridGeometryI.gridView()))
104 {
105
1/2
✓ Branch 1 taken 7000 times.
✗ Branch 2 not taken.
160648 fvGeometry.bindElement(elementI);
106
107 // loop over sub control faces
108
4/4
✓ Branch 0 taken 74144 times.
✓ Branch 1 taken 18536 times.
✓ Branch 2 taken 74144 times.
✓ Branch 3 taken 18536 times.
963888 for (auto&& scvf : scvfs(fvGeometry))
109 {
110 642592 const auto faceGlobalI = scvf.dofIndex();
111
4/4
✓ Branch 1 taken 216892 times.
✓ Branch 2 taken 74144 times.
✓ Branch 3 taken 216892 times.
✓ Branch 4 taken 74144 times.
2771008 for (auto&& globalJ : couplingManager.couplingStencil(domainI, scvf, domainJ))
112
1/2
✓ Branch 1 taken 216892 times.
✗ Branch 2 not taken.
1064208 pattern.add(faceGlobalI, globalJ);
113 }
114 }
115
116 68 return pattern;
117 }
118
119 /*!
120 * \ingroup MultiDomain
121 * \brief Helper function to generate coupling Jacobian pattern (off-diagonal blocks)
122 * for the staggered scheme (degrees of freedom on cell centers)
123 */
124 template<bool isImplicit, class CouplingManager, class GridGeometryI, class GridGeometryJ, std::size_t i, std::size_t j,
125 typename std::enable_if_t<(GridGeometryI::discMethod == DiscretizationMethods::fcstaggered), int> = 0>
126 75 Dune::MatrixIndexSet getCouplingJacobianPattern(const CouplingManager& couplingManager,
127 Dune::index_constant<i> domainI,
128 const GridGeometryI& gridGeometryI,
129 Dune::index_constant<j> domainJ,
130 const GridGeometryJ& gridGeometryJ)
131 {
132 81 Dune::MatrixIndexSet pattern(gridGeometryI.numDofs(), gridGeometryJ.numDofs());
133
134
1/2
✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
75 auto fvGeometry = localView(gridGeometryI);
135
14/19
✓ Branch 1 taken 42 times.
✓ Branch 2 taken 101 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 143 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 192418 times.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 192418 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✓ Branch 11 taken 992 times.
✓ Branch 12 taken 3536 times.
✓ Branch 13 taken 6 times.
✓ Branch 14 taken 3536 times.
✓ Branch 15 taken 6 times.
✓ Branch 17 taken 3536 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3536 times.
✗ Branch 21 not taken.
467487 for (const auto& elementI : elements(gridGeometryI.gridView()))
136 {
137
1/2
✓ Branch 1 taken 5778 times.
✗ Branch 2 not taken.
467234 fvGeometry.bindElement(elementI);
138
5/5
✓ Branch 0 taken 12072 times.
✓ Branch 1 taken 776818 times.
✓ Branch 2 taken 193000 times.
✓ Branch 3 taken 773800 times.
✓ Branch 4 taken 193000 times.
2337970 for (const auto& scv : scvs(fvGeometry))
139 {
140 1870736 const auto globalI = scv.dofIndex();
141
1/2
✓ Branch 1 taken 1632 times.
✗ Branch 2 not taken.
1870736 const auto& stencil = couplingManager.couplingStencil(domainI, elementI, scv, domainJ);
142
4/4
✓ Branch 0 taken 837240 times.
✓ Branch 1 taken 785872 times.
✓ Branch 2 taken 837240 times.
✓ Branch 3 taken 785872 times.
6993180 for (const auto globalJ : stencil)
143 {
144
4/5
✗ Branch 0 not taken.
✓ Branch 1 taken 831408 times.
✓ Branch 2 taken 5832 times.
✓ Branch 3 taken 540 times.
✓ Branch 4 taken 830868 times.
1381652 assert(globalJ < gridGeometryJ.numDofs());
145
1/2
✓ Branch 1 taken 837240 times.
✗ Branch 2 not taken.
1380972 pattern.add(globalI, globalJ);
146
147
2/2
✓ Branch 0 taken 400 times.
✓ Branch 1 taken 836840 times.
1380972 if (gridGeometryI.isPeriodic())
148 {
149
2/2
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 380 times.
400 if (gridGeometryI.dofOnPeriodicBoundary(globalI))
150 {
151
1/2
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
20 const auto globalIP = gridGeometryI.periodicallyMappedDof(globalI);
152
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
20 if (globalI > globalIP)
154
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
10 pattern.add(globalIP, globalJ);
155 }
156 }
157 }
158 }
159 }
160
161 75 return pattern;
162 }
163
164 /*!
165 * \ingroup MultiDomain
166 * \brief Helper function to generate coupling Jacobian pattern (off-diagonal blocks)
167 * for control-volume finite element schemes (CVFE)
168 */
169 template<bool isImplicit, class CouplingManager, class GridGeometryI, class GridGeometryJ, std::size_t i, std::size_t j,
170 typename std::enable_if_t<DiscretizationMethods::isCVFE<typename GridGeometryI::DiscretizationMethod>, int> = 0>
171 79 Dune::MatrixIndexSet getCouplingJacobianPattern(const CouplingManager& couplingManager,
172 Dune::index_constant<i> domainI,
173 const GridGeometryI& gridGeometryI,
174 Dune::index_constant<j> domainJ,
175 const GridGeometryJ& gridGeometryJ)
176 {
177
4/16
✓ Branch 1 taken 3 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 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.
83 Dune::MatrixIndexSet pattern;
178
179 // matrix pattern for implicit Jacobians
180 if constexpr (isImplicit)
181 {
182
6/8
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
201 pattern.resize(gridGeometryI.numDofs(), gridGeometryJ.numDofs());
183
1/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
103 auto fvGeometry = localView(gridGeometryI);
184
18/21
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 20 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 28 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 77073 times.
✓ Branch 7 taken 5 times.
✓ Branch 8 taken 68383 times.
✓ Branch 9 taken 4 times.
✓ Branch 10 taken 101 times.
✓ Branch 11 taken 68383 times.
✓ Branch 12 taken 8224 times.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 76607 times.
✓ Branch 15 taken 1 times.
✓ Branch 17 taken 8224 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 8224 times.
✗ Branch 21 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
773420 for (const auto& elementI : elements(gridGeometryI.gridView()))
185 {
186
1/2
✓ Branch 1 taken 76707 times.
✗ Branch 2 not taken.
351584 fvGeometry.bindElement(elementI);
187
1/2
✓ Branch 1 taken 85214 times.
✗ Branch 2 not taken.
351584 const auto& stencil = couplingManager.couplingStencil(domainI, elementI, domainJ);
188
4/4
✓ Branch 0 taken 329818 times.
✓ Branch 1 taken 85314 times.
✓ Branch 2 taken 329818 times.
✓ Branch 3 taken 85314 times.
2066767 for (const auto& scv : scvs(fvGeometry))
189 {
190
4/4
✓ Branch 0 taken 254682 times.
✓ Branch 1 taken 329818 times.
✓ Branch 2 taken 254282 times.
✓ Branch 3 taken 329418 times.
10661246 for (const auto globalJ : stencil)
191
1/2
✓ Branch 1 taken 254682 times.
✗ Branch 2 not taken.
3282541 pattern.add(scv.dofIndex(), globalJ);
192
193 }
194 }
195 }
196
197 // matrix pattern for explicit Jacobians
198 // -> diagonal matrix, so coupling block is empty
199 // just return the empty pattern
200
201 79 return pattern;
202 }
203
204 } // end namespace Dumux
205
206 #endif
207