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 FaceCenteredStaggeredDiscretization | ||
10 | * \copydoc Dumux::FaceCenteredStaggeredElementSolution | ||
11 | */ | ||
12 | #ifndef DUMUX_DISCRETIZATION_FACECENTERED_STAGGERED_ELEMENT_SOLUTION_HH | ||
13 | #define DUMUX_DISCRETIZATION_FACECENTERED_STAGGERED_ELEMENT_SOLUTION_HH | ||
14 | |||
15 | #include <type_traits> | ||
16 | #include <array> | ||
17 | #include <utility> | ||
18 | |||
19 | #include <dumux/common/indextraits.hh> | ||
20 | #include <dumux/discretization/method.hh> | ||
21 | |||
22 | namespace Dumux { | ||
23 | |||
24 | /*! | ||
25 | * \ingroup FaceCenteredStaggeredDiscretization | ||
26 | * \brief The global face variables class for staggered models | ||
27 | */ | ||
28 | template<class FVElementGeometry, class PV> | ||
29 | class FaceCenteredStaggeredElementSolution | ||
30 | { | ||
31 | using GridGeometry = typename FVElementGeometry::GridGeometry; | ||
32 | using GridView = typename GridGeometry::GridView; | ||
33 | using Element = typename GridView::template Codim<0>::Entity; | ||
34 | using SmallLocalIndexType = typename IndexTraits<GridView>::SmallLocalIndex; | ||
35 | |||
36 | static constexpr auto numScvsPerElement = GridView::Grid::dimension * 2; | ||
37 | |||
38 | public: | ||
39 | //! export the primary variables type | ||
40 | using PrimaryVariables = PV; | ||
41 | |||
42 | FaceCenteredStaggeredElementSolution() = default; | ||
43 | |||
44 | //! Constructor with element, solution vector and grid geometry | ||
45 | template<class SolutionVector> | ||
46 | 63909982 | FaceCenteredStaggeredElementSolution(const Element& element, | |
47 | const SolutionVector& sol, | ||
48 | const GridGeometry& gridGeometry) | ||
49 | 63909982 | { | |
50 | 126367252 | const auto fvGeometry = localView(gridGeometry).bindElement(element); | |
51 | |||
52 |
5/5✓ Branch 0 taken 5810848 times.
✓ Branch 1 taken 251937304 times.
✓ Branch 2 taken 62457270 times.
✓ Branch 3 taken 250484592 times.
✓ Branch 4 taken 62457270 times.
|
572142726 | for (const auto& scv : scvs(fvGeometry)) |
53 | 768886320 | priVars_[scv.indexInElement()] = sol[scv.dofIndex()]; | |
54 | 63909982 | } | |
55 | |||
56 | //! Constructor with element, element volume variables and fv element geometry | ||
57 | template<class ElementVolumeVariables> | ||
58 | FaceCenteredStaggeredElementSolution(const Element& element, | ||
59 | const ElementVolumeVariables& elemVolVars, | ||
60 | const FVElementGeometry& fvGeometry) | ||
61 | { | ||
62 | for (const auto& scv : scvs(fvGeometry)) | ||
63 | priVars_ = elemVolVars[scv].priVars(); | ||
64 | } | ||
65 | |||
66 | //! Constructor with a primary variable object | ||
67 | FaceCenteredStaggeredElementSolution(PrimaryVariables&& priVars) | ||
68 | { | ||
69 | priVars_[0] = std::move(priVars); | ||
70 | for (int i = 1; i < priVars_.size(); ++i) | ||
71 | priVars_[i] = priVars_[0]; | ||
72 | } | ||
73 | |||
74 | //! Constructor with a primary variable object | ||
75 | 297094 | FaceCenteredStaggeredElementSolution(const PrimaryVariables& priVars) | |
76 | 594188 | { | |
77 | 297094 | priVars_[0] = priVars; | |
78 |
6/6✓ Branch 0 taken 360 times.
✓ Branch 1 taken 120 times.
✓ Branch 2 taken 914802 times.
✓ Branch 3 taken 296934 times.
✓ Branch 4 taken 120 times.
✓ Branch 5 taken 40 times.
|
1212376 | for (int i = 1; i < priVars_.size(); ++i) |
79 | 2745846 | priVars_[i] = priVars_[0]; | |
80 | } | ||
81 | |||
82 | //! extract the element solution from the solution vector using a mapper | ||
83 | template<class SolutionVector> | ||
84 | void update(const Element& element, const SolutionVector& sol, | ||
85 | const GridGeometry& gridGeometry) | ||
86 | { | ||
87 | const auto fvGeometry = localView(gridGeometry).bindElement(element); | ||
88 | |||
89 | for (const auto& scv : scvs(fvGeometry)) | ||
90 | priVars_[scv.indexInElement()] = sol[scv.dofIndex()]; | ||
91 | } | ||
92 | |||
93 | //! bracket operator const access | ||
94 | const PrimaryVariables& operator [](SmallLocalIndexType localScvIdx) const | ||
95 | { | ||
96 | 145870172 | return priVars_[localScvIdx]; | |
97 | } | ||
98 | |||
99 | //! bracket operator | ||
100 | PrimaryVariables& operator [](SmallLocalIndexType localScvIdx) | ||
101 | { | ||
102 |
4/7✓ Branch 3 taken 60499688 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 60499688 times.
✓ Branch 7 taken 29528 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 29528 times.
✗ Branch 11 not taken.
|
604476672 | return priVars_[localScvIdx]; |
103 | } | ||
104 | |||
105 | //! return the size of the element solution | ||
106 | static constexpr std::size_t size() | ||
107 | { return numScvsPerElement; } | ||
108 | |||
109 | private: | ||
110 | std::array<PrimaryVariables, numScvsPerElement> priVars_; | ||
111 | }; | ||
112 | |||
113 | /*! | ||
114 | * \ingroup Discretization | ||
115 | * \brief Make an element solution for face-centered staggered schemes | ||
116 | */ | ||
117 | template<class Element, class SolutionVector, class GridGeometry> | ||
118 | auto elementSolution(const Element& element, const SolutionVector& sol, const GridGeometry& gg) | ||
119 | -> std::enable_if_t< | ||
120 | GridGeometry::discMethod == DiscretizationMethods::fcstaggered, | ||
121 | FaceCenteredStaggeredElementSolution< | ||
122 | typename GridGeometry::LocalView, | ||
123 | std::decay_t<decltype(std::declval<SolutionVector>()[0])> | ||
124 | > | ||
125 | > | ||
126 |
5/6✓ Branch 1 taken 439641 times.
✓ Branch 2 taken 42047 times.
✓ Branch 3 taken 866800 times.
✓ Branch 4 taken 5304 times.
✓ Branch 5 taken 111104 times.
✗ Branch 6 not taken.
|
63909982 | { return { element, sol, gg }; } |
127 | |||
128 | /*! | ||
129 | * \ingroup Discretization | ||
130 | * \brief Make an element solution for face-centered staggered schemes | ||
131 | */ | ||
132 | template<class Element, class ElementVolumeVariables, class FVElementGeometry> | ||
133 | auto elementSolution(const Element& element, const ElementVolumeVariables& elemVolVars, const FVElementGeometry& gg) | ||
134 | -> std::enable_if_t< | ||
135 | FVElementGeometry::GridGeometry::discMethod == DiscretizationMethods::fcstaggered, | ||
136 | FaceCenteredStaggeredElementSolution< | ||
137 | FVElementGeometry, | ||
138 | typename ElementVolumeVariables::VolumeVariables::PrimaryVariables | ||
139 | > | ||
140 | > | ||
141 | { return { element, elemVolVars, gg }; } | ||
142 | |||
143 | /*! | ||
144 | * \ingroup Discretization | ||
145 | * \brief Make an element solution for face-centered staggered schemes | ||
146 | * \note This is e.g. used to construct an element solution at Dirichlet boundaries | ||
147 | */ | ||
148 | template<class FVElementGeometry, class PrimaryVariables> | ||
149 | ✗ | auto elementSolution(PrimaryVariables&& priVars) | |
150 | -> std::enable_if_t< | ||
151 | FVElementGeometry::GridGeometry::discMethod == DiscretizationMethods::fcstaggered, | ||
152 | FaceCenteredStaggeredElementSolution< | ||
153 | FVElementGeometry, | ||
154 | std::decay_t<PrimaryVariables> | ||
155 | > | ||
156 | > | ||
157 | 594188 | { return { std::forward<PrimaryVariables>(priVars) }; } | |
158 | |||
159 | } // end namespace Dumux | ||
160 | |||
161 | #endif | ||
162 |