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 CCDiscretization | ||
10 | * \brief The local element solution class for cell-centered methods | ||
11 | */ | ||
12 | #ifndef DUMUX_CC_ELEMENT_SOLUTION_HH | ||
13 | #define DUMUX_CC_ELEMENT_SOLUTION_HH | ||
14 | |||
15 | #include <cassert> | ||
16 | #include <utility> | ||
17 | #include <type_traits> | ||
18 | #include <dumux/discretization/method.hh> | ||
19 | |||
20 | namespace Dumux { | ||
21 | |||
22 | /*! | ||
23 | * \ingroup CCDiscretization | ||
24 | * \brief The element solution vector | ||
25 | */ | ||
26 | template<class FVElementGeometry, class PV> | ||
27 | class CCElementSolution | ||
28 | { | ||
29 | using GridGeometry = typename FVElementGeometry::GridGeometry; | ||
30 | using GridView = typename GridGeometry::GridView; | ||
31 | using Element = typename GridView::template Codim<0>::Entity; | ||
32 | |||
33 | public: | ||
34 | //! export the primary variables type | ||
35 | using PrimaryVariables = PV; | ||
36 | |||
37 | //! default constructor | ||
38 | 112 | CCElementSolution() = default; | |
39 | |||
40 | //! Constructor with element, solution vector and grid geometry | ||
41 | template<class SolutionVector> | ||
42 | 935438 | CCElementSolution(const Element& element, const SolutionVector& sol, | |
43 | const GridGeometry& gridGeometry) | ||
44 |
46/60✓ Branch 1 taken 2653395 times.
✓ Branch 2 taken 49144 times.
✓ Branch 3 taken 4902090 times.
✓ Branch 4 taken 2461945 times.
✓ Branch 5 taken 1616022 times.
✓ Branch 6 taken 26592770 times.
✓ Branch 7 taken 438584 times.
✓ Branch 8 taken 1235288 times.
✓ Branch 9 taken 1092573 times.
✓ Branch 10 taken 2373302 times.
✓ Branch 11 taken 1541117 times.
✓ Branch 12 taken 43098 times.
✓ Branch 13 taken 2381190 times.
✓ Branch 14 taken 3562537 times.
✓ Branch 15 taken 1208768 times.
✓ Branch 16 taken 2383005 times.
✓ Branch 17 taken 2747044 times.
✓ Branch 18 taken 10765 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 53679 times.
✓ Branch 21 taken 360 times.
✓ Branch 22 taken 3102 times.
✓ Branch 23 taken 1117555 times.
✓ Branch 24 taken 360 times.
✓ Branch 25 taken 1528143 times.
✓ Branch 26 taken 1170389 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4069595 times.
✓ Branch 29 taken 105913 times.
✓ Branch 30 taken 52000 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 168434 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 19092 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 3045500 times.
✓ Branch 38 taken 48 times.
✓ Branch 39 taken 12172000 times.
✓ Branch 40 taken 3045500 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 12172000 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 100000 times.
✓ Branch 45 taken 21948 times.
✓ Branch 46 taken 517000 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 21948 times.
✗ Branch 49 not taken.
✓ Branch 54 taken 528 times.
✓ Branch 55 taken 24056 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 97376 times.
✓ Branch 58 taken 24056 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 97376 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 304 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1354 times.
✗ Branch 65 not taken.
|
228163603 | : CCElementSolution(sol[gridGeometry.elementMapper().index(element)]) |
45 | 935438 | {} | |
46 | |||
47 | //! Constructor with element, element volume variables and fv element geometry | ||
48 | template<class ElementVolumeVariables> | ||
49 | 2050 | CCElementSolution(const Element& element, const ElementVolumeVariables& elemVolVars, | |
50 | const FVElementGeometry& fvGeometry) | ||
51 | 2050 | { | |
52 |
4/4✓ Branch 0 taken 2050 times.
✓ Branch 1 taken 2050 times.
✓ Branch 2 taken 2050 times.
✓ Branch 3 taken 2050 times.
|
8200 | for (const auto& scv : scvs(fvGeometry)) |
53 | 2050 | priVars_ = elemVolVars[scv].priVars(); | |
54 | 2050 | } | |
55 | |||
56 | //! Constructor with a primary variable object | ||
57 | 1985923 | CCElementSolution(PrimaryVariables&& priVars) | |
58 | 1985923 | : priVars_(std::move(priVars)) {} | |
59 | |||
60 | //! Constructor with a primary variable object | ||
61 | 74165155 | CCElementSolution(const PrimaryVariables& priVars) | |
62 | 229539590 | : priVars_(priVars) {} | |
63 | |||
64 | //! extract the element solution from the solution vector using a mapper | ||
65 | template<class SolutionVector> | ||
66 | void update(const Element& element, const SolutionVector& sol, | ||
67 | const GridGeometry& gridGeometry) | ||
68 | { | ||
69 | priVars_ = sol[gridGeometry.elementMapper().index(element)]; | ||
70 | } | ||
71 | |||
72 | //! return the size of the element solution | ||
73 | constexpr std::size_t size() const | ||
74 | { return 1; } | ||
75 | |||
76 | //! bracket operator const access | ||
77 | template<typename IndexType> | ||
78 | const PrimaryVariables& operator [](IndexType i) const | ||
79 | { | ||
80 | assert(i == 0 && "Index exceeds valid range!"); | ||
81 |
5/10✓ Branch 0 taken 3668493 times.
✓ Branch 1 taken 54548944 times.
✓ Branch 2 taken 2940 times.
✓ Branch 3 taken 792000 times.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
162909001 | return priVars_; |
82 | } | ||
83 | |||
84 | //! bracket operator access | ||
85 | template<typename IndexType> | ||
86 | PrimaryVariables& operator [](IndexType i) | ||
87 | { | ||
88 | assert(i == 0 && "Index exceeds valid range!"); | ||
89 | 59189174 | return priVars_; | |
90 | } | ||
91 | |||
92 | private: | ||
93 | PrimaryVariables priVars_; | ||
94 | }; | ||
95 | |||
96 | /*! | ||
97 | * \ingroup Discretization | ||
98 | * \brief Make an element solution for cell-centered schemes | ||
99 | */ | ||
100 | template<class Element, class SolutionVector, class GridGeometry> | ||
101 | auto elementSolution(const Element& element, const SolutionVector& sol, const GridGeometry& gg) | ||
102 | -> std::enable_if_t<GridGeometry::discMethod == DiscretizationMethods::cctpfa || | ||
103 | GridGeometry::discMethod == DiscretizationMethods::ccmpfa, | ||
104 | CCElementSolution<typename GridGeometry::LocalView, | ||
105 | std::decay_t<decltype(std::declval<SolutionVector>()[0])>> | ||
106 | > | ||
107 | { | ||
108 | using PrimaryVariables = std::decay_t<decltype(std::declval<SolutionVector>()[0])>; | ||
109 |
45/60✓ Branch 1 taken 2575740 times.
✓ Branch 2 taken 49144 times.
✓ Branch 3 taken 5346951 times.
✓ Branch 4 taken 2384290 times.
✓ Branch 5 taken 828582 times.
✓ Branch 6 taken 27380210 times.
✓ Branch 7 taken 1392 times.
✓ Branch 8 taken 3954420 times.
✓ Branch 9 taken 647712 times.
✓ Branch 10 taken 2373302 times.
✓ Branch 11 taken 3823057 times.
✓ Branch 12 taken 43098 times.
✓ Branch 13 taken 2381190 times.
✓ Branch 14 taken 1333676 times.
✓ Branch 15 taken 1208768 times.
✓ Branch 16 taken 2383005 times.
✓ Branch 17 taken 518183 times.
✓ Branch 18 taken 10765 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 106513 times.
✓ Branch 21 taken 360 times.
✓ Branch 22 taken 3102 times.
✓ Branch 23 taken 1170389 times.
✓ Branch 24 taken 360 times.
✓ Branch 25 taken 1528143 times.
✓ Branch 26 taken 1064476 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4069595 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 52000 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 168434 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 19092 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 3045500 times.
✓ Branch 38 taken 48 times.
✓ Branch 39 taken 12172000 times.
✓ Branch 40 taken 3045500 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 12172000 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 100000 times.
✓ Branch 45 taken 21948 times.
✓ Branch 46 taken 517000 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 21948 times.
✗ Branch 49 not taken.
✓ Branch 54 taken 528 times.
✓ Branch 55 taken 24056 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 97376 times.
✓ Branch 58 taken 24056 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 97376 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 304 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1354 times.
✗ Branch 65 not taken.
|
227249751 | return CCElementSolution<typename GridGeometry::LocalView, PrimaryVariables>(element, sol, gg); |
110 | } | ||
111 | |||
112 | /*! | ||
113 | * \ingroup Discretization | ||
114 | * \brief Make an element solution for cell-centered schemes | ||
115 | */ | ||
116 | template<class Element, class ElementVolumeVariables, class FVElementGeometry> | ||
117 | auto elementSolution(const Element& element, const ElementVolumeVariables& elemVolVars, const FVElementGeometry& gg) | ||
118 | -> std::enable_if_t<FVElementGeometry::GridGeometry::discMethod == DiscretizationMethods::cctpfa || | ||
119 | FVElementGeometry::GridGeometry::discMethod == DiscretizationMethods::ccmpfa, | ||
120 | CCElementSolution<FVElementGeometry, typename ElementVolumeVariables::VolumeVariables::PrimaryVariables>> | ||
121 | { | ||
122 | using PrimaryVariables = typename ElementVolumeVariables::VolumeVariables::PrimaryVariables; | ||
123 | 2050 | return CCElementSolution<FVElementGeometry, PrimaryVariables>(element, elemVolVars, gg); | |
124 | } | ||
125 | |||
126 | /*! | ||
127 | * \ingroup Discretization | ||
128 | * \brief Make an element solution for cell-centered schemes | ||
129 | * \note This is e.g. used to construct an element solution at Dirichlet boundaries | ||
130 | */ | ||
131 | template<class FVElementGeometry, class PrimaryVariables> | ||
132 | ✗ | auto elementSolution(PrimaryVariables&& priVars) | |
133 | -> std::enable_if_t<FVElementGeometry::GridGeometry::discMethod == DiscretizationMethods::cctpfa || | ||
134 | FVElementGeometry::GridGeometry::discMethod == DiscretizationMethods::ccmpfa, | ||
135 | CCElementSolution<FVElementGeometry, PrimaryVariables>> | ||
136 | { | ||
137 |
2/3✓ Branch 1 taken 813126 times.
✓ Branch 2 taken 520 times.
✗ Branch 3 not taken.
|
1985923 | return CCElementSolution<FVElementGeometry, PrimaryVariables>(std::move(priVars)); |
138 | } | ||
139 | |||
140 | /*! | ||
141 | * \ingroup Discretization | ||
142 | * \brief Make an element solution for cell-centered schemes | ||
143 | * \note This is e.g. used to construct an element solution at Dirichlet boundaries | ||
144 | */ | ||
145 | template<class FVElementGeometry, class PrimaryVariables> | ||
146 | auto elementSolution(const PrimaryVariables& priVars) | ||
147 | -> std::enable_if_t<FVElementGeometry::GridGeometry::discMethod == DiscretizationMethods::cctpfa || | ||
148 | FVElementGeometry::GridGeometry::discMethod == DiscretizationMethods::ccmpfa, | ||
149 | CCElementSolution<FVElementGeometry, PrimaryVariables>> | ||
150 | { | ||
151 | 15371220 | return CCElementSolution<FVElementGeometry, PrimaryVariables>(priVars); | |
152 | } | ||
153 | |||
154 | } // end namespace Dumux | ||
155 | |||
156 | #endif | ||
157 |