27#ifndef OPM_BRINE_CO2_PVT_HPP
28#define OPM_BRINE_CO2_PVT_HPP
55template <
class Scalar>
58 static constexpr bool extrapolate =
true;
79 Scalar T_ref = 288.71,
80 Scalar P_ref = 101325)
83 int num_regions = salinity_.size();
84 co2ReferenceDensity_.resize(num_regions);
85 brineReferenceDensity_.resize(num_regions);
87 for (
int i = 0; i < num_regions; ++i) {
117 brineReferenceDensity_[regionIdx] = rhoRefBrine;
118 co2ReferenceDensity_[regionIdx] = rhoRefCO2;
137 { enableDissolution_ = yesno; }
143 {
return brineReferenceDensity_.size(); }
148 template <
class Evaluation>
150 const Evaluation& temperature,
151 const Evaluation& pressure,
152 const Evaluation& Rs,
153 const Evaluation& )
const
160 template <
class Evaluation>
162 const Evaluation& temperature,
163 const Evaluation& pressure,
164 const Evaluation& Rs)
const
167 const Evaluation xlCO2 = convertRsToXoG_(Rs,regionIdx);
168 return (liquidEnthalpyBrineCO2_(temperature,
170 salinity_[regionIdx],
172 - pressure / density_(regionIdx, temperature, pressure, Rs));
178 template <
class Evaluation>
180 const Evaluation& temperature,
181 const Evaluation& pressure,
182 const Evaluation& )
const
191 template <
class Evaluation>
193 const Evaluation& temperature,
194 const Evaluation& pressure,
195 const Evaluation& )
const
203 template <
class Evaluation>
205 const Evaluation& temperature,
206 const Evaluation& pressure,
208 const Evaluation& )
const
217 template <
class Evaluation>
219 const Evaluation& temperature,
220 const Evaluation& pressure)
const
229 template <
class Evaluation>
231 const Evaluation& temperature,
232 const Evaluation& pressure,
233 const Evaluation& )
const
240 template <
class Evaluation>
242 const Evaluation& temperature,
243 const Evaluation& pressure,
244 const Evaluation& Rs,
245 const Evaluation& )
const
252 template <
class Evaluation>
254 const Evaluation& temperature,
255 const Evaluation& pressure,
256 const Evaluation& Rs)
const
258 return (1.0 - convertRsToXoG_(Rs,regionIdx)) * density_(regionIdx, temperature, pressure, Rs)/brineReferenceDensity_[regionIdx];
264 template <
class Evaluation>
266 const Evaluation& temperature,
267 const Evaluation& pressure)
const
269 Evaluation rsSat = rsSat_(regionIdx, temperature, pressure);
270 return (1.0 - convertRsToXoG_(rsSat,regionIdx)) * density_(regionIdx, temperature, pressure, rsSat)/brineReferenceDensity_[regionIdx];
279 template <
class Evaluation>
282 const Evaluation& )
const
284 throw std::runtime_error(
"Requested the saturation pressure for the brine-co2 pvt module. Not yet implemented.");
293 template <
class Evaluation>
297 const Evaluation& )
const
299 throw std::runtime_error(
"Requested the saturation pressure for the brine-co2 pvt module. Not yet implemented.");
305 template <
class Evaluation>
307 const Evaluation& temperature,
308 const Evaluation& pressure,
310 const Evaluation& )
const
313 return rsSat_(regionIdx, temperature, pressure);
319 template <
class Evaluation>
321 const Evaluation& temperature,
322 const Evaluation& pressure,
323 const Evaluation& )
const
325 return rsSat_(regionIdx, temperature, pressure);
331 template <
class Evaluation>
333 const Evaluation& temperature,
334 const Evaluation& pressure)
const
336 return rsSat_(regionIdx, temperature, pressure);
339 const Scalar oilReferenceDensity(
unsigned regionIdx)
const
340 {
return brineReferenceDensity_[regionIdx]; }
342 const Scalar waterReferenceDensity(
unsigned regionIdx)
const
343 {
return brineReferenceDensity_[regionIdx]; }
345 const Scalar gasReferenceDensity(
unsigned regionIdx)
const
346 {
return co2ReferenceDensity_[regionIdx]; }
348 const Scalar salinity(
unsigned regionIdx)
const
349 {
return salinity_[regionIdx]; }
351 template <
class Evaluation>
352 Evaluation diffusionCoefficient(
const Evaluation& temperature,
353 const Evaluation& pressure,
357 const Evaluation log_D_H20 = -4.1764 + 712.52 / temperature - 2.5907e5 / (temperature*temperature);
362 const Evaluation log_D_Brine = log_D_H20 - 0.87*log10(mu_Brine / mu_H20);
364 return pow(Evaluation(10), log_D_Brine) * 1e-4;
368 std::vector<Scalar> brineReferenceDensity_;
369 std::vector<Scalar> co2ReferenceDensity_;
370 std::vector<Scalar> salinity_;
371 bool enableDissolution_ =
true;
373 template <
class LhsEval>
374 LhsEval density_(
unsigned regionIdx,
375 const LhsEval& temperature,
376 const LhsEval& pressure,
377 const LhsEval& Rs)
const
379 LhsEval xlCO2 = convertXoGToxoG_(convertRsToXoG_(Rs,regionIdx));
380 LhsEval result = liquidDensity_(temperature,
384 Valgrind::CheckDefined(result);
389 template <
class LhsEval>
390 LhsEval liquidDensity_(
const LhsEval& T,
392 const LhsEval& xlCO2)
const
394 Valgrind::CheckDefined(T);
395 Valgrind::CheckDefined(pl);
396 Valgrind::CheckDefined(xlCO2);
398 if(!extrapolate && T < 273.15) {
399 const std::string msg =
400 "Liquid density for Brine and CO2 is only "
401 "defined above 273.15K (is " +
402 std::to_string(getValue(T)) +
"K)";
403 throw NumericalProblem(msg);
405 if(!extrapolate && pl >= 2.5e8) {
406 const std::string msg =
407 "Liquid density for Brine and CO2 is only "
408 "defined below 250MPa (is " +
409 std::to_string(getValue(pl)) +
"Pa)";
410 throw NumericalProblem(msg);
415 const LhsEval& rho_lCO2 = liquidDensityWaterCO2_(T, pl, xlCO2);
416 const LhsEval& contribCO2 = rho_lCO2 - rho_pure;
418 return rho_brine + contribCO2;
421 template <
class LhsEval>
422 LhsEval liquidDensityWaterCO2_(
const LhsEval& temperature,
424 const LhsEval& xlCO2)
const
429 const LhsEval& tempC = temperature - 273.15;
434 const LhsEval xlH2O = 1.0 - xlCO2;
435 const LhsEval& M_T = M_H2O * xlH2O + M_CO2 * xlCO2;
436 const LhsEval& V_phi =
440 tempC*5.044e-7))) / 1.0e6;
441 return 1/ (xlCO2 * V_phi/M_T + M_H2O * xlH2O / (rho_pure * M_T));
448 template <
class LhsEval>
449 LhsEval convertRsToXoG_(
const LhsEval& Rs,
unsigned regionIdx)
const
451 Scalar rho_oRef = brineReferenceDensity_[regionIdx];
452 Scalar rho_gRef = co2ReferenceDensity_[regionIdx];
454 const LhsEval& rho_oG = Rs*rho_gRef;
455 return rho_oG/(rho_oRef + rho_oG);
462 template <
class LhsEval>
463 LhsEval convertXoGToxoG_(
const LhsEval& XoG)
const
467 return XoG*M_Brine / (M_CO2*(1 - XoG) + XoG*M_Brine);
474 template <
class LhsEval>
475 LhsEval convertxoGToXoG(
const LhsEval& xoG)
const
480 return xoG*M_CO2 / (xoG*(M_CO2 - M_Brine) + M_Brine);
488 template <
class LhsEval>
489 LhsEval convertXoGToRs(
const LhsEval& XoG,
unsigned regionIdx)
const
491 Scalar rho_oRef = brineReferenceDensity_[regionIdx];
492 Scalar rho_gRef = co2ReferenceDensity_[regionIdx];
494 return XoG/(1.0 - XoG)*(rho_oRef/rho_gRef);
498 template <
class LhsEval>
499 LhsEval rsSat_(
unsigned regionIdx,
500 const LhsEval& temperature,
501 const LhsEval& pressure)
const
503 if (!enableDissolution_)
512 salinity_[regionIdx],
519 xlCO2 = max(0.0, min(1.0, xlCO2));
521 return convertXoGToRs(convertxoGToXoG(xlCO2), regionIdx);
524 template <
class LhsEval>
525 static LhsEval liquidEnthalpyBrineCO2_(
const LhsEval& T,
528 const LhsEval& X_CO2_w)
535 static constexpr Scalar f[] = {
536 2.63500E-1, 7.48368E-6, 1.44611E-6, -3.80860E-10
540 static constexpr Scalar a[4][3] = {
541 { 9633.6, -4080.0, +286.49 },
542 { +166.58, +68.577, -4.6856 },
543 { -0.90963, -0.36524, +0.249667E-1 },
544 { +0.17965E-2, +0.71924E-3, -0.4900E-4 }
547 LhsEval theta, h_NaCl;
550 LhsEval delta_hCO2, hg, hw;
555 Scalar scalarTheta = scalarValue(theta);
556 Scalar S_lSAT = f[0] + scalarTheta*(f[1] + scalarTheta*(f[2] + scalarTheta*f[3]));
563 h_NaCl = (3.6710E4*T + 0.5*(6.2770E1)*T*T - ((6.6670E-2)/3)*T*T*T
564 +((2.8000E-5)/4)*(T*T*T*T))/(58.44E3)- 2.045698e+02;
566 Scalar m = 1E3/58.44 * S/(1-S);
571 for (i = 0; i<=3; i++) {
572 for (j=0; j<=2; j++) {
573 d_h = d_h + a[i][j] * pow(theta,
static_cast<Scalar
>(i)) * std::pow(m, j);
577 delta_h = (4.184/(1E3 + (58.44 * m)))*d_h;
580 h_ls1 =(1-S)*hw + S*h_NaCl + S*delta_h;
585 delta_hCO2 = (-57.4375 + T * 0.1325) * 1000/44;
591 return (h_ls1 - X_CO2_w*hw + hg*X_CO2_w)*1E3;
A class for the brine fluid properties.
Binary coefficients for brine and CO2.
A class for the CO2 fluid properties.
Provides the OPM specific exception classes.
Binary coefficients for water and CO2.
A generic class which tabulates all thermodynamic properties of a given component.
Binary coefficients for brine and CO2.
Definition: Brine_CO2.hpp:42
static void calculateMoleFractions(const Evaluation &temperature, const Evaluation &pg, Scalar salinity, const int knownPhaseIdx, Evaluation &xlCO2, Evaluation &ygH2O, bool extrapolate=false)
Returns the mol (!) fraction of CO2 in the liquid phase and the mol_ (!) fraction of H2O in the gas p...
Definition: Brine_CO2.hpp:97
This class represents the Pressure-Volume-Temperature relations of the liquid phase for a CO2-Brine s...
Definition: BrineCo2Pvt.hpp:57
Evaluation internalEnergy(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &Rs) const
Returns the specific enthalpy [J/kg] of gas given a set of parameters.
Definition: BrineCo2Pvt.hpp:161
Evaluation saturatedGasDissolutionFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &, const Evaluation &) const
Returns the gas dissoluiton factor [m^3/m^3] of the liquid phase.
Definition: BrineCo2Pvt.hpp:306
Evaluation inverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &Rs) const
Returns the formation volume factor [-] of the fluid phase.
Definition: BrineCo2Pvt.hpp:253
Evaluation saturatedInverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &) const
Returns the formation volume factor [-] of the fluid phase.
Definition: BrineCo2Pvt.hpp:230
unsigned numRegions() const
Return the number of PVT regions which are considered by this PVT-object.
Definition: BrineCo2Pvt.hpp:142
Evaluation saturationPressure(unsigned, const Evaluation &, const Evaluation &) const
Returns the saturation pressure of the brine phase [Pa] depending on its mass fraction of the gas com...
Definition: BrineCo2Pvt.hpp:280
void initEnd()
Finish initializing the oil phase PVT properties.
Definition: BrineCo2Pvt.hpp:125
Evaluation saturatedGasDissolutionFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &) const
Returns the gas dissoluiton factor [m^3/m^3] of the liquid phase.
Definition: BrineCo2Pvt.hpp:320
Evaluation saturatedViscosity(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &) const
Returns the dynamic viscosity [Pa s] of the fluid phase given a set of parameters.
Definition: BrineCo2Pvt.hpp:192
Evaluation viscosity(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &, const Evaluation &) const
Returns the dynamic viscosity [Pa s] of the fluid phase given a set of parameters.
Definition: BrineCo2Pvt.hpp:204
Evaluation saturatedInverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure) const
Returns the formation volume factor [-] of brine saturated with CO2 at a given pressure.
Definition: BrineCo2Pvt.hpp:265
Evaluation saturationPressure(unsigned, const Evaluation &, const Evaluation &, const Evaluation &) const
Returns the saturation pressure of the brine phase [Pa] depending on its mass fraction of the gas com...
Definition: BrineCo2Pvt.hpp:294
void setReferenceDensities(unsigned regionIdx, Scalar rhoRefBrine, Scalar rhoRefCO2, Scalar)
Initialize the reference densities of all fluids for a given PVT region.
Definition: BrineCo2Pvt.hpp:112
Evaluation viscosity(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &) const
Returns the dynamic viscosity [Pa s] of the fluid phase given a set of parameters.
Definition: BrineCo2Pvt.hpp:179
Evaluation saturatedGasDissolutionFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure) const
Returns thegas dissoluiton factor [m^3/m^3] of the liquid phase.
Definition: BrineCo2Pvt.hpp:332
Evaluation inverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &Rs, const Evaluation &) const
Returns the formation volume factor [-] of the fluid phase.
Definition: BrineCo2Pvt.hpp:241
void setEnableDissolvedGas(bool yesno)
Specify whether the PVT model should consider that the CO2 component can dissolve in the brine phase.
Definition: BrineCo2Pvt.hpp:136
Evaluation saturatedViscosity(unsigned, const Evaluation &temperature, const Evaluation &pressure) const
Returns the dynamic viscosity [Pa s] of oil saturated gas at given pressure.
Definition: BrineCo2Pvt.hpp:218
Evaluation internalEnergy(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &Rs, const Evaluation &) const
Returns the specific enthalpy [J/kg] of gas given a set of parameters.
Definition: BrineCo2Pvt.hpp:149
A class for the brine fluid properties.
Definition: Brine.hpp:46
static Scalar molarMass()
The molar mass in of the component.
Definition: Brine.hpp:80
static Evaluation liquidDensity(const Evaluation &temperature, const Evaluation &pressure, bool extrapolate=false)
The density of the liquid component at a given pressure in and temperature in .
Definition: Brine.hpp:262
static Evaluation liquidViscosity(const Evaluation &temperature, const Evaluation &)
The dynamic viscosity of pure water.
Definition: Brine.hpp:339
static Scalar salinity
The mass fraction of salt assumed to be in the brine.
Definition: Brine.hpp:49
A class for the CO2 fluid properties.
Definition: CO2.hpp:53
static Evaluation gasEnthalpy(const Evaluation &temperature, const Evaluation &pressure, bool extrapolate=false)
Specific enthalpy of gaseous CO2 [J/kg].
Definition: CO2.hpp:168
static Scalar molarMass()
The mass in [kg] of one mole of CO2.
Definition: CO2.hpp:70
static Evaluation gasDensity(const Evaluation &temperature, const Evaluation &pressure, bool extrapolate=false)
The density of CO2 at a given pressure and temperature [kg/m^3].
Definition: CO2.hpp:193
Definition: EclipseState.hpp:55
Definition: Schedule.hpp:130
A simple version of pure water with density from Hu et al.
Definition: SimpleHuDuanH2O.hpp:63
static Evaluation liquidEnthalpy(const Evaluation &temperature, const Evaluation &)
Specific enthalpy of liquid water .
Definition: SimpleHuDuanH2O.hpp:191
static Evaluation liquidViscosity(const Evaluation &temperature, const Evaluation &pressure, bool extrapolate)
The dynamic viscosity of pure water.
Definition: SimpleHuDuanH2O.hpp:343
static Evaluation liquidDensity(const Evaluation &temperature, const Evaluation &pressure, bool extrapolate)
The density of pure water at a given pressure and temperature .
Definition: SimpleHuDuanH2O.hpp:302
static Scalar molarMass()
The molar mass in of water.
Definition: SimpleHuDuanH2O.hpp:97
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30