thermalconductivitysomerton.hh 5.68 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
// vi: set et ts=4 sw=4 sts=4:
/*****************************************************************************
 *   See the file COPYING for full copying permissions.                      *
 *                                                                           *
 *   This program is free software: you can redistribute it and/or modify    *
 *   it under the terms of the GNU General Public License as published by    *
 *   the Free Software Foundation, either version 2 of the License, or       *
 *   (at your option) any later version.                                     *
 *                                                                           *
 *   This program is distributed in the hope that it will be useful,         *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of          *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the            *
 *   GNU General Public License for more details.                            *
 *                                                                           *
 *   You should have received a copy of the GNU General Public License       *
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.   *
 *****************************************************************************/
/*!
 * \file
 *
 * \brief   Relation for the saturation-dependent effective thermal conductivity
 */
#ifndef THERMALCONDUCTIVITY_SOMERTON_HH
#define THERMALCONDUCTIVITY_SOMERTON_HH

#include <algorithm>

namespace Dumux
{
31

Thomas Fetzer's avatar
Thomas Fetzer committed
32
struct SomertonIndices
33
34
35
36
37
{
    static const int wPhaseIdx = 0;
    static const int nPhaseIdx = 1;
};

38
39
40
41
42
43
44
/*!
 * \ingroup fluidmatrixinteractionslaws
 *
 * \brief Relation for the saturation-dependent effective thermal conductivity
 *
 *  The Somerton method computes the thermal conductivity of dry and the wet soil material
 *  and uses a root function of the wetting saturation to compute the
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 *  effective thermal conductivity for a two-phase fluidsystem. The individual thermal
 *  conductivities are calculated as geometric mean of the thermal conductivity of the porous
 *  material and of the respective fluid phase.
 *
 * The material law is:
 * \f[
 \lambda_\text{eff} = \lambda_{\text{dry}} + \sqrt{(S_w)} \left(\lambda_\text{wet} - \lambda_\text{dry}\right)
 \f]
 *
 * with
 * \f[
 \lambda_\text{wet} = \lambda_{solid}^{\left(1-\phi\right)}*\lambda_w^\phi
 \f]
 * and
 *
 * \f[
 \lambda_\text{dry} = \lambda_{solid}^{\left(1-\phi\right)}*\lambda_n^\phi.
 \f]
 *
64
 */
Thomas Fetzer's avatar
Thomas Fetzer committed
65
template<class Scalar, class Indices = SomertonIndices>
66
67
68
69
class ThermalConductivitySomerton
{
public:
    /*!
70
     * \brief effective thermal conductivity \f$[W/(m K)]\f$ after Somerton (1974)
71
     *
72
73
74
75
76
     * \param volVars volume variables
     * \param spatialParams spatial parameters
     * \param element element (to be passed to spatialParams)
     * \param fvGeometry fvGeometry (to be passed to spatialParams)
     * \param scvIdx scvIdx (to be passed to spatialParams)
77
     *
78
     * \return effective thermal conductivity \f$[W/(m K)]\f$ after Somerton (1974)
79
80
81
82
83
84
     *
     * This gives an interpolation of the effective thermal conductivities of a porous medium
     * filled with the non-wetting phase and a porous medium filled with the wetting phase.
     * These two effective conductivities are computed as geometric mean of the solid and the
     * fluid conductivities and interpolated with the square root of the wetting saturation.
     * See f.e. Ebigbo, A.: Thermal Effects of Carbon Dioxide Sequestration in the Subsurface, Diploma thesis.
85
     */
86
87
88
89
90
91
92
93
    template<class VolumeVariables, class SpatialParams, class Element, class FVGeometry>
    static Scalar effectiveThermalConductivity(const VolumeVariables& volVars,
                                               const SpatialParams& spatialParams,
                                               const Element& element,
                                               const FVGeometry& fvGeometry,
                                               int scvIdx)
    {
        Scalar sw = volVars.saturation(Indices::wPhaseIdx);
94
95
96
        Scalar lambdaW = volVars.fluidThermalConductivity(Indices::wPhaseIdx);
        Scalar lambdaN = volVars.fluidThermalConductivity(Indices::nPhaseIdx);
        Scalar lambdaSolid = volVars.solidThermalConductivity();
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
        Scalar porosity = volVars.porosity();

        return effectiveThermalConductivity(sw, lambdaW, lambdaN, lambdaSolid, porosity);
    }

    /*!
     * \brief effective thermal conductivity \f$[W/(m K)]\f$ after Somerton (1974)
     *
     * \param sw The saturation of the wetting phase
     * \param lambdaW the thermal conductivity of the wetting phase
     * \param lambdaN the thermal conductivity of the non-wetting phase
     * \param lambdaSolid the thermal conductivity of the solid phase
     * \param porosity The porosity
     *
     * \return effective thermal conductivity \f$[W/(m K)]\f$ after Somerton (1974)
     */
113
    static Scalar effectiveThermalConductivity(const Scalar sw,
114
                                               const Scalar lambdaW,
Bernd Flemisch's avatar
Bernd Flemisch committed
115
                                               const Scalar lambdaN,
116
                                               const Scalar lambdaSolid,
Thomas Fetzer's avatar
Thomas Fetzer committed
117
118
                                               const Scalar porosity,
                                               const Scalar rhoSolid = 0.0 /*unused*/)
119
    {
120
        const Scalar satW = std::max<Scalar>(0.0, sw);
121
        // geometric mean
122
        const Scalar lSat = std::pow(lambdaSolid, (1.0 - porosity)) * std::pow(lambdaW, porosity);
123
        const Scalar lDry = std::pow(lambdaSolid, (1.0 - porosity)) * std::pow(lambdaN, porosity);
124

125
        return lDry + std::sqrt(satW) * (lSat - lDry);
126
127
128
129
    }
};
}
#endif