Brine_CO2.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 */
28 #ifndef OPM_BINARY_COEFF_BRINE_CO2_HPP
29 #define OPM_BINARY_COEFF_BRINE_CO2_HPP
30 
35 
36 namespace Opm {
37 namespace BinaryCoeff {
38 
43 template<class Scalar, class CO2Tables, bool verbose = true>
44 class Brine_CO2 {
45  typedef Opm::H2O<Scalar> H2O;
48  static const int liquidPhaseIdx = 0; // index of the liquid phase
49  static const int gasPhaseIdx = 1; // index of the gas phase
50 
51 public:
59  template <class Evaluation>
60  static Evaluation gasDiffCoeff(const Evaluation& temperature, const Evaluation& pressure)
61  {
62  //Diffusion coefficient of water in the CO2 phase
63  Scalar k = 1.3806504e-23; // Boltzmann constant
64  Scalar c = 4; // slip parameter, can vary between 4 (slip condition) and 6 (stick condition)
65  Scalar R_h = 1.72e-10; // hydrodynamic radius of the solute
66  const Evaluation& mu = CO2::gasViscosity(temperature, pressure); // CO2 viscosity
67  return k / (c * M_PI * R_h) * (temperature / mu);
68  }
69 
76  template <class Evaluation>
77  static Evaluation liquidDiffCoeff(const Evaluation& /*temperature*/, const Evaluation& /*pressure*/)
78  {
79  //Diffusion coefficient of CO2 in the brine phase
80  return 2e-9;
81  }
82 
100  template <class Evaluation>
101  static void calculateMoleFractions(const Evaluation& temperature,
102  const Evaluation& pg,
103  Scalar salinity,
104  const int knownPhaseIdx,
105  Evaluation& xlCO2,
106  Evaluation& ygH2O)
107  {
108  Evaluation A = computeA_(temperature, pg);
109 
110  /* salinity: conversion from mass fraction to mol fraction */
111  Scalar x_NaCl = salinityToMolFrac_(salinity);
112 
113  // if both phases are present the mole fractions in each phase can be calculate
114  // with the mutual solubility function
115  if (knownPhaseIdx < 0) {
116  Scalar molalityNaCl = moleFracToMolality_(x_NaCl); // molality of NaCl //CHANGED
117  Evaluation m0_CO2 = molalityCO2inPureWater_(temperature, pg); // molality of CO2 in pure water
118  Evaluation gammaStar = activityCoefficient_(temperature, pg, molalityNaCl);// activity coefficient of CO2 in brine
119  Evaluation m_CO2 = m0_CO2 / gammaStar; // molality of CO2 in brine
120  xlCO2 = m_CO2 / (molalityNaCl + 55.508 + m_CO2); // mole fraction of CO2 in brine
121  ygH2O = A * (1 - xlCO2 - x_NaCl); // mole fraction of water in the gas phase
122  }
123 
124  // if only liquid phase is present the mole fraction of CO2 in brine is given and
125  // and the virtual equilibrium mole fraction of water in the non-existing gas phase can be estimated
126  // with the mutual solubility function
127  if (knownPhaseIdx == liquidPhaseIdx)
128  ygH2O = A * (1 - xlCO2 - x_NaCl);
129 
130  // if only gas phase is present the mole fraction of water in the gas phase is given and
131  // and the virtual equilibrium mole fraction of CO2 in the non-existing liquid phase can be estimated
132  // with the mutual solubility function
133  if (knownPhaseIdx == gasPhaseIdx)
134  //y_H2o = fluidstate.
135  xlCO2 = 1 - x_NaCl - ygH2O / A;
136  }
137 
141  template <class Evaluation>
142  static Evaluation henry(const Evaluation& temperature)
143  { return fugacityCoefficientCO2(temperature, /*pressure=*/1e5)*1e5; }
144 
153  template <class Evaluation>
154  static Evaluation fugacityCoefficientCO2(const Evaluation& temperature, const Evaluation& pg)
155  {
156  Valgrind::CheckDefined(temperature);
157  Valgrind::CheckDefined(pg);
158 
159  Evaluation V = 1 / (CO2::gasDensity(temperature, pg) / CO2::molarMass()) * 1.e6; // molar volume in cm^3/mol
160  Evaluation pg_bar = pg / 1.e5; // gas phase pressure in bar
161  Evaluation a_CO2 = (7.54e7 - 4.13e4 * temperature); // mixture parameter of Redlich-Kwong equation
162  Scalar b_CO2 = 27.8; // mixture parameter of Redlich-Kwong equation
163  Scalar R = IdealGas::R * 10.; // ideal gas constant with unit bar cm^3 /(K mol)
164  Evaluation lnPhiCO2;
165 
166  lnPhiCO2 = Opm::log(V / (V - b_CO2));
167  lnPhiCO2 += b_CO2 / (V - b_CO2);
168  lnPhiCO2 -= 2 * a_CO2 / (R * Opm::pow(temperature, 1.5) * b_CO2) * log((V + b_CO2) / V);
169  lnPhiCO2 +=
170  a_CO2 * b_CO2
171  / (R
172  * Opm::pow(temperature, 1.5)
173  * b_CO2
174  * b_CO2)
175  * (Opm::log((V + b_CO2) / V)
176  - b_CO2 / (V + b_CO2));
177  lnPhiCO2 -= Opm::log(pg_bar * V / (R * temperature));
178 
179  return Opm::exp(lnPhiCO2); // fugacity coefficient of CO2
180  }
181 
190  template <class Evaluation>
191  static Evaluation fugacityCoefficientH2O(const Evaluation& temperature, const Evaluation& pg)
192  {
193  const Evaluation& V = 1 / (CO2::gasDensity(temperature, pg) / CO2::molarMass()) * 1.e6; // molar volume in cm^3/mol
194  const Evaluation& pg_bar = pg / 1.e5; // gas phase pressure in bar
195  const Evaluation& a_CO2 = (7.54e7 - 4.13e4 * temperature);// mixture parameter of Redlich-Kwong equation
196  Scalar a_CO2_H2O = 7.89e7;// mixture parameter of Redlich-Kwong equation
197  Scalar b_CO2 = 27.8;// mixture parameter of Redlich-Kwong equation
198  Scalar b_H2O = 18.18;// mixture parameter of Redlich-Kwong equation
199  Scalar R = IdealGas::R * 10.; // ideal gas constant with unit bar cm^3 /(K mol)
200  Evaluation lnPhiH2O;
201 
202  lnPhiH2O =
203  Opm::log(V/(V - b_CO2))
204  + b_H2O/(V - b_CO2) - 2*a_CO2_H2O
205  / (R*Opm::pow(temperature, 1.5)*b_CO2)*Opm::log((V + b_CO2)/V)
206  + a_CO2*b_H2O/(R*Opm::pow(temperature, 1.5)*b_CO2*b_CO2)
207  *(Opm::log((V + b_CO2)/V) - b_CO2/(V + b_CO2))
208  - Opm::log(pg_bar*V/(R*temperature));
209  return Opm::exp(lnPhiH2O); // fugacity coefficient of H2O
210  }
211 
212 private:
218  static Scalar salinityToMolFrac_(Scalar salinity) {
219 
220  const Scalar Mw = H2O::molarMass(); /* molecular weight of water [kg/mol] */
221  const Scalar Ms = 58.8e-3; /* molecular weight of NaCl [kg/mol] */
222 
223  const Scalar X_NaCl = salinity;
224  /* salinity: conversion from mass fraction to mol fraction */
225  const Scalar x_NaCl = -Mw * X_NaCl / ((Ms - Mw) * X_NaCl - Ms);
226  return x_NaCl;
227  }
228 
234  static Scalar moleFracToMolality_(Scalar x_NaCl)
235  {
236  // conversion from mol fraction to molality (dissolved CO2 neglected)
237  return 55.508 * x_NaCl / (1 - x_NaCl);
238  }
239 
247  template <class Evaluation>
248  static Evaluation molalityCO2inPureWater_(const Evaluation& temperature, const Evaluation& pg)
249  {
250  const Evaluation& A = computeA_(temperature, pg); // according to Spycher, Pruess and Ennis-King (2003)
251  const Evaluation& B = computeB_(temperature, pg); // according to Spycher, Pruess and Ennis-King (2003)
252  const Evaluation& yH2OinGas = (1 - B) / (1. / A - B); // equilibrium mol fraction of H2O in the gas phase
253  const Evaluation& xCO2inWater = B * (1 - yH2OinGas); // equilibrium mol fraction of CO2 in the water phase
254  return (xCO2inWater * 55.508) / (1 - xCO2inWater); // CO2 molality
255  }
256 
266  template <class Evaluation>
267  static Evaluation activityCoefficient_(const Evaluation& temperature,
268  const Evaluation& pg,
269  Scalar molalityNaCl)
270  {
271  const Evaluation& lambda = computeLambda_(temperature, pg); // lambda_{CO2-Na+}
272  const Evaluation& xi = computeXi_(temperature, pg); // Xi_{CO2-Na+-Cl-}
273  const Evaluation& lnGammaStar =
274  2*molalityNaCl*lambda + xi*molalityNaCl*molalityNaCl;
275  return Opm::exp(lnGammaStar);
276  }
277 
286  template <class Evaluation>
287  static Evaluation computeA_(const Evaluation& temperature, const Evaluation& pg)
288  {
289  const Evaluation& deltaP = pg / 1e5 - 1; // pressure range [bar] from p0 = 1bar to pg[bar]
290  Scalar v_av_H2O = 18.1; // average partial molar volume of H2O [cm^3/mol]
291  Scalar R = IdealGas::R * 10;
292  const Evaluation& k0_H2O = equilibriumConstantH2O_(temperature); // equilibrium constant for H2O at 1 bar
293  const Evaluation& phi_H2O = fugacityCoefficientH2O(temperature, pg); // fugacity coefficient of H2O for the water-CO2 system
294  const Evaluation& pg_bar = pg / 1.e5;
295  return k0_H2O/(phi_H2O*pg_bar)*Opm::exp(deltaP*v_av_H2O/(R*temperature));
296  }
297 
306  template <class Evaluation>
307  static Evaluation computeB_(const Evaluation& temperature, const Evaluation& pg)
308  {
309  const Evaluation& deltaP = pg / 1e5 - 1; // pressure range [bar] from p0 = 1bar to pg[bar]
310  const Scalar v_av_CO2 = 32.6; // average partial molar volume of CO2 [cm^3/mol]
311  const Scalar R = IdealGas::R * 10;
312  const Evaluation& k0_CO2 = equilibriumConstantCO2_(temperature); // equilibrium constant for CO2 at 1 bar
313  const Evaluation& phi_CO2 = fugacityCoefficientCO2(temperature, pg); // fugacity coefficient of CO2 for the water-CO2 system
314  const Evaluation& pg_bar = pg / 1.e5;
315  return phi_CO2*pg_bar/(55.508*k0_CO2)*Opm::exp(-(deltaP*v_av_CO2)/(R*temperature));
316  }
317 
325  template <class Evaluation>
326  static Evaluation computeLambda_(const Evaluation& temperature, const Evaluation& pg)
327  {
328  static const Scalar c[6] =
329  { -0.411370585, 6.07632013E-4, 97.5347708, -0.0237622469, 0.0170656236, 1.41335834E-5 };
330 
331  Evaluation pg_bar = pg / 1.0E5; /* conversion from Pa to bar */
332  return
333  c[0]
334  + c[1]*temperature
335  + c[2]/temperature
336  + c[3]*pg_bar/temperature
337  + c[4]*pg_bar/(630.0 - temperature)
338  + c[5]*temperature*Opm::log(pg_bar);
339  }
340 
348  template <class Evaluation>
349  static Evaluation computeXi_(const Evaluation& temperature, const Evaluation& pg)
350  {
351  static const Scalar c[4] =
352  { 3.36389723E-4, -1.98298980E-5, 2.12220830E-3, -5.24873303E-3 };
353 
354  Evaluation pg_bar = pg / 1.0E5; /* conversion from Pa to bar */
355  return c[0] + c[1]*temperature + c[2]*pg_bar/temperature + c[3]*pg_bar/(630.0 - temperature);
356  }
357 
364  template <class Evaluation>
365  static Evaluation equilibriumConstantCO2_(const Evaluation& temperature)
366  {
367  Evaluation temperatureCelcius = temperature - 273.15;
368  static const Scalar c[3] = { 1.189, 1.304e-2, -5.446e-5 };
369  Evaluation logk0_CO2 = c[0] + temperatureCelcius*(c[1] + temperatureCelcius*c[2]);
370  Evaluation k0_CO2 = Opm::pow(10.0, logk0_CO2);
371  return k0_CO2;
372  }
373 
380  template <class Evaluation>
381  static Evaluation equilibriumConstantH2O_(const Evaluation& temperature)
382  {
383  Evaluation temperatureCelcius = temperature - 273.15;
384  static const Scalar c[4] = { -2.209, 3.097e-2, -1.098e-4, 2.048e-7 };
385  Evaluation logk0_H2O =
386  c[0] + temperatureCelcius*(c[1] + temperatureCelcius*(c[2] + temperatureCelcius*c[3]));
387  return Opm::pow(10.0, logk0_H2O);
388  }
389 
390 };
391 
392 } // namespace BinaryCoeff
393 } // namespace Opm
394 
395 #endif
Material properties of pure water .
Definition: H2O.hpp:61
static Evaluation fugacityCoefficientH2O(const Evaluation &temperature, const Evaluation &pg)
Returns the fugacity coefficient of the H2O component in a water-CO2 mixture.
Definition: Brine_CO2.hpp:191
static void calculateMoleFractions(const Evaluation &temperature, const Evaluation &pg, Scalar salinity, const int knownPhaseIdx, Evaluation &xlCO2, Evaluation &ygH2O)
Returns the mol (!) fraction of CO2 in the liquid phase and the mol_ (!) fraction of H2O in the gas p...
Definition: Brine_CO2.hpp:101
A class for the CO2 fluid properties.
static Evaluation henry(const Evaluation &temperature)
Henry coefficent for CO2 in brine.
Definition: Brine_CO2.hpp:142
Relations valid for an ideal gas.
A class for the brine fluid properties.
Definition: Air_Mesitylene.hpp:33
Binary coefficients for brine and CO2.
Definition: Brine_CO2.hpp:44
Material properties of pure water .
static const Scalar R
The ideal gas constant .
Definition: IdealGas.hpp:41
A class for the CO2 fluid properties.
Definition: CO2.hpp:54
Relations valid for an ideal gas.
Definition: IdealGas.hpp:37
static Evaluation gasViscosity(Evaluation temperature, const Evaluation &pressure)
The dynamic viscosity [Pa s] of CO2.
Definition: CO2.hpp:202
static Evaluation fugacityCoefficientCO2(const Evaluation &temperature, const Evaluation &pg)
Returns the fugacity coefficient of the CO2 component in a water-CO2 mixture.
Definition: Brine_CO2.hpp:154
static Scalar molarMass()
The mass in [kg] of one mole of CO2.
Definition: CO2.hpp:69
static Evaluation gasDensity(const Evaluation &temperature, const Evaluation &pressure)
The density of CO2 at a given pressure and temperature [kg/m^3].
Definition: CO2.hpp:190
static Evaluation liquidDiffCoeff(const Evaluation &, const Evaluation &)
Binary diffusion coefficent [m^2/s] of CO2 in the brine phase.
Definition: Brine_CO2.hpp:77
static const Scalar molarMass()
The molar mass in of water.
Definition: H2O.hpp:80
static Evaluation gasDiffCoeff(const Evaluation &temperature, const Evaluation &pressure)
Binary diffusion coefficent [m^2/s] of water in the CO2 phase.
Definition: Brine_CO2.hpp:60