GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: dumux/dumux/material/fluidmatrixinteractions/2p/thermalconductivity/johansen.hh
Date: 2025-04-12 19:19:20
Exec Total Coverage
Lines: 16 16 100.0%
Functions: 2 2 100.0%
Branches: 2 2 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 EffectiveHeatConductivity
10 * \brief Relation for the saturation-dependent effective thermal conductivity
11 */
12
13 #ifndef DUMUX_MATERIAL_FLUIDMATRIX_THERMALCONDUCTIVITY_JOHANSEN_HH
14 #define DUMUX_MATERIAL_FLUIDMATRIX_THERMALCONDUCTIVITY_JOHANSEN_HH
15
16 #include <cmath>
17 #include <algorithm>
18
19 namespace Dumux {
20
21 /*!
22 * \addtogroup EffectiveHeatConductivity
23 * \copydetails Dumux::ThermalConductivityJohansen
24 */
25
26 /*!
27 * \ingroup EffectiveHeatConductivity
28 * \brief Relation for the saturation-dependent effective thermal conductivity
29 *
30 * ### Johansen (two fluid phases)
31 *
32 * `ThermalConductivityJohansen` \cite johansen1977 computes the thermal conductivity of dry and the
33 * wet soil material and interpolates using the Kersten number. The effective wet conductivity
34 * is based on a geometric average and the effective dry conductivity is based on a semi-emprical
35 * relation and fitted to medium quartz sand.
36 *
37 * The effective thermal conductivity is given by
38 * \f[
39 * \lambda_\text{eff} = \lambda_{\text{dry}} + \text{Ke} \left(\lambda_\text{wet} - \lambda_\text{dry}\right), \quad
40 * \lambda_\text{wet} = \lambda_\text{s}^{\left(1-\phi\right)} \lambda_\text{w}^\phi, \quad
41 * \lambda_\text{dry} = \frac{0.135 \rho_\text{s} \phi + 64.7}{\rho_\text{s} - 0.947 \rho_\text{s} \phi},
42 * \f]
43 * where \f$ \phi \f$ is the porosity, \f$ \lambda_\alpha \f$ is the thermal conductivity
44 * of phase \f$ \alpha \f$, \f$ \rho_\text{s} \f$ denotes the density of the solid phase, and the
45 * Kersten number is given by \f$ \text{Ke} = (\kappa S_\text{w})/(1 + (1-\kappa) S_\text{w}) \f$,
46 * with the wetting phase saturation \f$ S_w \f$ and a fitting parameter \f$ \kappa = 15.6 \f$
47 * for medium quartz sand.
48 */
49 template<class Scalar>
50 class ThermalConductivityJohansen
51 {
52 public:
53 /*!
54 * \brief Effective thermal conductivity in \f$\mathrm{W/(m K)}\f$ for two phases
55 * \param volVars volume variables
56 * \return Effective thermal conductivity in \f$\mathrm{W/(m K)}\f$ for two phases
57 */
58 template<class VolumeVariables>
59 1001 static Scalar effectiveThermalConductivity(const VolumeVariables& volVars)
60 {
61 using FluidSystem = typename VolumeVariables::FluidSystem;
62 static_assert(FluidSystem::numPhases == 2, "ThermalConductivitySomerton only works for two-phase fluid systems!");
63 // TODO: there should be an assertion that the indices are correct and 0 is actually the wetting phase!
64
65 1001 const Scalar sw = volVars.saturation(volVars.wettingPhase());
66 1001 const Scalar lambdaW = volVars.fluidThermalConductivity(volVars.wettingPhase());
67 1001 const Scalar lambdaN = volVars.fluidThermalConductivity(1-volVars.wettingPhase());
68 1001 const Scalar lambdaSolid = volVars.solidThermalConductivity();
69 1001 const Scalar porosity = volVars.porosity();
70 1001 const Scalar rhoSolid = volVars.solidDensity();
71
72 1001 return effectiveThermalConductivity_(sw, lambdaW, lambdaN, lambdaSolid, porosity, rhoSolid);
73 }
74
75 private:
76 /*!
77 * \brief Effective thermal conductivity in \f$\mathrm{W/(m K)}\f$ for two phases
78 *
79 * \param Sw The saturation of the wetting phase
80 * \param lambdaW The thermal conductivity of the wetting phase in \f$\mathrm{W/(m K)}\f$
81 * \param lambdaN The thermal conductivity of the nonwetting phase in \f$\mathrm{W/(m K)}\f$
82 * \param lambdaSolid The thermal conductivity of the solid phase in \f$\mathrm{W/(m K)}\f$
83 * \param porosity The porosity
84 * \param rhoSolid The density of solid phase in \f$\mathrm{kg/m^3}\f$
85 *
86 * \return Effective thermal conductivity in \f$\mathrm{W/(m K)}\f$ for two phases
87 */
88 1001 static Scalar effectiveThermalConductivity_(const Scalar Sw,
89 const Scalar lambdaW,
90 const Scalar lambdaN,
91 const Scalar lambdaSolid,
92 const Scalar porosity,
93 const Scalar rhoSolid)
94 {
95 using std::max;
96
2/2
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 1 times.
1001 const Scalar satW = max<Scalar>(0.0, Sw);
97
98 1001 const Scalar kappa = 15.6; // fitted to medium quartz sand
99 1001 const Scalar rhoBulk = rhoSolid*porosity;
100
101 using std::pow;
102
103 1001 const Scalar lambdaSaturated = lambdaSolid * pow(lambdaW / lambdaSolid, porosity);
104 1001 const Scalar lambdaDry = (0.135*rhoBulk + 64.7)/(rhoSolid - 0.947*rhoBulk);
105 1001 const Scalar Ke = (kappa*satW)/(1+(kappa-1)*satW);// Kersten number, equation 13
106
107 1001 return lambdaDry + Ke * (lambdaSaturated - lambdaDry); // equation 14
108 }
109 };
110
111 } // end namespace Dumux
112
113 #endif
114