12#ifndef DUMUX_BINARY_COEFF_BRINE_CO2_HH
13#define DUMUX_BINARY_COEFF_BRINE_CO2_HH
15#include <dune/common/math.hh>
18#include <dune/common/debugstream.hh>
32template<
class Scalar,
class CO2Impl,
bool verbose = true>
36 static constexpr bool rawCO2Table = Deprecated::BrineCO2Helper<CO2Impl>::isRawTable();
37 using CO2Component =
typename std::conditional_t< rawCO2Table,
40 using CO2 = CO2Component;
42 static constexpr int lPhaseIdx = 0;
43 static constexpr int gPhaseIdx = 1;
55 static const bool hasGasDiffCoeff =
hasParam(
"BinaryCoefficients.GasDiffCoeff");
59 constexpr Scalar PI = 3.141593;
60 constexpr Scalar k = 1.3806504e-23;
61 constexpr Scalar c = 4;
62 constexpr Scalar R_h = 1.72e-10;
68 static const Scalar D = getParam<Scalar>(
"BinaryCoefficients.GasDiffCoeff");
82 static const bool hasLiquidDiffCoeff =
hasParam(
"BinaryCoefficients.LiquidDiffCoeff");
83 if (!hasLiquidDiffCoeff)
87 const Scalar D = getParam<Scalar>(
"BinaryCoefficients.LiquidDiffCoeff");
111 const Scalar salinity,
112 const int knownPhaseIdx,
120 const Scalar x_NaCl = salinityToMoleFrac_(salinity);
124 if (knownPhaseIdx < 0)
126 const Scalar molalityNaCl = molFracToMolality_(x_NaCl);
127 const Scalar m0_CO2 = molalityCO2inPureWater_(
temperature, pg);
128 const Scalar gammaStar = activityCoefficient_(
temperature, pg, molalityNaCl);
129 const Scalar m_CO2 = m0_CO2 / gammaStar;
130 xlCO2 = m_CO2 / (molalityNaCl + 55.508 + m_CO2);
131 ygH2O = A * (1 - xlCO2 - x_NaCl);
137 if (knownPhaseIdx == lPhaseIdx)
138 ygH2O = A * (1 - xlCO2 - x_NaCl);
143 if (knownPhaseIdx == gPhaseIdx)
144 xlCO2 = 1 - x_NaCl - ygH2O / A;
156 const Scalar V = 1 / (CO2::gasDensity(T, pg) / CO2::molarMass()) * 1.e6;
157 const Scalar pg_bar = pg / 1.e5;
158 const Scalar a_CO2 = (7.54e7 - 4.13e4 * T);
159 constexpr Scalar b_CO2 = 27.8;
165 const Scalar lnPhiCO2 = log(V / (V - b_CO2)) + b_CO2 / (V - b_CO2) - 2 * a_CO2 / (R
166 * pow(T, 1.5) * b_CO2) * log((V + b_CO2) / V) + a_CO2 * b_CO2
167 / (R * pow(T, 1.5) * b_CO2 * b_CO2) * (log((V + b_CO2) / V)
168 - b_CO2 / (V + b_CO2)) - log(pg_bar * V / (R * T));
170 return exp(lnPhiCO2);
182 const Scalar V = 1 / (CO2::gasDensity(T, pg) / CO2::molarMass()) * 1.e6;
183 const Scalar pg_bar = pg / 1.e5;
184 const Scalar a_CO2 = (7.54e7 - 4.13e4 * T);
185 constexpr Scalar a_CO2_H2O = 7.89e7;
186 constexpr Scalar b_CO2 = 27.8;
187 constexpr Scalar b_H2O = 18.18;
193 const Scalar lnPhiH2O = log(V / (V - b_CO2)) + b_H2O / (V - b_CO2) - 2 * a_CO2_H2O
194 / (R * pow(T, 1.5) * b_CO2) * log((V + b_CO2) / V) + a_CO2
195 * b_H2O / (R * pow(T, 1.5) * b_CO2 * b_CO2) * (log((V + b_CO2)
196 / V) - b_CO2 / (V + b_CO2)) - log(pg_bar * V / (R * T));
198 return exp(lnPhiH2O);
206 static Scalar salinityToMoleFrac_(Scalar salinity)
209 constexpr Scalar Ms = 58.8e-3;
211 const Scalar X_NaCl = salinity;
213 const Scalar x_NaCl = -Mw * X_NaCl / ((Ms - Mw) * X_NaCl - Ms);
223 static Scalar molFracToMolality_(Scalar x_NaCl)
226 return 55.508 * x_NaCl / (1 - x_NaCl);
236 static Scalar molalityCO2inPureWater_(Scalar
temperature, Scalar pg)
240 const Scalar yH2OinGas = (1 - B) / (1. / A - B);
241 const Scalar xCO2inWater = B * (1 - yH2OinGas);
242 return (xCO2inWater * 55.508) / (1 - xCO2inWater);
254 static Scalar activityCoefficient_(Scalar
temperature, Scalar pg, Scalar molalityNaCl)
256 const Scalar lambda = computeLambda_(
temperature, pg);
258 const Scalar lnGammaStar = 2 * lambda * molalityNaCl + xi * molalityNaCl
261 return exp(lnGammaStar);
272 static Scalar computeA_(Scalar T, Scalar pg)
274 const Scalar deltaP = pg / 1e5 - 1;
275 const Scalar v_av_H2O = 18.1;
277 const Scalar k0_H2O = equilibriumConstantH2O_(T);
279 const Scalar pg_bar = pg / 1.e5;
281 return k0_H2O / (phi_H2O * pg_bar) * exp(deltaP * v_av_H2O / (R * T));
292 static Scalar computeB_(Scalar T, Scalar pg)
294 const Scalar deltaP = pg / 1e5 - 1;
295 constexpr Scalar v_av_CO2 = 32.6;
297 const Scalar k0_CO2 = equilibriumConstantCO2_(T);
299 const Scalar pg_bar = pg / 1.e5;
301 return phi_CO2 * pg_bar / (55.508 * k0_CO2) * exp(-(deltaP
302 * v_av_CO2) / (R * T));
312 static Scalar computeLambda_(Scalar T, Scalar pg)
314 constexpr Scalar c[6] = { -0.411370585, 6.07632013E-4, 97.5347708,
315 -0.0237622469, 0.0170656236, 1.41335834E-5 };
318 const Scalar pg_bar = pg / 1.0E5;
319 return c[0] + c[1] * T + c[2] / T + c[3] * pg_bar / T + c[4] * pg_bar
320 / (630.0 - T) + c[5] * T * log(pg_bar);
330 static Scalar computeXi_(Scalar T, Scalar pg)
332 constexpr Scalar c[4] = { 3.36389723E-4, -1.98298980E-5,
333 2.12220830E-3, -5.24873303E-3 };
335 Scalar pg_bar = pg / 1.0E5;
336 return c[0] + c[1] * T + c[2] * pg_bar / T + c[3] * pg_bar / (630.0 - T);
345 static Scalar equilibriumConstantCO2_(Scalar T)
347 const Scalar TinC = T - 273.15;
348 constexpr Scalar c[3] = { 1.189, 1.304e-2, -5.446e-5 };
349 const Scalar logk0_CO2 = c[0] + c[1] * TinC + c[2] * TinC * TinC;
351 return pow(10, logk0_CO2);
360 static Scalar equilibriumConstantH2O_(Scalar T)
362 const Scalar TinC = T - 273.15;
363 constexpr Scalar c[4] = { -2.209, 3.097e-2, -1.098e-4, 2.048e-7 };
364 const Scalar logk0_H2O = c[0] + c[1] * TinC + c[2] * TinC * TinC + c[3]
365 * TinC * TinC * TinC;
367 return pow(10, logk0_H2O);
377template<
class Scalar,
class CO2Impl,
bool verbose = true>
411 const Scalar Ms = 58.8e-3;
415 const Scalar x_NaCl = -Mw * X_NaCl / ((Ms - Mw) * X_NaCl - Ms);
418 const Scalar mol_NaCl = -55.56 * x_NaCl / (x_NaCl - 1);
423 const Scalar pgCO2 = partialPressureCO2_(
temperature, pg);
424 const Scalar phiCO2 = fugacityCoeffCO2_(
temperature, pgCO2, rhoCO2);
428 const Scalar exponent = A - log(phiCO2) + 2*B*mol_NaCl + C*power(mol_NaCl,2);
431 const Scalar mol_CO2w = pgCO2 / (1e5 * exp(exponent));
433 const Scalar x_CO2w = mol_CO2w / (mol_CO2w + 55.56);
445 static Scalar computeA_(Scalar T, Scalar pg)
447 static const Scalar c[10] = {
460 const Scalar pg_bar = pg / 1.0E5;
461 const Scalar Tr = 630.0 - T;
474 c[9]*pg_bar*pg_bar/(Tr*Tr);
483 static Scalar computeB_(Scalar T, Scalar pg)
485 const Scalar c1 = -0.411370585;
486 const Scalar c2 = 6.07632013E-4;
487 const Scalar c3 = 97.5347708;
488 const Scalar c8 = -0.0237622469;
489 const Scalar c9 = 0.0170656236;
490 const Scalar c11 = 1.41335834E-5;
492 const Scalar pg_bar = pg / 1.0E5;
500 c9*pg_bar/(630.0-T) +
510 static Scalar computeC_(Scalar T, Scalar pg)
512 const Scalar c1 = 3.36389723E-4;
513 const Scalar c2 = -1.98298980E-5;
514 const Scalar c8 = 2.12220830E-3;
515 const Scalar c9 = -5.24873303E-3;
517 const Scalar pg_bar = pg / 1.0E5;
536 static Scalar partialPressureCO2_(Scalar
temperature, Scalar pg)
548 static Scalar fugacityCoeffCO2_(Scalar
temperature,
552 static const Scalar a[15] = {
571 const Scalar Tr =
temperature / CO2::criticalTemperature();
573 const Scalar pr = pg / CO2::criticalPressure();
577 const Scalar Vc =
IdealGas::R*CO2::criticalTemperature()/CO2::criticalPressure();
580 CO2::molarMass() / rhoCO2
586 const Scalar Z = pr * Vr / Tr;
588 const Scalar A = a[0] + a[1] / (Tr * Tr) + a[2] / (Tr * Tr * Tr);
589 const Scalar B = a[3] + a[4] / (Tr * Tr) + a[5] / (Tr * Tr * Tr);
590 const Scalar C = a[6] + a[7] / (Tr * Tr) + a[8] / (Tr * Tr * Tr);
591 const Scalar D = a[9] + a[10] / (Tr * Tr) + a[11] / (Tr * Tr * Tr);
595 const Scalar lnphiCO2 =
603 a[12]/(2*Tr*Tr*Tr*a[14])*
608 )*exp(-a[14]/(Vr*Vr)));
610 return exp(lnphiCO2);
Old version of binary coefficients for CO2 and brine. Calculates molfraction of CO2 in brine accordin...
Definition: brine_co2.hh:379
static Scalar moleFracCO2InBrine(Scalar temperature, Scalar pg, Scalar rhoCO2)
Returns the mole (!) fraction of CO2 in the liquid phase at a given temperature, pressure and density...
Definition: brine_co2.hh:394
Binary coefficients for brine and CO2.
Definition: brine_co2.hh:33
static Scalar fugacityCoefficientH2O(Scalar T, Scalar pg)
Returns the fugacity coefficient of the H2O component in a water-CO2 mixture (given in Spycher,...
Definition: brine_co2.hh:180
static Scalar liquidDiffCoeff(Scalar temperature, Scalar pressure)
Binary diffusion coefficient of CO2 in the brine phase.
Definition: brine_co2.hh:79
static void calculateMoleFractions(const Scalar temperature, const Scalar pg, const Scalar salinity, const int knownPhaseIdx, Scalar &xlCO2, Scalar &ygH2O)
Returns the mol (!) fraction of CO2 in the liquid phase and the mol (!) fraction of H2O in the gas ph...
Definition: brine_co2.hh:109
static Scalar fugacityCoefficientCO2(Scalar T, Scalar pg)
Returns the fugacity coefficient of the CO2 component in a water-CO2 mixture (given in Spycher,...
Definition: brine_co2.hh:154
static Scalar gasDiffCoeff(Scalar temperature, Scalar pressure)
Binary diffusion coefficient of water in the CO2 phase.
Definition: brine_co2.hh:53
A class for the brine fluid properties.
Definition: components/brine.hh:44
static Scalar salinity()
Return the constant salinity.
Definition: components/brine.hh:61
static Scalar vaporPressure(Scalar temperature)
The vapor pressure in of pure brine at a given temperature.
Definition: components/brine.hh:117
A class for the CO2 fluid properties.
Definition: co2.hh:45
Material properties of pure water .
Definition: h2o.hh:49
static constexpr Scalar molarMass()
The molar mass in of water.
Definition: h2o.hh:69
Relations valid for an ideal gas.
Definition: idealgas.hh:25
static constexpr Scalar R
The ideal gas constant .
Definition: idealgas.hh:28
A class for the CO2 fluid properties.
A class for the brine fluid properties,.
Material properties of pure water .
Relations valid for an ideal gas.
Definition: air_mesitylene.hh:19
std::string temperature() noexcept
I/O name of temperature for equilibrium models.
Definition: name.hh:39
std::string pressure(int phaseIdx) noexcept
I/O name of pressure for multiphase systems.
Definition: name.hh:22
bool hasParam(const std::string ¶m)
Check whether a key exists in the parameter tree.
Definition: parameters.hh:157
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.