GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: dumux/dumux/freeflow/navierstokes/scalarfluxvariablescachefiller.hh
Date: 2025-04-12 19:19:20
Exec Total Coverage
Lines: 20 20 100.0%
Functions: 14 14 100.0%
Branches: 8 8 100.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 NavierStokesModel
10 * \brief A helper class to fill the flux variables cache
11 */
12 #ifndef DUMUX_FREEFLOW_SCALAR_FLUXVARIABLESCACHE_FILLER_HH
13 #define DUMUX_FREEFLOW_SCALAR_FLUXVARIABLESCACHE_FILLER_HH
14
15 #include <dumux/common/properties.hh>
16 #include <dumux/common/parameters.hh>
17
18 #include <dumux/discretization/method.hh>
19 #include <dumux/discretization/extrusion.hh>
20 #include <dumux/flux/referencesystemformulation.hh>
21 #include <dumux/common/typetraits/problem.hh>
22
23 namespace Dumux {
24
25 // forward declaration
26 template<class Problem, class ModelTraits, bool diffusionIsSolDependent, bool heatConductionIsSolDependent, class DiscretizationMethod>
27 class FreeFlowScalarFluxVariablesCacheFillerImplementation;
28
29 /*!
30 * \ingroup NavierStokesModel
31 * \brief The flux variables cache filler class for free flow
32 *
33 * Helps filling the flux variables cache depending on several policies
34 */
35 template<class Problem, class ModelTraits, bool diffusionIsSolDependent, bool heatConductionIsSolDependent>
36 using FreeFlowScalarFluxVariablesCacheFiller = FreeFlowScalarFluxVariablesCacheFillerImplementation<Problem, ModelTraits, diffusionIsSolDependent, heatConductionIsSolDependent, typename ProblemTraits<Problem>::GridGeometry::DiscretizationMethod>;
37
38 //! Specialization of the flux variables cache filler for the cell centered tpfa method
39 template<class Problem, class ModelTraits, bool diffusionIsSolDependent, bool heatConductionIsSolDependent>
40 class FreeFlowScalarFluxVariablesCacheFillerImplementation<Problem, ModelTraits, diffusionIsSolDependent, heatConductionIsSolDependent, DiscretizationMethods::CCTpfa>
41 {
42 using GridGeometry = typename ProblemTraits<Problem>::GridGeometry;
43 using GridView = typename GridGeometry::GridView;
44 using FVElementGeometry = typename GridGeometry::LocalView;
45 using SubControlVolume = typename GridGeometry::SubControlVolume;
46 using SubControlVolumeFace = typename GridGeometry::SubControlVolumeFace;
47
48 using Element = typename GridView::template Codim<0>::Entity;
49
50 static constexpr bool diffusionEnabled = ModelTraits::enableMolecularDiffusion();
51 static constexpr bool heatConductionEnabled = ModelTraits::enableEnergyBalance();
52
53 public:
54 static constexpr bool isSolDependent = (diffusionEnabled && diffusionIsSolDependent) ||
55 (heatConductionEnabled && heatConductionIsSolDependent);
56
57 //! The constructor. Sets the problem pointer
58 1495220 FreeFlowScalarFluxVariablesCacheFillerImplementation(const Problem& problem)
59 1495220 : problemPtr_(&problem) {}
60
61 /*!
62 * \brief function to fill the flux variables caches
63 *
64 * \param fluxVarsCacheContainer Either the element or global flux variables cache
65 * \param scvfFluxVarsCache The flux var cache to be updated corresponding to the given scvf
66 * \param element The finite element
67 * \param fvGeometry The finite volume geometry
68 * \param elemVolVars The element volume variables
69 * \param scvf The corresponding sub-control volume face
70 * \param forceUpdateAll if true, forces all caches to be updated (even the solution-independent ones)
71 */
72 template<class FluxVariablesCacheContainer, class FluxVariablesCache, class ElementVolumeVariables>
73 12980604 void fill(FluxVariablesCacheContainer& fluxVarsCacheContainer,
74 FluxVariablesCache& scvfFluxVarsCache,
75 const Element& element,
76 const FVElementGeometry& fvGeometry,
77 const ElementVolumeVariables& elemVolVars,
78 const SubControlVolumeFace& scvf,
79 const bool forceUpdateAll = false)
80 {
81 // fill the physics-related quantities of the caches
82
2/2
✓ Branch 0 taken 385120 times.
✓ Branch 1 taken 12595484 times.
12980604 if (forceUpdateAll)
83 {
84 if constexpr (diffusionEnabled)
85 343120 fillDiffusion_(scvfFluxVarsCache, element, fvGeometry, elemVolVars, scvf);
86 if constexpr (heatConductionEnabled)
87 50840 fillHeatConduction_(scvfFluxVarsCache, element, fvGeometry, elemVolVars, scvf);
88 }
89 else
90 {
91 if constexpr (diffusionEnabled && diffusionIsSolDependent)
92 9372324 fillDiffusion_(scvfFluxVarsCache, element, fvGeometry, elemVolVars, scvf);
93 if constexpr (heatConductionEnabled && heatConductionIsSolDependent)
94 6247072 fillHeatConduction_(scvfFluxVarsCache, element, fvGeometry, elemVolVars, scvf);
95 }
96 12980604 }
97
98 private:
99
100 16013356 const Problem& problem() const
101 16013356 { return *problemPtr_; }
102
103
104 //! method to fill the diffusive quantities
105 template<class FluxVariablesCache, class ElementVolumeVariables>
106 9715444 void fillDiffusion_(FluxVariablesCache& scvfFluxVarsCache,
107 const Element& element,
108 const FVElementGeometry& fvGeometry,
109 const ElementVolumeVariables& elemVolVars,
110 const SubControlVolumeFace& scvf)
111 {
112 using DiffusionType = typename ElementVolumeVariables::VolumeVariables::MolecularDiffusionType;
113 using DiffusionFiller = typename DiffusionType::Cache::Filler;
114 using FluidSystem = typename ElementVolumeVariables::VolumeVariables::FluidSystem;
115
116 static constexpr int numPhases = ModelTraits::numFluidPhases();
117 static constexpr int numComponents = ModelTraits::numFluidComponents();
118
119 // forward to the filler of the diffusive quantities
120 if constexpr (FluidSystem::isTracerFluidSystem())
121 for (unsigned int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
122 for (unsigned int compIdx = 0; compIdx < numComponents; ++compIdx)
123 DiffusionFiller::fill(scvfFluxVarsCache, phaseIdx, compIdx, problem(), element, fvGeometry, elemVolVars, scvf, *this);
124 else
125
2/2
✓ Branch 0 taken 9715444 times.
✓ Branch 1 taken 9715444 times.
19430888 for (unsigned int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
126
2/2
✓ Branch 0 taken 19430888 times.
✓ Branch 1 taken 9715444 times.
29146332 for (unsigned int compIdx = 0; compIdx < numComponents; ++compIdx)
127
2/2
✓ Branch 0 taken 9715444 times.
✓ Branch 1 taken 9715444 times.
19430888 if (compIdx != FluidSystem::getMainComponent(phaseIdx))
128 9715444 DiffusionFiller::fill(scvfFluxVarsCache, phaseIdx, compIdx, problem(), element, fvGeometry, elemVolVars, scvf, *this);
129 9715444 }
130
131 //! method to fill the quantities related to heat conduction
132 template<class FluxVariablesCache, class ElementVolumeVariables>
133 6297912 void fillHeatConduction_(FluxVariablesCache& scvfFluxVarsCache,
134 const Element& element,
135 const FVElementGeometry& fvGeometry,
136 const ElementVolumeVariables& elemVolVars,
137 const SubControlVolumeFace& scvf)
138 {
139 using HeatConductionType = typename ElementVolumeVariables::VolumeVariables::HeatConductionType;
140 using HeatConductionFiller = typename HeatConductionType::Cache::Filler;
141
142 // forward to the filler of the diffusive quantities
143 6297912 HeatConductionFiller::fill(scvfFluxVarsCache, problem(), element, fvGeometry, elemVolVars, scvf, *this);
144 6297912 }
145
146 const Problem* problemPtr_;
147 };
148
149 } // end namespace Dumux
150
151 #endif
152