27#ifndef OPM_BRINE_H2_PVT_HPP
28#define OPM_BRINE_H2_PVT_HPP
52template <
class Scalar>
55 static const bool extrapolate =
true;
66 explicit BrineH2Pvt(
const std::vector<Scalar>& salinity,
67 Scalar T_ref = 288.71,
68 Scalar P_ref = 101325);
80 void setVapPars(
const Scalar,
const Scalar)
106 { enableDissolution_ = yesno; }
115 { enableSaltConcentration_ = yesno; }
121 {
return brineReferenceDensity_.size(); }
129 template <
class Evaluation>
130 Evaluation internalEnergy(
unsigned regionIdx,
131 const Evaluation& temperature,
132 const Evaluation& pressure,
133 const Evaluation& Rs,
134 const Evaluation& saltConcentration)
const
136 const Evaluation salinity = salinityFromConcentration(regionIdx, temperature,
137 pressure, saltConcentration);
138 const Evaluation xlH2 = convertRsToXoG_(Rs,regionIdx);
139 return liquidEnthalpyBrineH2_(temperature,
143 - pressure / density_(regionIdx, temperature, pressure, Rs, salinity);
149 template <
class Evaluation>
151 const Evaluation& temperature,
152 const Evaluation& pressure,
153 const Evaluation& Rs)
const
155 const Evaluation xlH2 = convertRsToXoG_(Rs,regionIdx);
156 return liquidEnthalpyBrineH2_(temperature,
158 Evaluation(salinity_[regionIdx]),
160 - pressure / density_(regionIdx, temperature, pressure,
161 Rs, Evaluation(salinity_[regionIdx]));
167 template <
class Evaluation>
169 const Evaluation& temperature,
170 const Evaluation& pressure,
171 const Evaluation& )
const
180 template <
class Evaluation>
182 const Evaluation& temperature,
183 const Evaluation& pressure,
184 const Evaluation& saltConcentration)
const
186 const Evaluation salinity = salinityFromConcentration(regionIdx, temperature,
187 pressure, saltConcentration);
194 template <
class Evaluation>
196 const Evaluation& temperature,
197 const Evaluation& pressure,
199 const Evaluation& saltConcentration)
const
208 template <
class Evaluation>
210 const Evaluation& temperature,
211 const Evaluation& pressure)
const
219 template <
class Evaluation>
221 const Evaluation& temperature,
222 const Evaluation& pressure,
223 const Evaluation& saltconcentration)
const
225 const Evaluation salinity = salinityFromConcentration(regionIdx, temperature,
226 pressure, saltconcentration);
227 Evaluation rsSat = rsSat_(regionIdx, temperature, pressure, salinity);
228 return (1.0 - convertRsToXoG_(rsSat,regionIdx))
229 * density_(regionIdx, temperature, pressure, rsSat, salinity)
230 / brineReferenceDensity_[regionIdx];
236 template <
class Evaluation>
238 const Evaluation& temperature,
239 const Evaluation& pressure,
240 const Evaluation& Rs,
241 const Evaluation& saltConcentration)
const
243 const Evaluation salinity = salinityFromConcentration(regionIdx, temperature,
244 pressure, saltConcentration);
245 return (1.0 - convertRsToXoG_(Rs,regionIdx))
246 * density_(regionIdx, temperature, pressure, Rs, salinity)
247 / brineReferenceDensity_[regionIdx];
253 template <
class Evaluation>
255 const Evaluation& temperature,
256 const Evaluation& pressure,
257 const Evaluation& Rs)
const
259 return (1.0 - convertRsToXoG_(Rs, regionIdx))
260 * density_(regionIdx, temperature, pressure, Rs, Evaluation(salinity_[regionIdx]))
261 / brineReferenceDensity_[regionIdx];
268 template <
class Evaluation>
270 const Evaluation& temperature,
271 const Evaluation& pressure)
const
273 Evaluation rsSat = rsSat_(regionIdx, temperature,
274 pressure, Evaluation(salinity_[regionIdx]));
275 return (1.0 - convertRsToXoG_(rsSat, regionIdx))
276 * density_(regionIdx, temperature, pressure, rsSat,
277 Evaluation(salinity_[regionIdx]))
278 / brineReferenceDensity_[regionIdx];
287 template <
class Evaluation>
290 const Evaluation& )
const
292 throw std::runtime_error(
"Saturation pressure for the Brine-H2 PVT module "
293 "has not been implemented yet!");
302 template <
class Evaluation>
306 const Evaluation& )
const
308 throw std::runtime_error(
"Saturation pressure for the Brine-H2 PVT module "
309 "has not been implemented yet!");
315 template <
class Evaluation>
317 const Evaluation& temperature,
318 const Evaluation& pressure,
320 const Evaluation& )
const
323 return rsSat_(regionIdx, temperature, pressure, Evaluation(salinity_[regionIdx]));
329 template <
class Evaluation>
331 const Evaluation& temperature,
332 const Evaluation& pressure,
333 const Evaluation& saltConcentration)
const
335 const Evaluation salinity = salinityFromConcentration(regionIdx, temperature,
336 pressure, saltConcentration);
337 return rsSat_(regionIdx, temperature, pressure, salinity);
343 template <
class Evaluation>
345 const Evaluation& temperature,
346 const Evaluation& pressure)
const
348 return rsSat_(regionIdx, temperature, pressure, Evaluation(salinity_[regionIdx]));
351 Scalar oilReferenceDensity(
unsigned regionIdx)
const
352 {
return brineReferenceDensity_[regionIdx]; }
354 Scalar waterReferenceDensity(
unsigned regionIdx)
const
355 {
return brineReferenceDensity_[regionIdx]; }
357 Scalar gasReferenceDensity(
unsigned regionIdx)
const
358 {
return h2ReferenceDensity_[regionIdx]; }
360 Scalar salinity(
unsigned regionIdx)
const
361 {
return salinity_[regionIdx]; }
366 template <
class Evaluation>
368 const Evaluation& pressure,
376 const Scalar vm = 28.45;
377 const Scalar sigma = 2.96 * 1e-8;
378 const Scalar avogadro = 6.022e23;
379 const Scalar alpha = sigma / pow((vm / avogadro), 1 / 3);
380 const Scalar lambda = 1.729;
383 Evaluation(salinity_[0])) * 1e3;
386 const Evaluation D_pure = ((4.8e-7 * temperature) / pow(mu_pure, alpha)) *
387 pow((1 + pow(lambda, 2)) / vm, 0.6);
393 const Evaluation log_D_brine = log10(D_pure) - 0.637 * log10(mu_brine / mu_pure);
395 return pow(Evaluation(10), log_D_brine) * 1e-4;
406 template <
class LhsEval>
407 LhsEval density_(
unsigned regionIdx,
408 const LhsEval& temperature,
409 const LhsEval& pressure,
411 const LhsEval& salinity)
const
414 LhsEval xlH2 = convertXoGToxoG_(convertRsToXoG_(Rs,regionIdx), salinity);
417 LhsEval result = liquidDensity_(temperature,
422 Valgrind::CheckDefined(result);
434 template <
class LhsEval>
435 LhsEval liquidDensity_(
const LhsEval& T,
438 const LhsEval& salinity)
const
441 Valgrind::CheckDefined(T);
442 Valgrind::CheckDefined(pl);
443 Valgrind::CheckDefined(xlH2);
446 if (!extrapolate && T < 273.15) {
447 const std::string msg =
448 "Liquid density for Brine and H2 is only "
449 "defined above 273.15K (is " +
450 std::to_string(getValue(T)) +
"K)";
451 throw NumericalProblem(msg);
453 if (!extrapolate && pl >= 2.5e8) {
454 const std::string msg =
455 "Liquid density for Brine and H2 is only "
456 "defined below 250MPa (is " +
457 std::to_string(getValue(pl)) +
"Pa)";
458 throw NumericalProblem(msg);
464 const LhsEval& rho_lH2 = liquidDensityWaterH2_(T, pl, xlH2);
465 const LhsEval& contribH2 = rho_lH2 - rho_pure;
467 return rho_brine + contribH2;
479 template <
class LhsEval>
480 LhsEval liquidDensityWaterH2_(
const LhsEval& temperature,
482 const LhsEval& xlH2)
const
492 const LhsEval& A1 = 51.1904 - 0.208062 * temperature +
493 3.4427e-4 * temperature * temperature;
494 const LhsEval& A2 = -0.022;
496 const LhsEval& V_phi = (A1 + A2 * (pl / 1e6)) / 1e6;
499 const LhsEval xlH2O = 1.0 - xlH2;
500 const LhsEval& M_T = M_H2O * xlH2O + M_H2 * xlH2;
501 const LhsEval& rho_aq = 1 / (xlH2 * V_phi/M_T + M_H2O * xlH2O / (rho_pure * M_T));
513 template <
class LhsEval>
514 LhsEval convertRsToXoG_(
const LhsEval& Rs,
unsigned regionIdx)
const
516 Scalar rho_oRef = brineReferenceDensity_[regionIdx];
517 Scalar rho_gRef = h2ReferenceDensity_[regionIdx];
519 const LhsEval& rho_oG = Rs*rho_gRef;
520 return rho_oG/(rho_oRef + rho_oG);
529 template <
class LhsEval>
530 LhsEval convertXoGToxoG_(
const LhsEval& XoG,
const LhsEval& salinity)
const
534 return XoG*M_Brine / (M_H2*(1 - XoG) + XoG*M_Brine);
543 template <
class LhsEval>
544 LhsEval convertxoGToXoG(
const LhsEval& xoG,
const LhsEval& salinity)
const
549 return xoG*M_H2 / (xoG*(M_H2 - M_Brine) + M_Brine);
559 template <
class LhsEval>
560 LhsEval convertXoGToRs(
const LhsEval& XoG,
unsigned regionIdx)
const
562 Scalar rho_oRef = brineReferenceDensity_[regionIdx];
563 Scalar rho_gRef = h2ReferenceDensity_[regionIdx];
565 return XoG/(1.0 - XoG)*(rho_oRef/rho_gRef);
575 template <
class LhsEval>
576 LhsEval rsSat_(
unsigned regionIdx,
577 const LhsEval& temperature,
578 const LhsEval& pressure,
579 const LhsEval& salinity)
const
582 if (!enableDissolution_)
587 salinity, extrapolate);
590 xlH2 = max(0.0, min(1.0, xlH2));
592 return convertXoGToRs(convertxoGToXoG(xlH2, salinity), regionIdx);
595 template <
class LhsEval>
596 static LhsEval liquidEnthalpyBrineH2_(
const LhsEval& T,
598 const LhsEval& salinity,
599 const LhsEval& X_H2_w)
605 static constexpr Scalar f[] = {
606 2.63500E-1, 7.48368E-6, 1.44611E-6, -3.80860E-10
610 static constexpr Scalar a[4][3] = {
611 { 9633.6, -4080.0, +286.49 },
612 { +166.58, +68.577, -4.6856 },
613 { -0.90963, -0.36524, +0.249667E-1 },
614 { +0.17965E-2, +0.71924E-3, -0.4900E-4 }
617 LhsEval theta, h_NaCl;
626 Scalar scalarTheta = scalarValue(theta);
627 Scalar S_lSAT = f[0] + scalarTheta*(f[1] + scalarTheta*(f[2] + scalarTheta*f[3]));
629 LhsEval S = salinity;
637 h_NaCl = (3.6710E4*T + 0.5*(6.2770E1)*T*T - ((6.6670E-2)/3)*T*T*T
638 +((2.8000E-5)/4)*(T*T*T*T))/(58.44E3)- 2.045698e+02;
640 LhsEval m = 1E3/58.44 * S/(1-S);
643 for (
int i = 0; i <=3 ; ++i) {
644 for (
int j = 0; j <= 2; ++j) {
645 d_h = d_h + a[i][j] * pow(theta,
static_cast<Scalar
>(i)) * pow(m, j);
649 delta_h = (4.184/(1E3 + (58.44 * m)))*d_h;
652 h_ls1 =(1-S)*hw + S*h_NaCl + S*delta_h;
658 return (h_ls1 - X_H2_w*hw + hg*X_H2_w)*1E3;
661 template <
class LhsEval>
662 const LhsEval salinityFromConcentration(
unsigned regionIdx,
665 const LhsEval& saltConcentration)
const
667 if (enableSaltConcentration_) {
671 return salinity(regionIdx);
674 std::vector<Scalar> brineReferenceDensity_{};
675 std::vector<Scalar> h2ReferenceDensity_{};
676 std::vector<Scalar> salinity_{};
677 bool enableDissolution_ =
true;
678 bool enableSaltConcentration_ =
false;
A class for the brine fluid properties.
Binary coefficients for brine and H2.
Provides the OPM specific exception classes.
Properties of pure molecular hydrogen .
A simple version of pure water with density from Hu et al.
Some templates to wrap the valgrind client request macros.
Binary coefficients for brine and H2.
Definition Brine_H2.hpp:41
static Evaluation calculateMoleFractions(const Evaluation &temperature, const Evaluation &pg, const Evaluation &salinity, bool extrapolate=false)
Returns the mol (!) fraction of H2 in the liquid phase for a given temperature, pressure,...
Definition Brine_H2.hpp:57
A class for the brine fluid properties.
Definition BrineDynamic.hpp:48
static Evaluation liquidDensity(const Evaluation &temperature, const Evaluation &pressure, const Evaluation &salinity, bool extrapolate=false)
The density of the liquid component at a given pressure in and temperature in .
Definition BrineDynamic.hpp:263
static Evaluation liquidViscosity(const Evaluation &temperature, const Evaluation &, const Evaluation &salinity)
The dynamic viscosity of pure water.
Definition BrineDynamic.hpp:340
This class represents the Pressure-Volume-Temperature relations of the liquid phase for a H2-Brine sy...
Definition BrineH2Pvt.hpp:54
Evaluation saturatedViscosity(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure) const
Returns the dynamic viscosity [Pa s] of oil saturated gas at given pressure.
Definition BrineH2Pvt.hpp:209
Evaluation inverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &Rs) const
Returns the formation volume factor [-] of the fluid phase.
Definition BrineH2Pvt.hpp:254
void setEnableSaltConcentration(bool yesno)
Specify whether the PVT model should consider salt concentration from the fluidstate or a fixed salin...
Definition BrineH2Pvt.hpp:114
void initEnd()
Finish initializing the oil phase PVT properties.
Definition BrineH2Pvt.hpp:95
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 BrineH2Pvt.hpp:303
Evaluation inverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &Rs, const Evaluation &saltConcentration) const
Returns the formation volume factor [-] of the fluid phase.
Definition BrineH2Pvt.hpp:237
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 BrineH2Pvt.hpp:150
Evaluation saturatedViscosity(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &saltConcentration) const
Returns the dynamic viscosity [Pa s] of the fluid phase given a set of parameters.
Definition BrineH2Pvt.hpp:181
Evaluation saturatedGasDissolutionFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &, const Evaluation &) const
Returns the gas dissolution factor [m^3/m^3] of the liquid phase.
Definition BrineH2Pvt.hpp:316
void setEnableDissolvedGas(bool yesno)
Specify whether the PVT model should consider that the H2 component can dissolve in the brine phase.
Definition BrineH2Pvt.hpp:105
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 BrineH2Pvt.hpp:168
unsigned numRegions() const
Return the number of PVT regions which are considered by this PVT-object.
Definition BrineH2Pvt.hpp:120
Evaluation saturatedInverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure) const
Returns the formation volume factor [-] of brine saturated with H2 at a given pressure.
Definition BrineH2Pvt.hpp:269
Evaluation diffusionCoefficient(const Evaluation &temperature, const Evaluation &pressure, unsigned) const
Diffusion coefficient of H2 in water.
Definition BrineH2Pvt.hpp:367
Evaluation saturatedGasDissolutionFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure) const
Returns thegas dissoluiton factor [m^3/m^3] of the liquid phase.
Definition BrineH2Pvt.hpp:344
void setReferenceDensities(unsigned regionIdx, Scalar rhoRefBrine, Scalar rhoRefH2, Scalar)
Initialize the reference densities of all fluids for a given PVT region.
Definition BrineH2Pvt.cpp:114
Evaluation saturatedInverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &saltconcentration) const
Returns the formation volume factor [-] of the fluid phase.
Definition BrineH2Pvt.hpp:220
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 BrineH2Pvt.hpp:288
Scalar hVap(unsigned) const
Returns the specific enthalpy [J/kg] of gas given a set of parameters.
Definition BrineH2Pvt.hpp:126
Evaluation viscosity(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &, const Evaluation &saltConcentration) const
Returns the dynamic viscosity [Pa s] of the fluid phase given a set of parameters.
Definition BrineH2Pvt.hpp:195
Evaluation saturatedGasDissolutionFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &saltConcentration) const
Returns the gas dissoluiton factor [m^3/m^3] of the liquid phase.
Definition BrineH2Pvt.hpp:330
static Scalar molarMass()
The molar mass in of the component.
Definition Component.hpp:93
Definition EclipseState.hpp:63
Properties of pure molecular hydrogen .
Definition H2.hpp:58
static constexpr Scalar molarMass()
The molar mass in of molecular hydrogen.
Definition H2.hpp:77
static const Evaluation gasEnthalpy(Evaluation temperature, Evaluation pressure, bool extrapolate=false)
Specific enthalpy of pure hydrogen gas.
Definition H2.hpp:232
Definition Schedule.hpp:89
A simple version of pure water with density from Hu et al.
Definition SimpleHuDuanH2O.hpp:65
static Evaluation liquidEnthalpy(const Evaluation &temperature, const Evaluation &)
Specific enthalpy of liquid water .
Definition SimpleHuDuanH2O.hpp:198
static Evaluation liquidViscosity(const Evaluation &temperature, const Evaluation &pressure, bool extrapolate)
The dynamic viscosity of pure water.
Definition SimpleHuDuanH2O.hpp:351
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:310
static Scalar molarMass()
The molar mass in of water.
Definition SimpleHuDuanH2O.hpp:99
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30