GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: /builds/dumux-repositories/dumux/dumux/material/binarycoefficients/brine_co2.hh
Date: 2024-09-21 20:52:54
Exec Total Coverage
Lines: 97 103 94.2%
Functions: 22 22 100.0%
Branches: 19 44 43.2%

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 Binarycoefficients
10 * \brief Binary coefficients for CO2 and brine.
11 */
12 #ifndef DUMUX_BINARY_COEFF_BRINE_CO2_HH
13 #define DUMUX_BINARY_COEFF_BRINE_CO2_HH
14
15 #include <dune/common/math.hh>
16
17 #include <type_traits>
18 #include <dune/common/debugstream.hh>
19 #include <dumux/common/parameters.hh>
20 #include <dumux/material/components/brine.hh>
21 #include <dumux/material/components/h2o.hh>
22 #include <dumux/material/components/co2.hh>
23 #include <dumux/material/idealgas.hh>
24
25 namespace Dumux::BinaryCoeff {
26
27 /*!
28 * \ingroup Binarycoefficients
29 * \brief Binary coefficients for brine and CO2.
30 */
31 template<class Scalar, class CO2, bool verbose = true>
32 class Brine_CO2 {
33 using H2O = Components::H2O<Scalar>;
34 using IdealGas = Dumux::IdealGas<Scalar>;
35 static constexpr int lPhaseIdx = 0; // index of the liquid phase
36 static constexpr int gPhaseIdx = 1; // index of the gas phase
37
38 public:
39 /*!
40 * \brief Binary diffusion coefficient \f$\mathrm{[m^2/s]}\f$ of water in the CO2 phase.
41 *
42 * According to B. Xu et al. (2002) \cite xu2003 <BR>
43 * \param temperature the temperature \f$\mathrm{[K]}\f$
44 * \param pressure the phase pressure \f$\mathrm{[Pa]}\f$
45 */
46 73784250 static Scalar gasDiffCoeff(Scalar temperature, Scalar pressure)
47 {
48
7/14
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 73784233 times.
✓ Branch 3 taken 17 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 17 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 17 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 17 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 17 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
73784301 static const bool hasGasDiffCoeff = hasParam("BinaryCoefficients.GasDiffCoeff");
49
1/2
✓ Branch 0 taken 73784250 times.
✗ Branch 1 not taken.
73784250 if (!hasGasDiffCoeff) //in case one might set that user-specific as e.g. in dumux-lecture/mm/convectivemixing
50 {
51 //Diffusion coefficient of water in the CO2 phase
52 73784250 constexpr Scalar PI = 3.141593;
53 73784250 constexpr Scalar k = 1.3806504e-23; // Boltzmann constant
54 73784250 constexpr Scalar c = 4; // slip parameter, can vary between 4 (slip condition) and 6 (stick condition)
55 73784250 constexpr Scalar R_h = 1.72e-10; // hydrodynamic radius of the solute
56 73784250 const Scalar mu = CO2::gasViscosity(temperature, pressure); // CO2 viscosity
57 73784250 return k / (c * PI * R_h) * (temperature / mu);
58 }
59 else
60 {
61 static const Scalar D = getParam<Scalar>("BinaryCoefficients.GasDiffCoeff");
62 return D;
63 }
64 }
65
66 /*!
67 * \brief Binary diffusion coefficient \f$\mathrm{[m^2/s]}\f$ of CO2 in the brine phase.
68 *
69 * \param temperature the temperature \f$\mathrm{[K]}\f$
70 * \param pressure the phase pressure \f$\mathrm{[Pa]}\f$
71 */
72 73784250 static Scalar liquidDiffCoeff(Scalar temperature, Scalar pressure)
73 {
74 //Diffusion coefficient of CO2 in the brine phase
75
7/14
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 73784233 times.
✓ Branch 3 taken 17 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 17 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 17 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 17 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 17 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
73784301 static const bool hasLiquidDiffCoeff = hasParam("BinaryCoefficients.LiquidDiffCoeff");
76
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 73784250 times.
73784250 if (!hasLiquidDiffCoeff) //in case one might set that user-specific as e.g. in dumux-lecture/mm/convectivemixing
77 return 2e-9;
78 else
79 {
80 const Scalar D = getParam<Scalar>("BinaryCoefficients.LiquidDiffCoeff");
81 return D;
82 }
83 }
84
85 /*!
86 * \brief Returns the _mol_ (!) fraction of CO2 in the liquid
87 * phase and the _mol_ (!) fraction of H2O in the gas phase
88 * for a given temperature, pressure, CO2 density and brine
89 * salinity.
90 *
91 * Implemented according to Spycher and Pruess (2005) \cite spycher2005 <BR>
92 * applying the activity coefficient expression of Duan and Sun (2003) \cite duan2003 <BR>
93 * and the correlations for pure water given in Spycher, Pruess and Ennis-King (2003) \cite spycher2003 <BR>
94 *
95 * \param temperature the temperature \f$\mathrm{[K]}\f$
96 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
97 * \param salinity the salinity \f$\mathrm{[kg \ NaCl / kg \ solution]}\f$
98 * \param knownPhaseIdx indicates which phases are present
99 * \param xlCO2 mole fraction of CO2 in brine \f$\mathrm{[mol/mol]}\f$
100 * \param ygH2O mole fraction of water in the gas phase \f$\mathrm{[mol/mol]}\f$
101 */
102 103818185 static void calculateMoleFractions(const Scalar temperature,
103 const Scalar pg,
104 const Scalar salinity,
105 const int knownPhaseIdx,
106 Scalar &xlCO2,
107 Scalar &ygH2O)
108 {
109
110 103818185 const Scalar A = computeA_(temperature, pg);
111
112 /* salinity: conversion from mass fraction to mol fraction */
113 207636370 const Scalar x_NaCl = salinityToMoleFrac_(salinity);
114
115 // if both phases are present the mole fractions in each phase can be calculate
116 // with the mutual solubility function
117 103818185 if (knownPhaseIdx < 0)
118 {
119 207636370 const Scalar molalityNaCl = molFracToMolality_(x_NaCl); // molality of NaCl //CHANGED
120 207636370 const Scalar m0_CO2 = molalityCO2inPureWater_(temperature, pg); // molality of CO2 in pure water
121 103818185 const Scalar gammaStar = activityCoefficient_(temperature, pg, molalityNaCl);// activity coefficient of CO2 in brine
122 103818185 const Scalar m_CO2 = m0_CO2 / gammaStar; // molality of CO2 in brine
123 103818185 xlCO2 = m_CO2 / (molalityNaCl + 55.508 + m_CO2); // mole fraction of CO2 in brine
124 103818185 ygH2O = A * (1 - xlCO2 - x_NaCl); // mole fraction of water in the gas phase
125 }
126
127 // if only liquid phase is present the mole fraction of CO2 in brine is given and
128 // and the virtual equilibrium mole fraction of water in the non-existing gas phase can be estimated
129 // with the mutual solubility function
130
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 103818185 times.
103818185 if (knownPhaseIdx == lPhaseIdx)
131 ygH2O = A * (1 - xlCO2 - x_NaCl);
132
133 // if only gas phase is present the mole fraction of water in the gas phase is given and
134 // and the virtual equilibrium mole fraction of CO2 in the non-existing liquid phase can be estimated
135 // with the mutual solubility function
136
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 103818185 times.
103818185 if (knownPhaseIdx == gPhaseIdx)
137 xlCO2 = 1 - x_NaCl - ygH2O / A;
138 103818185 }
139
140 /*!
141 * \brief Returns the fugacity coefficient of the CO2 component in a water-CO2 mixture
142 * (given in Spycher, Pruess and Ennis-King (2003) \cite spycher2003 )
143 *
144 * \param T the temperature \f$\mathrm{[K]}\f$
145 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
146 */
147 103818185 static Scalar fugacityCoefficientCO2(Scalar T, Scalar pg)
148 {
149 127180133 const Scalar V = 1 / (CO2::gasDensity(T, pg) / CO2::molarMass()) * 1.e6; // molar volume in cm^3/mol
150 103818185 const Scalar pg_bar = pg / 1.e5; // gas phase pressure in bar
151 103818185 const Scalar a_CO2 = (7.54e7 - 4.13e4 * T); // mixture parameter of Redlich-Kwong equation
152 103818185 constexpr Scalar b_CO2 = 27.8; // mixture parameter of Redlich-Kwong equation
153 103818185 constexpr Scalar R = IdealGas::R * 10.; // ideal gas constant with unit bar cm^3 /(K mol)
154
155 using std::log;
156 using std::exp;
157 using std::pow;
158 415272740 const Scalar lnPhiCO2 = log(V / (V - b_CO2)) + b_CO2 / (V - b_CO2) - 2 * a_CO2 / (R
159 415272740 * pow(T, 1.5) * b_CO2) * log((V + b_CO2) / V) + a_CO2 * b_CO2
160 207636370 / (R * pow(T, 1.5) * b_CO2 * b_CO2) * (log((V + b_CO2) / V)
161 207636370 - b_CO2 / (V + b_CO2)) - log(pg_bar * V / (R * T));
162
163 103818185 return exp(lnPhiCO2); // fugacity coefficient of CO2
164 }
165
166 /*!
167 * \brief Returns the fugacity coefficient of the H2O component in a water-CO2 mixture
168 * (given in Spycher, Pruess and Ennis-King (2003) \cite spycher2003 )
169 *
170 * \param T the temperature \f$\mathrm{[K]}\f$
171 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
172 */
173 207636370 static Scalar fugacityCoefficientH2O(Scalar T, Scalar pg)
174 {
175 254360266 const Scalar V = 1 / (CO2::gasDensity(T, pg) / CO2::molarMass()) * 1.e6; // molar volume in cm^3/mol
176 207636370 const Scalar pg_bar = pg / 1.e5; // gas phase pressure in bar
177 207636370 const Scalar a_CO2 = (7.54e7 - 4.13e4 * T);// mixture parameter of Redlich-Kwong equation
178 207636370 constexpr Scalar a_CO2_H2O = 7.89e7;// mixture parameter of Redlich-Kwong equation
179 207636370 constexpr Scalar b_CO2 = 27.8;// mixture parameter of Redlich-Kwong equation
180 207636370 constexpr Scalar b_H2O = 18.18;// mixture parameter of Redlich-Kwong equation
181 207636370 constexpr Scalar R = IdealGas::R * 10.; // ideal gas constant with unit bar cm^3 /(K mol)
182
183 using std::log;
184 using std::pow;
185 using std::exp;
186 622909110 const Scalar lnPhiH2O = log(V / (V - b_CO2)) + b_H2O / (V - b_CO2) - 2 * a_CO2_H2O
187 415272740 / (R * pow(T, 1.5) * b_CO2) * log((V + b_CO2) / V) + a_CO2
188 415272740 * b_H2O / (R * pow(T, 1.5) * b_CO2 * b_CO2) * (log((V + b_CO2)
189 415272740 / V) - b_CO2 / (V + b_CO2)) - log(pg_bar * V / (R * T));
190
191 207636370 return exp(lnPhiH2O); // fugacity coefficient of H2O
192 }
193
194 private:
195 /*!
196 * \brief Returns the molality of NaCl \f$\mathrm{[mol \ NaCl / kg \ water]}\f$ for a given mole fraction
197 * \param salinity the salinity \f$\mathrm{[kg \ NaCl / kg \ solution]}\f$
198 */
199 static Scalar salinityToMoleFrac_(Scalar salinity)
200 {
201 103818185 constexpr Scalar Mw = H2O::molarMass(); // molecular weight of water [kg/mol]
202 103818185 constexpr Scalar Ms = 58.8e-3; // molecular weight of NaCl [kg/mol]
203
204 103818185 const Scalar X_NaCl = salinity;
205 // salinity: conversion from mass fraction to mol fraction
206
1/2
✓ Branch 0 taken 103818185 times.
✗ Branch 1 not taken.
103818185 const Scalar x_NaCl = -Mw * X_NaCl / ((Ms - Mw) * X_NaCl - Ms);
207 return x_NaCl;
208 }
209
210 /*!
211 * \brief Returns the molality of NaCl \f$\mathrm{(mol \ NaCl / kg \ water)}\f$
212 * for a given mole fraction \f$\mathrm{(mol \ NaCl / mol\ solution)}\f$
213 *
214 * \param x_NaCl mole fraction of NaCL in brine \f$\mathrm{[mol/mol]}\f$
215 */
216 static Scalar molFracToMolality_(Scalar x_NaCl)
217 {
218 // conversion from mol fraction to molality (dissolved CO2 neglected)
219 103818185 return 55.508 * x_NaCl / (1 - x_NaCl);
220 }
221
222 /*!
223 * \brief Returns the equilibrium molality of CO2 \f$\mathrm{(mol \ CO2 / kg \ water)}\f$ for a
224 * CO2-water mixture at a given pressure and temperature
225 *
226 * \param temperature the temperature \f$\mathrm{[K]}\f$
227 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
228 */
229 103818185 static Scalar molalityCO2inPureWater_(Scalar temperature, Scalar pg)
230 {
231 103818185 const Scalar A = computeA_(temperature, pg); // according to Spycher, Pruess and Ennis-King (2003)
232 103818185 const Scalar B = computeB_(temperature, pg); // according to Spycher, Pruess and Ennis-King (2003)
233 103818185 const Scalar yH2OinGas = (1 - B) / (1. / A - B); // equilibrium mol fraction of H2O in the gas phase
234 103818185 const Scalar xCO2inWater = B * (1 - yH2OinGas); // equilibrium mol fraction of CO2 in the water phase
235 103818185 return (xCO2inWater * 55.508) / (1 - xCO2inWater); // CO2 molality
236 }
237
238 /*!
239 * \brief Returns the activity coefficient of CO2 in brine for a
240 * molal description. According to Duan and Sun (2003) \cite duan2003 <BR>
241 * given in Spycher and Pruess (2005) \cite spycher2005 <BR>
242 *
243 * \param temperature the temperature \f$\mathrm{[K]}\f$
244 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
245 * \param molalityNaCl molality of NaCl \f$\mathrm{(mol \ NaCl / kg \ water)}\f$
246 */
247 103818185 static Scalar activityCoefficient_(Scalar temperature, Scalar pg, Scalar molalityNaCl)
248 {
249 103818185 const Scalar lambda = computeLambda_(temperature, pg); // lambda_{CO2-Na+}
250 207636370 const Scalar xi = computeXi_(temperature, pg); // Xi_{CO2-Na+-Cl-}
251 207636370 const Scalar lnGammaStar = 2 * lambda * molalityNaCl + xi * molalityNaCl
252 103818185 * molalityNaCl;
253 using std::exp;
254 103818185 return exp(lnGammaStar); // molal activity coefficient of CO2 in brine
255 }
256
257 /*!
258 * \brief Returns the parameter A for the calculation of
259 * them mutual solubility in the water-CO2 system.
260 * Given in Spycher, Pruess and Ennis-King (2003) \cite spycher2003 <BR>
261 *
262 * \param T the temperature \f$\mathrm{[K]}\f$
263 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
264 */
265 207636370 static Scalar computeA_(Scalar T, Scalar pg)
266 {
267 207636370 const Scalar deltaP = pg / 1e5 - 1; // pressure range [bar] from p0 = 1bar to pg[bar]
268 207636370 const Scalar v_av_H2O = 18.1; // average partial molar volume of H2O [cm^3/mol]
269 207636370 constexpr Scalar R = IdealGas::R * 10;
270 207636370 const Scalar k0_H2O = equilibriumConstantH2O_(T); // equilibrium constant for H2O at 1 bar
271 207636370 const Scalar phi_H2O = fugacityCoefficientH2O(T, pg); // fugacity coefficient of H2O for the water-CO2 system
272 207636370 const Scalar pg_bar = pg / 1.e5;
273 using std::exp;
274 207636370 return k0_H2O / (phi_H2O * pg_bar) * exp(deltaP * v_av_H2O / (R * T));
275 }
276
277 /*!
278 * \brief Returns the parameter B for the calculation of
279 * the mutual solubility in the water-CO2 system.
280 * Given in Spycher, Pruess and Ennis-King (2003) \cite spycher2003 <BR>
281 *
282 * \param T the temperature \f$\mathrm{[K]}\f$
283 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
284 */
285 103818185 static Scalar computeB_(Scalar T, Scalar pg)
286 {
287 103818185 const Scalar deltaP = pg / 1e5 - 1; // pressure range [bar] from p0 = 1bar to pg[bar]
288 103818185 constexpr Scalar v_av_CO2 = 32.6; // average partial molar volume of CO2 [cm^3/mol]
289 103818185 constexpr Scalar R = IdealGas::R * 10;
290 207636370 const Scalar k0_CO2 = equilibriumConstantCO2_(T); // equilibrium constant for CO2 at 1 bar
291 207636370 const Scalar phi_CO2 = fugacityCoefficientCO2(T, pg); // fugacity coefficient of CO2 for the water-CO2 system
292 103818185 const Scalar pg_bar = pg / 1.e5;
293 using std::exp;
294 311454555 return phi_CO2 * pg_bar / (55.508 * k0_CO2) * exp(-(deltaP
295 311454555 * v_av_CO2) / (R * T));
296 }
297
298 /*!
299 * \brief Returns the parameter lambda, which is needed for the
300 * calculation of the CO2 activity coefficient in the brine-CO2 system.
301 * Given in Spycher and Pruess (2005) \cite spycher2005 <BR>
302 * \param T the temperature \f$\mathrm{[K]}\f$
303 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
304 */
305 103818185 static Scalar computeLambda_(Scalar T, Scalar pg)
306 {
307 constexpr Scalar c[6] = { -0.411370585, 6.07632013E-4, 97.5347708,
308 -0.0237622469, 0.0170656236, 1.41335834E-5 };
309
310 using std::log;
311 103818185 const Scalar pg_bar = pg / 1.0E5; /* conversion from Pa to bar */
312 207636370 return c[0] + c[1] * T + c[2] / T + c[3] * pg_bar / T + c[4] * pg_bar
313 207636370 / (630.0 - T) + c[5] * T * log(pg_bar);
314 }
315
316 /*!
317 * \brief Returns the parameter xi, which is needed for the
318 * calculation of the CO2 activity coefficient in the brine-CO2 system.
319 * Given in Spycher and Pruess (2005) \cite spycer2005 <BR>
320 * \param T the temperature \f$\mathrm{[K]}\f$
321 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
322 */
323 static Scalar computeXi_(Scalar T, Scalar pg)
324 {
325 constexpr Scalar c[4] = { 3.36389723E-4, -1.98298980E-5,
326 2.12220830E-3, -5.24873303E-3 };
327
328 103818185 Scalar pg_bar = pg / 1.0E5; /* conversion from Pa to bar */
329 103818185 return c[0] + c[1] * T + c[2] * pg_bar / T + c[3] * pg_bar / (630.0 - T);
330 }
331
332 /*!
333 * \brief Returns the equilibrium constant for CO2, which is needed for the
334 * calculation of the mutual solubility in the water-CO2 system
335 * Given in Spycher, Pruess and Ennis-King (2003) \cite spycher2003 <BR>
336 * \param T the temperature \f$\mathrm{[K]}\f$
337 */
338 static Scalar equilibriumConstantCO2_(Scalar T)
339 {
340 103818185 const Scalar TinC = T - 273.15; //temperature in °C
341 constexpr Scalar c[3] = { 1.189, 1.304e-2, -5.446e-5 };
342 103818185 const Scalar logk0_CO2 = c[0] + c[1] * TinC + c[2] * TinC * TinC;
343 using std::pow;
344 207636370 return pow(10, logk0_CO2);
345 }
346
347 /*!
348 * \brief Returns the equilibrium constant for H2O, which is needed for the
349 * calculation of the mutual solubility in the water-CO2 system
350 * Given in Spycher, Pruess and Ennis-King (2003) \cite spycher2003 <BR>
351 * \param T the temperature \f$\mathrm{[K]}\f$
352 */
353 207636370 static Scalar equilibriumConstantH2O_(Scalar T)
354 {
355 207636370 const Scalar TinC = T - 273.15; //temperature in °C
356 constexpr Scalar c[4] = { -2.209, 3.097e-2, -1.098e-4, 2.048e-7 };
357 415272740 const Scalar logk0_H2O = c[0] + c[1] * TinC + c[2] * TinC * TinC + c[3]
358 207636370 * TinC * TinC * TinC;
359 using std::pow;
360 415272740 return pow(10, logk0_H2O);
361 }
362 };
363
364 /*!
365 * \brief Old version of binary coefficients for CO2 and brine.
366 * Calculates molfraction of CO2 in brine according to Duan and Sun 2003
367 * molfraction of H2O has been assumed to be a constant value
368 * For use with the actual brine_co2_system this class still needs to be adapted
369 */
370 template<class Scalar, class CO2Impl, bool verbose = true>
371 class Brine_CO2_Old
372 {
373 using H2O = Components::H2O<Scalar>;
374 using Brine = Components::Brine<Scalar,H2O>;
375 using CO2 = CO2Impl;
376 using IdealGas = Dumux::IdealGas<Scalar>;
377
378 public:
379 /*!
380 * \brief Returns the _mole_ (!) fraction of CO2 in the liquid
381 * phase at a given temperature, pressure and density of
382 * CO2.
383 * \param temperature the temperature \f$\mathrm{[K]}\f$
384 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
385 * \param rhoCO2 density of CO2
386 */
387 static Scalar moleFracCO2InBrine(Scalar temperature, Scalar pg, Scalar rhoCO2)
388 {
389 // regularisations:
390 if (pg > 2.5e8) {
391 pg = 2.5e8;
392 }
393 if (pg < 2.e5) {
394 pg = 2.e5;
395 }
396 if (temperature < 275.) {
397 temperature = 275;
398 }
399 if (temperature > 600.) {
400 temperature = 600;
401 }
402
403 const Scalar Mw = H2O::molarMass(); /* molecular weight of water [kg/mol] */
404 const Scalar Ms = 58.8e-3; /* molecular weight of NaCl [kg/mol] */
405
406 const Scalar X_NaCl = Brine::salinity();
407 /* salinity: conversion from mass fraction to mole fraction */
408 const Scalar x_NaCl = -Mw * X_NaCl / ((Ms - Mw) * X_NaCl - Ms);
409
410 // salinity: conversion from mole fraction to molality
411 const Scalar mol_NaCl = -55.56 * x_NaCl / (x_NaCl - 1);
412
413 const Scalar A = computeA_(temperature, pg); /* mu_{CO2}^{l(0)}/RT */
414 const Scalar B = computeB_(temperature, pg); /* lambda_{CO2-Na+} */
415 const Scalar C = computeC_(temperature, pg); /* Xi_{CO2-Na+-Cl-} */
416 const Scalar pgCO2 = partialPressureCO2_(temperature, pg);
417 const Scalar phiCO2 = fugacityCoeffCO2_(temperature, pgCO2, rhoCO2);
418
419 using std::log;
420 using Dune::power;
421 const Scalar exponent = A - log(phiCO2) + 2*B*mol_NaCl + C*power(mol_NaCl,2);
422
423 using std::exp;
424 const Scalar mol_CO2w = pgCO2 / (1e5 * exp(exponent)); /* paper: equation (6) */
425
426 const Scalar x_CO2w = mol_CO2w / (mol_CO2w + 55.56); /* conversion: molality to mole fraction */
427 //Scalar X_CO2w = x_CO2w*MCO2/(x_CO2w*MCO2 + (1-x_CO2w)*Mw); /* conversion: mole fraction to mass fraction */
428
429 return x_CO2w;
430 }
431
432 private:
433 /*!
434 * \brief computation of \f$\mathrm{[mu_{CO2}^{l(0)}/RT]}\f$
435 * \param T the temperature \f$\mathrm{[K]}\f$
436 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
437 */
438 static Scalar computeA_(Scalar T, Scalar pg)
439 {
440 static const Scalar c[10] = {
441 28.9447706,
442 -0.0354581768,
443 -4770.67077,
444 1.02782768E-5,
445 33.8126098,
446 9.04037140E-3,
447 -1.14934031E-3,
448 -0.307405726,
449 -0.0907301486,
450 9.32713393E-4,
451 };
452
453 const Scalar pg_bar = pg / 1.0E5; /* conversion from Pa to bar */
454 const Scalar Tr = 630.0 - T;
455
456 using std::log;
457 return
458 c[0] +
459 c[1]*T +
460 c[2]/T +
461 c[3]*T*T +
462 c[4]/Tr +
463 c[5]*pg_bar +
464 c[6]*pg_bar*log(T) +
465 c[7]*pg_bar/T +
466 c[8]*pg_bar/Tr +
467 c[9]*pg_bar*pg_bar/(Tr*Tr);
468 }
469
470 /*!
471 * \brief computation of B
472 *
473 * \param T the temperature \f$\mathrm{[K]}\f$
474 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
475 */
476 static Scalar computeB_(Scalar T, Scalar pg)
477 {
478 const Scalar c1 = -0.411370585;
479 const Scalar c2 = 6.07632013E-4;
480 const Scalar c3 = 97.5347708;
481 const Scalar c8 = -0.0237622469;
482 const Scalar c9 = 0.0170656236;
483 const Scalar c11 = 1.41335834E-5;
484
485 const Scalar pg_bar = pg / 1.0E5; /* conversion from Pa to bar */
486
487 using std::log;
488 return
489 c1 +
490 c2*T +
491 c3/T +
492 c8*pg_bar/T +
493 c9*pg_bar/(630.0-T) +
494 c11*T*log(pg_bar);
495 }
496
497 /*!
498 * \brief computation of C
499 *
500 * \param T the temperature \f$\mathrm{[K]}\f$
501 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
502 */
503 static Scalar computeC_(Scalar T, Scalar pg)
504 {
505 const Scalar c1 = 3.36389723E-4;
506 const Scalar c2 = -1.98298980E-5;
507 const Scalar c8 = 2.12220830E-3;
508 const Scalar c9 = -5.24873303E-3;
509
510 const Scalar pg_bar = pg / 1.0E5; /* conversion from Pa to bar */
511
512 return
513 c1 +
514 c2*T +
515 c8*pg_bar/T +
516 c9*pg_bar/(630.0-T);
517 }
518
519 /*!
520 * \brief computation of partial pressure CO2
521 *
522 * We assume that the partial pressure of brine is its vapor pressure.
523 * \warning: Strictly this is assumption is invalid for CO2 because the
524 * mole fraction of CO2 in brine can be considerable
525 *
526 * \param temperature the temperature \f$\mathrm{[K]}\f$
527 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
528 */
529 static Scalar partialPressureCO2_(Scalar temperature, Scalar pg)
530 {
531 return pg - Brine::vaporPressure(temperature);
532 }
533
534 /*!
535 * \brief The fugacity coefficient of CO2 for a CO2-H2O mixture.
536 *
537 * \param temperature the temperature \f$\mathrm{[K]}\f$
538 * \param pg the gas phase pressure \f$\mathrm{[Pa]}\f$
539 * \param rhoCO2 the density of CO2 for the critical volume \f$\mathrm{[kg/m^3]}\f$
540 */
541 static Scalar fugacityCoeffCO2_(Scalar temperature,
542 Scalar pg,
543 Scalar rhoCO2)
544 {
545 static const Scalar a[15] = {
546 8.99288497E-2,
547 -4.94783127E-1,
548 4.77922245E-2,
549 1.03808883E-2,
550 -2.82516861E-2,
551 9.49887563E-2,
552 5.20600880E-4,
553 -2.93540971E-4,
554 -1.77265112E-3,
555 -2.51101973E-5,
556 8.93353441E-5,
557 7.88998563E-5,
558 -1.66727022E-2,
559 1.3980,
560 2.96000000E-2
561 };
562
563 // reduced temperature
564 const Scalar Tr = temperature / CO2::criticalTemperature();
565 // reduced pressure
566 const Scalar pr = pg / CO2::criticalPressure();
567
568 // reduced molar volume. ATTENTION: Vc is _NOT_ the critical
569 // molar volume of CO2. See the reference!
570 const Scalar Vc = IdealGas::R*CO2::criticalTemperature()/CO2::criticalPressure();
571 const Scalar Vr =
572 // molar volume of CO2 at (temperature, pg)
573 CO2::molarMass() / rhoCO2
574 *
575 // "pseudo-critical" molar volume
576 1.0 / Vc;
577
578 // the Z coefficient
579 const Scalar Z = pr * Vr / Tr;
580
581 const Scalar A = a[0] + a[1] / (Tr * Tr) + a[2] / (Tr * Tr * Tr);
582 const Scalar B = a[3] + a[4] / (Tr * Tr) + a[5] / (Tr * Tr * Tr);
583 const Scalar C = a[6] + a[7] / (Tr * Tr) + a[8] / (Tr * Tr * Tr);
584 const Scalar D = a[9] + a[10] / (Tr * Tr) + a[11] / (Tr * Tr * Tr);
585
586 using std::log;
587 using std::exp;
588 const Scalar lnphiCO2 =
589 Z - 1 -
590 log(Z) +
591 A/Vr +
592 B/(2*Vr*Vr) +
593 C/(4*Vr*Vr*Vr*Vr) +
594 D/(5*Vr*Vr*Vr*Vr*Vr)
595 +
596 a[12]/(2*Tr*Tr*Tr*a[14])*
597 (
598 a[13] + 1 -
599 ( a[13] + 1 +
600 a[14]/(Vr*Vr)
601 )*exp(-a[14]/(Vr*Vr)));
602
603 return exp(lnphiCO2);
604 }
605
606 };
607
608 } // end namespace Dumux::BinaryCoeff
609
610 #endif
611