27#ifndef OPM_BRINE_H2_PVT_HPP
28#define OPM_BRINE_H2_PVT_HPP
51template <
class Scalar>
54 static const bool extrapolate =
true;
65 BrineH2Pvt(
const std::vector<Scalar>& salinity,
66 Scalar T_ref = 288.71,
67 Scalar P_ref = 101325)
70 int num_regions = salinity_.size();
71 h2ReferenceDensity_.resize(num_regions);
72 brineReferenceDensity_.resize(num_regions);
73 for (
int i = 0; i < num_regions; ++i) {
94 void setVapPars(
const Scalar,
const Scalar)
106 brineReferenceDensity_[regionIdx] = rhoRefBrine;
107 h2ReferenceDensity_[regionIdx] = rhoRefH2;
124 { enableDissolution_ = yesno; }
133 { enableSaltConcentration_ = yesno; }
139 {
return brineReferenceDensity_.size(); }
144 template <
class Evaluation>
146 const Evaluation& temperature,
147 const Evaluation& pressure,
148 const Evaluation& Rs,
149 const Evaluation& saltConcentration)
const
151 const Evaluation salinity = salinityFromConcentration(regionIdx, temperature, pressure, saltConcentration);
152 const Evaluation xlH2 = convertRsToXoG_(Rs,regionIdx);
153 return (liquidEnthalpyBrineH2_(temperature,
157 - pressure / density_(regionIdx, temperature, pressure, Rs, salinity ));
163 template <
class Evaluation>
165 const Evaluation& temperature,
166 const Evaluation& pressure,
167 const Evaluation& Rs)
const
169 const Evaluation xlH2 = convertRsToXoG_(Rs,regionIdx);
170 return (liquidEnthalpyBrineH2_(temperature,
172 Evaluation(salinity_[regionIdx]),
174 - pressure / density_(regionIdx, temperature, pressure, Rs, Evaluation(salinity_[regionIdx])));
180 template <
class Evaluation>
182 const Evaluation& temperature,
183 const Evaluation& pressure,
184 const Evaluation& )
const
193 template <
class Evaluation>
195 const Evaluation& temperature,
196 const Evaluation& pressure,
197 const Evaluation& saltConcentration)
const
199 const Evaluation salinity = salinityFromConcentration(regionIdx, temperature, pressure, saltConcentration);
206 template <
class Evaluation>
208 const Evaluation& temperature,
209 const Evaluation& pressure,
211 const Evaluation& saltConcentration)
const
220 template <
class Evaluation>
222 const Evaluation& temperature,
223 const Evaluation& pressure)
const
231 template <
class Evaluation>
233 const Evaluation& temperature,
234 const Evaluation& pressure,
235 const Evaluation& saltconcentration)
const
237 const Evaluation salinity = salinityFromConcentration(regionIdx, temperature, pressure, saltconcentration);
238 Evaluation rsSat = rsSat_(regionIdx, temperature, pressure, salinity);
239 return (1.0 - convertRsToXoG_(rsSat,regionIdx)) *
240 density_(regionIdx, temperature, pressure, rsSat, salinity) / brineReferenceDensity_[regionIdx];
246 template <
class Evaluation>
248 const Evaluation& temperature,
249 const Evaluation& pressure,
250 const Evaluation& Rs,
251 const Evaluation& saltConcentration)
const
253 const Evaluation salinity = salinityFromConcentration(regionIdx, temperature, pressure, saltConcentration);
254 return (1.0 - convertRsToXoG_(Rs,regionIdx)) *
255 density_(regionIdx, temperature, pressure, Rs, salinity) / brineReferenceDensity_[regionIdx];
261 template <
class Evaluation>
263 const Evaluation& temperature,
264 const Evaluation& pressure,
265 const Evaluation& Rs)
const
267 return (1.0 - convertRsToXoG_(Rs, regionIdx)) *
268 density_(regionIdx, temperature, pressure, Rs, Evaluation(salinity_[regionIdx])) /
269 brineReferenceDensity_[regionIdx];
275 template <
class Evaluation>
277 const Evaluation& temperature,
278 const Evaluation& pressure)
const
280 Evaluation rsSat = rsSat_(regionIdx, temperature, pressure, Evaluation(salinity_[regionIdx]));
281 return (1.0 - convertRsToXoG_(rsSat, regionIdx)) *
282 density_(regionIdx, temperature, pressure, rsSat, Evaluation(salinity_[regionIdx])) /
283 brineReferenceDensity_[regionIdx];
291 template <
class Evaluation>
294 const Evaluation& )
const
296 throw std::runtime_error(
"Saturation pressure for the Brine-H2 PVT module has not been implemented yet!");
304 template <
class Evaluation>
308 const Evaluation& )
const
310 throw std::runtime_error(
"Saturation pressure for the Brine-H2 PVT module has not been implemented yet!");
316 template <
class Evaluation>
318 const Evaluation& temperature,
319 const Evaluation& pressure,
321 const Evaluation& )
const
324 return rsSat_(regionIdx, temperature, pressure, Evaluation(salinity_[regionIdx]));
330 template <
class Evaluation>
332 const Evaluation& temperature,
333 const Evaluation& pressure,
334 const Evaluation& saltConcentration)
const
336 const Evaluation salinity = salinityFromConcentration(regionIdx, temperature, 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 const Scalar oilReferenceDensity(
unsigned regionIdx)
const
352 {
return brineReferenceDensity_[regionIdx]; }
354 const Scalar waterReferenceDensity(
unsigned regionIdx)
const
355 {
return brineReferenceDensity_[regionIdx]; }
357 const Scalar gasReferenceDensity(
unsigned regionIdx)
const
358 {
return h2ReferenceDensity_[regionIdx]; }
360 const Scalar salinity(
unsigned regionIdx)
const
361 {
return salinity_[regionIdx]; }
366 template <
class Evaluation>
368 const Evaluation& pressure,
374 const Scalar vm = 28.45;
375 const Scalar sigma = 2.96 * 1e-8;
376 const Scalar avogadro = 6.022e23;
377 const Scalar alpha = sigma / pow((vm / avogadro), 1 / 3);
378 const Scalar lambda = 1.729;
380 const Evaluation& mu_brine =
Brine::liquidViscosity(temperature, pressure, Evaluation(salinity_[0])) * 1e3;
383 const Evaluation D_pure = ((4.8e-7 * temperature) / pow(mu_pure, alpha)) * pow((1 + pow(lambda, 2)) / vm, 0.6);
387 const Evaluation log_D_brine = log10(D_pure) - 0.637 * log10(mu_brine / mu_pure);
389 return pow(Evaluation(10), log_D_brine) * 1e-4;
393 std::vector<Scalar> brineReferenceDensity_;
394 std::vector<Scalar> h2ReferenceDensity_;
395 std::vector<Scalar> salinity_;
396 bool enableDissolution_ =
true;
397 bool enableSaltConcentration_ =
false;
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;
478 template <
class LhsEval>
479 LhsEval liquidDensityWaterH2_(
const LhsEval& temperature,
481 const LhsEval& xlH2)
const
491 const LhsEval& A1 = 51.1904 - 0.208062*temperature + 3.4427e-4*(temperature*temperature);
492 const LhsEval& A2 = -0.022;
493 const LhsEval& V_phi = (A1 + A2 * (pl / 1e6)) / 1e6;
496 const LhsEval xlH2O = 1.0 - xlH2;
497 const LhsEval& M_T = M_H2O * xlH2O + M_H2 * xlH2;
498 const LhsEval& rho_aq = 1 / (xlH2 * V_phi/M_T + M_H2O * xlH2O / (rho_pure * M_T));
510 template <
class LhsEval>
511 LhsEval convertRsToXoG_(
const LhsEval& Rs,
unsigned regionIdx)
const
513 Scalar rho_oRef = brineReferenceDensity_[regionIdx];
514 Scalar rho_gRef = h2ReferenceDensity_[regionIdx];
516 const LhsEval& rho_oG = Rs*rho_gRef;
517 return rho_oG/(rho_oRef + rho_oG);
525 template <
class LhsEval>
526 LhsEval convertXoGToxoG_(
const LhsEval& XoG,
const LhsEval& salinity)
const
530 return XoG*M_Brine / (M_H2*(1 - XoG) + XoG*M_Brine);
538 template <
class LhsEval>
539 LhsEval convertxoGToXoG(
const LhsEval& xoG,
const LhsEval& salinity)
const
544 return xoG*M_H2 / (xoG*(M_H2 - M_Brine) + M_Brine);
554 template <
class LhsEval>
555 LhsEval convertXoGToRs(
const LhsEval& XoG,
unsigned regionIdx)
const
557 Scalar rho_oRef = brineReferenceDensity_[regionIdx];
558 Scalar rho_gRef = h2ReferenceDensity_[regionIdx];
560 return XoG/(1.0 - XoG)*(rho_oRef/rho_gRef);
570 template <
class LhsEval>
571 LhsEval rsSat_(
unsigned regionIdx,
572 const LhsEval& temperature,
573 const LhsEval& pressure,
574 const LhsEval& salinity)
const
577 if (!enableDissolution_)
584 xlH2 = max(0.0, min(1.0, xlH2));
586 return convertXoGToRs(convertxoGToXoG(xlH2, salinity), regionIdx);
589 template <
class LhsEval>
590 static LhsEval liquidEnthalpyBrineH2_(
const LhsEval& T,
592 const LhsEval& salinity,
593 const LhsEval& X_H2_w)
599 static constexpr Scalar f[] = {
600 2.63500E-1, 7.48368E-6, 1.44611E-6, -3.80860E-10
604 static constexpr Scalar a[4][3] = {
605 { 9633.6, -4080.0, +286.49 },
606 { +166.58, +68.577, -4.6856 },
607 { -0.90963, -0.36524, +0.249667E-1 },
608 { +0.17965E-2, +0.71924E-3, -0.4900E-4 }
611 LhsEval theta, h_NaCl;
620 Scalar scalarTheta = scalarValue(theta);
621 Scalar S_lSAT = f[0] + scalarTheta*(f[1] + scalarTheta*(f[2] + scalarTheta*f[3]));
623 LhsEval S = salinity;
630 h_NaCl = (3.6710E4*T + 0.5*(6.2770E1)*T*T - ((6.6670E-2)/3)*T*T*T
631 +((2.8000E-5)/4)*(T*T*T*T))/(58.44E3)- 2.045698e+02;
633 LhsEval m = 1E3/58.44 * S/(1-S);
638 for (i = 0; i<=3; i++) {
639 for (j=0; j<=2; j++) {
640 d_h = d_h + a[i][j] * pow(theta,
static_cast<Scalar
>(i)) * pow(m, j);
644 delta_h = (4.184/(1E3 + (58.44 * m)))*d_h;
647 h_ls1 =(1-S)*hw + S*h_NaCl + S*delta_h;
653 return (h_ls1 - X_H2_w*hw + hg*X_H2_w)*1E3;
656 template <
class LhsEval>
657 const LhsEval salinityFromConcentration(
unsigned regionIdx,
660 const LhsEval& saltConcentration)
const
662 if (enableSaltConcentration_)
665 return salinity(regionIdx);
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:53
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:221
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:262
void setEnableSaltConcentration(bool yesno)
Specify whether the PVT model should consider salt concentration from the fluidstate or a fixed salin...
Definition BrineH2Pvt.hpp:132
void initEnd()
Finish initializing the oil phase PVT properties.
Definition BrineH2Pvt.hpp:113
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:305
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:247
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:164
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:194
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 BrineH2Pvt.hpp:317
void setEnableDissolvedGas(bool yesno)
Specify whether the PVT model should consider that the H2 component can dissolve in the brine phase.
Definition BrineH2Pvt.hpp:123
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:181
unsigned numRegions() const
Return the number of PVT regions which are considered by this PVT-object.
Definition BrineH2Pvt.hpp:138
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:276
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.hpp:101
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:232
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:292
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:207
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:331
Evaluation internalEnergy(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &Rs, const Evaluation &saltConcentration) const
Returns the specific enthalpy [J/kg] of gas given a set of parameters.
Definition BrineH2Pvt.hpp:145
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 Evaluation gasDensity(Evaluation temperature, Evaluation pressure, bool extrapolate=false)
The density of at a given pressure and temperature.
Definition H2.hpp:167
static const Evaluation gasEnthalpy(Evaluation temperature, Evaluation pressure, bool extrapolate=false)
Specific enthalpy of pure hydrogen gas.
Definition H2.hpp:232
Definition Schedule.hpp:88
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