My Project
Loading...
Searching...
No Matches
VanGenuchten.hpp
Go to the documentation of this file.
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 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 2 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18
19 Consult the COPYING file in the top-level source directory of this
20 module for the precise wording of the license and the list of
21 copyright holders.
22*/
27#ifndef OPM_VAN_GENUCHTEN_HPP
28#define OPM_VAN_GENUCHTEN_HPP
29
31
33
34#include <algorithm>
35#include <cmath>
36#include <cassert>
37
38namespace Opm {
54template <class TraitsT, class ParamsT = VanGenuchtenParams<TraitsT> >
55class VanGenuchten : public TraitsT
56{
57public:
59 typedef TraitsT Traits;
60
62 typedef ParamsT Params;
63
65 typedef typename Traits::Scalar Scalar;
66
68 static const int numPhases = Traits::numPhases;
69 static_assert(numPhases == 2,
70 "The van Genuchten capillary pressure law only "
71 "applies to the case of two fluid phases");
72
75 static const bool implementsTwoPhaseApi = true;
76
79 static const bool implementsTwoPhaseSatApi = true;
80
83 static const bool isSaturationDependent = true;
84
87 static const bool isPressureDependent = false;
88
91 static const bool isTemperatureDependent = false;
92
95 static const bool isCompositionDependent = false;
96
113 template <class Container, class FluidState>
114 static void capillaryPressures(Container& values, const Params& params, const FluidState& fs)
115 {
116 typedef typename std::remove_reference<decltype(values[0])>::type Evaluation;
117
118 values[Traits::wettingPhaseIdx] = 0.0; // reference phase
119 values[Traits::nonWettingPhaseIdx] = pcnw<FluidState, Evaluation>(params, fs);
120 }
121
126 template <class Container, class FluidState>
127 static void saturations(Container& values, const Params& params, const FluidState& fs)
128 {
129 typedef typename std::remove_reference<decltype(values[0])>::type Evaluation;
130
131 values[Traits::wettingPhaseIdx] = Sw<FluidState, Evaluation>(params, fs);
132 values[Traits::nonWettingPhaseIdx] = 1 - values[Traits::wettingPhaseIdx];
133 }
134
145 template <class Container, class FluidState>
146 static void relativePermeabilities(Container& values, const Params& params, const FluidState& fs)
147 {
148 typedef typename std::remove_reference<decltype(values[0])>::type Evaluation;
149
150 values[Traits::wettingPhaseIdx] = krw<FluidState, Evaluation>(params, fs);
151 values[Traits::nonWettingPhaseIdx] = krn<FluidState, Evaluation>(params, fs);
152 }
153
168 template <class FluidState, class Evaluation = typename FluidState::Scalar>
169 static Evaluation pcnw(const Params& params, const FluidState& fs)
170 {
171 const Evaluation& Sw =
172 decay<Evaluation>(fs.saturation(Traits::wettingPhaseIdx));
173
174 assert(0 <= Sw && Sw <= 1);
175
176 return twoPhaseSatPcnw(params, Sw);
177 }
178
193 template <class Evaluation>
194 static Evaluation twoPhaseSatPcnw(const Params& params, const Evaluation& Sw)
195 {
196 return pow(pow(Sw, -1.0/params.vgM()) - 1, 1.0/params.vgN())/params.vgAlpha();
197 }
198
211 template <class FluidState, class Evaluation = typename FluidState::Scalar>
212 static Evaluation Sw(const Params& params, const FluidState& fs)
213 {
214 Evaluation pC =
215 decay<Evaluation>(fs.pressure(Traits::nonWettingPhaseIdx))
216 - decay<Evaluation>(fs.pressure(Traits::wettingPhaseIdx));
217 return twoPhaseSatSw(params, pC);
218 }
219
220 template <class Evaluation>
221 static Evaluation twoPhaseSatSw(const Params& params, const Evaluation& pC)
222 {
223 assert(pC >= 0);
224
225 return pow(pow(params.vgAlpha()*pC, params.vgN()) + 1, -params.vgM());
226 }
227
232 template <class FluidState, class Evaluation = typename FluidState::Scalar>
233 static Evaluation Sn(const Params& params, const FluidState& fs)
234 { return 1 - Sw<FluidState, Evaluation>(params, fs); }
235
236 template <class Evaluation>
237 static Evaluation twoPhaseSatSn(const Params& params, const Evaluation& pC)
238 { return 1 - twoPhaseSatSw(params, pC); }
239
250 template <class FluidState, class Evaluation = typename FluidState::Scalar>
251 static Evaluation krw(const Params& params, const FluidState& fs)
252 {
253 const Evaluation& Sw =
254 decay<Evaluation>(fs.saturation(Traits::wettingPhaseIdx));
255
256 return twoPhaseSatKrw(params, Sw);
257 }
258
259 template <class Evaluation>
260 static Evaluation twoPhaseSatKrw(const Params& params, const Evaluation& Sw)
261 {
262 assert(0.0 <= Sw && Sw <= 1.0);
263
264 Evaluation r = 1.0 - pow(1.0 - pow(Sw, 1/params.vgM()), params.vgM());
265 return sqrt(Sw)*r*r;
266 }
267
277 template <class FluidState, class Evaluation = typename FluidState::Scalar>
278 static Evaluation krn(const Params& params, const FluidState& fs)
279 {
280 const Evaluation& Sw =
281 1.0 - decay<Evaluation>(fs.saturation(Traits::nonWettingPhaseIdx));
282
283 return twoPhaseSatKrn(params, Sw);
284 }
285
286 template <class Evaluation>
287 static Evaluation twoPhaseSatKrn(const Params& params, Evaluation Sw)
288 {
289 assert(0 <= Sw && Sw <= 1);
290
291 return
292 pow(1 - Sw, 1.0/3) *
293 pow(1 - pow(Sw, 1/params.vgM()), 2*params.vgM());
294 }
295};
296} // namespace Opm
297
298#endif
A traits class which provides basic mathematical functions for arbitrary scalar floating point values...
Specification of the material parameters for the van Genuchten constitutive relations.
Implementation of the van Genuchten capillary pressure - saturation relation.
Definition VanGenuchten.hpp:56
static const int numPhases
The number of fluid phases.
Definition VanGenuchten.hpp:68
static Evaluation Sw(const Params &params, const FluidState &fs)
The saturation-capillary pressure curve according to van Genuchten.
Definition VanGenuchten.hpp:212
ParamsT Params
The type of the parameter objects for this law.
Definition VanGenuchten.hpp:62
static const bool isSaturationDependent
Specify whether the quantities defined by this material law are saturation dependent.
Definition VanGenuchten.hpp:83
static Evaluation twoPhaseSatPcnw(const Params &params, const Evaluation &Sw)
The saturation-capillary pressure curve according to van Genuchten using a material law specific API.
Definition VanGenuchten.hpp:194
static Evaluation pcnw(const Params &params, const FluidState &fs)
The capillary pressure-saturation curve according to van Genuchten.
Definition VanGenuchten.hpp:169
static void saturations(Container &values, const Params &params, const FluidState &fs)
Calculate the saturations of the phases starting from their pressure differences.
Definition VanGenuchten.hpp:127
static const bool implementsTwoPhaseSatApi
Specify whether this material law implements the two-phase convenience API which only depends on the ...
Definition VanGenuchten.hpp:79
static Evaluation Sn(const Params &params, const FluidState &fs)
Calculate the non-wetting phase saturations depending on the phase pressures.
Definition VanGenuchten.hpp:233
static const bool isPressureDependent
Specify whether the quantities defined by this material law are dependent on the absolute pressure.
Definition VanGenuchten.hpp:87
Traits::Scalar Scalar
The type of the scalar values for this law.
Definition VanGenuchten.hpp:65
static void capillaryPressures(Container &values, const Params &params, const FluidState &fs)
The capillary pressure-saturation curves according to van Genuchten.
Definition VanGenuchten.hpp:114
static const bool isCompositionDependent
Specify whether the quantities defined by this material law are dependent on the phase composition.
Definition VanGenuchten.hpp:95
static Evaluation krn(const Params &params, const FluidState &fs)
The relative permeability for the non-wetting phase of the medium according to van Genuchten.
Definition VanGenuchten.hpp:278
static void relativePermeabilities(Container &values, const Params &params, const FluidState &fs)
The relative permeability-saturation curves according to van Genuchten.
Definition VanGenuchten.hpp:146
static Evaluation krw(const Params &params, const FluidState &fs)
The relative permeability for the wetting phase of the medium according to van Genuchten's curve with...
Definition VanGenuchten.hpp:251
static const bool isTemperatureDependent
Specify whether the quantities defined by this material law are temperature dependent.
Definition VanGenuchten.hpp:91
TraitsT Traits
The traits class for this material law.
Definition VanGenuchten.hpp:59
static const bool implementsTwoPhaseApi
Specify whether this material law implements the two-phase convenience API.
Definition VanGenuchten.hpp:75
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30