27#ifndef OPM_CO2_GAS_PVT_HPP
28#define OPM_CO2_GAS_PVT_HPP
30#include <opm/common/utility/VectorWithDefaultAllocator.hpp>
33#include <opm/common/TimingMacros.hpp>
34#include <opm/common/ErrorMacros.hpp>
35#include <opm/common/utility/gpuDecorators.hpp>
43#include <opm/input/eclipse/EclipseState/Co2StoreConfig.hpp>
44#include <opm/material/components/CO2Tables.hpp>
45#include <opm/input/eclipse/EclipseState/EclipseState.hpp>
46#include <opm/input/eclipse/EclipseState/Tables/TableManager.hpp>
58template <
class Scalar,
template<
class>
class Storage>
64 template <
class Scalar>
65 Co2GasPvt<Scalar, GpuView>
73template <
class Scalar,
template<
class>
class Storage = VectorWithDefaultAllocator>
80 using ContainerT = Storage<Scalar>;
81 static constexpr bool extrapolate =
true;
87 Co2GasPvt() =
default;
89 explicit Co2GasPvt(
const ContainerT& salinity,
90 int activityModel = 3,
91 int thermalMixingModel = 1,
92 Scalar T_ref = 288.71,
93 Scalar P_ref = 101325);
95 Co2GasPvt(
const Params& params,
96 const ContainerT& brineReferenceDensity,
97 const ContainerT& gasReferenceDensity,
98 const ContainerT& salinity,
99 bool enableEzrokhiDensity,
100 bool enableVaporization,
102 Co2StoreConfig::GasMixingType gastype)
103 : brineReferenceDensity_(brineReferenceDensity)
104 , gasReferenceDensity_(gasReferenceDensity)
105 , salinity_(salinity)
106 , enableEzrokhiDensity_(enableEzrokhiDensity)
107 , enableVaporization_(enableVaporization)
108 , activityModel_(activityModel)
112 assert(enableEzrokhiDensity ==
false &&
"Ezrokhi density not supported by GPUs");
119 OPM_HOST_DEVICE
void setVapPars(
const Scalar,
const Scalar)
124 OPM_HOST_DEVICE
static constexpr bool isActive()
144 { enableVaporization_ = yesno; }
167 {
return gasReferenceDensity_.size(); }
169 OPM_HOST_DEVICE Scalar hVap(
unsigned )
const
175 template <
class Evaluation>
177 const Evaluation& temperature,
178 const Evaluation& pressure,
179 const Evaluation& rv,
180 const Evaluation& rvw)
const
183 if (gastype_ == Co2StoreConfig::GasMixingType::NONE) {
188 assert(gastype_ == Co2StoreConfig::GasMixingType::IDEAL);
190 Evaluation result = 0;
193 assert(rv == 0.0 || rvw == 0.0);
194 const Evaluation xBrine = convertRvwToXgW_(max(rvw,rv),regionIdx);
204 template <
class Evaluation>
205 OPM_HOST_DEVICE Evaluation
viscosity(
unsigned regionIdx,
206 const Evaluation& temperature,
207 const Evaluation& pressure,
209 const Evaluation& )
const
215 template <
class Evaluation>
217 const Evaluation& temperature,
218 const Evaluation& pressure)
const
228 template <
class Evaluation>
230 const Evaluation& temperature,
231 const Evaluation& pressure,
232 const Evaluation& rv,
233 const Evaluation& rvw)
const
235 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
236 if (!enableVaporization_) {
237 return CO2::gasDensity(co2Tables, temperature, pressure, extrapolate) /
238 gasReferenceDensity_[regionIdx];
242 const auto& rhoCo2 =
CO2::gasDensity(co2Tables, temperature, pressure, extrapolate);
249 return rhoCo2 / (gasReferenceDensity_[regionIdx] +
250 max(rvw,rv) * brineReferenceDensity_[regionIdx]);
256 template <
class Flu
idState,
class LhsEval =
typename Flu
idState::ValueType>
257 std::pair<LhsEval, LhsEval>
260 const LhsEval& T = decay<LhsEval>(fluidState.temperature(FluidState::gasPhaseIdx));
261 const LhsEval& p = decay<LhsEval>(fluidState.pressure(FluidState::gasPhaseIdx));
262 const LhsEval& Rv = decay<LhsEval>(fluidState.Rv());
263 const LhsEval& Rvw = decay<LhsEval>(fluidState.Rvw());
265 this->
viscosity(regionIdx, T, p, Rv, Rvw) };
271 template <
class Evaluation>
273 const Evaluation& temperature,
274 const Evaluation& pressure)
const
276 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
277 const Evaluation rvw = rvwSat_(regionIdx, temperature, pressure,
278 Evaluation(salinity_[regionIdx]));
280 pressure, Evaluation(0.0), rvw);
290 template <
class Evaluation>
293 const Evaluation& )
const
299 template <
class Evaluation>
301 const Evaluation& temperature,
302 const Evaluation& pressure)
const
303 {
return rvwSat_(regionIdx, temperature, pressure, Evaluation(salinity_[regionIdx])); }
308 template <
class Evaluation = Scalar>
310 const Evaluation& temperature,
311 const Evaluation& pressure,
312 const Evaluation& saltConcentration)
const
314 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
315 const Evaluation salinity = salinityFromConcentration(temperature, pressure,
317 return rvwSat_(regionIdx, temperature, pressure, salinity);
323 template <
class Evaluation>
325 const Evaluation& temperature,
326 const Evaluation& pressure,
328 const Evaluation& )
const
329 {
return rvwSat_(regionIdx, temperature, pressure, Evaluation(salinity_[regionIdx])); }
334 template <
class Evaluation>
336 const Evaluation& temperature,
337 const Evaluation& pressure)
const
338 {
return rvwSat_(regionIdx, temperature, pressure, Evaluation(salinity_[regionIdx])); }
340 template <
class Evaluation>
341 OPM_HOST_DEVICE Evaluation diffusionCoefficient(
const Evaluation& temperature,
342 const Evaluation& pressure,
348 OPM_HOST_DEVICE Scalar gasReferenceDensity(
unsigned regionIdx)
const
350 return gasReferenceDensity_[regionIdx];
353 OPM_HOST_DEVICE Scalar oilReferenceDensity(
unsigned regionIdx)
const
354 {
return brineReferenceDensity_[regionIdx]; }
356 OPM_HOST_DEVICE Scalar waterReferenceDensity(
unsigned regionIdx)
const
357 {
return brineReferenceDensity_[regionIdx]; }
359 OPM_HOST_DEVICE Scalar
salinity(
unsigned regionIdx)
const
360 {
return salinity_[regionIdx]; }
362 void setEzrokhiDenCoeff(
const std::vector<EzrokhiTable>& denaqa);
365 OPM_HOST_DEVICE
const ContainerT& getBrineReferenceDensity()
const
366 {
return brineReferenceDensity_; }
368 OPM_HOST_DEVICE
const ContainerT& getGasReferenceDensity()
const
369 {
return gasReferenceDensity_; }
371 OPM_HOST_DEVICE
const ContainerT& getSalinity()
const
372 {
return salinity_; }
374 OPM_HOST_DEVICE
bool getEnableEzrokhiDensity()
const
375 {
return enableEzrokhiDensity_; }
377 OPM_HOST_DEVICE
bool getEnableVaporization()
const
378 {
return enableVaporization_; }
380 OPM_HOST_DEVICE
int getActivityModel()
const
381 {
return activityModel_; }
383 OPM_HOST_DEVICE Co2StoreConfig::GasMixingType getGasType()
const
386 OPM_HOST_DEVICE
const Params& getParams()
const
387 {
return co2Tables; }
390 template <
class LhsEval>
391 LhsEval ezrokhiExponent_(
const LhsEval& temperature,
392 const ContainerT& ezrokhiCoeff)
const
394 const LhsEval& tempC = temperature - 273.15;
395 return ezrokhiCoeff[0] + tempC * (ezrokhiCoeff[1] + ezrokhiCoeff[2] * tempC);
398 template <
class LhsEval>
399 OPM_HOST_DEVICE LhsEval rvwSat_(
unsigned regionIdx,
400 const LhsEval& temperature,
401 const LhsEval& pressure,
402 const LhsEval& salinity)
const
404 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
405 if (!enableVaporization_) {
424 xgH2O = max(0.0, min(1.0, xgH2O));
426 return convertXgWToRvw(convertxgWToXgW(xgH2O, salinity), regionIdx);
433 template <
class LhsEval>
434 OPM_HOST_DEVICE LhsEval convertXgWToRvw(
const LhsEval& XgW,
unsigned regionIdx)
const
436 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
437 Scalar rho_wRef = brineReferenceDensity_[regionIdx];
438 Scalar rho_gRef = gasReferenceDensity_[regionIdx];
440 return XgW / (1.0 - XgW) * (rho_gRef / rho_wRef);
447 template <
class LhsEval>
448 OPM_HOST_DEVICE LhsEval convertRvwToXgW_(
const LhsEval& Rvw,
unsigned regionIdx)
const
450 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
451 Scalar rho_wRef = brineReferenceDensity_[regionIdx];
452 Scalar rho_gRef = gasReferenceDensity_[regionIdx];
454 const LhsEval& rho_wG = Rvw * rho_wRef;
455 return rho_wG / (rho_gRef + rho_wG);
460 template <
class LhsEval>
461 OPM_HOST_DEVICE LhsEval convertxgWToXgW(
const LhsEval& xgW,
const LhsEval& salinity)
const
463 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
467 return xgW * M_Brine / (xgW * (M_Brine - M_CO2) + M_CO2);
471 template <
class ScalarT>
472 friend Co2GasPvt<ScalarT, gpuistl::GpuView>
473 gpuistl::make_view(Co2GasPvt<ScalarT, gpuistl::GpuBuffer>&);
476 template <
class LhsEval>
477 OPM_HOST_DEVICE
const LhsEval salinityFromConcentration(
const LhsEval&T,
const LhsEval& P,
478 const LhsEval& saltConcentration)
const
481 ContainerT brineReferenceDensity_{};
482 ContainerT gasReferenceDensity_{};
483 ContainerT salinity_{};
484 ContainerT ezrokhiDenNaClCoeff_{};
485 bool enableEzrokhiDensity_ =
false;
486 bool enableVaporization_ =
true;
487 int activityModel_{};
488 Co2StoreConfig::GasMixingType gastype_{};
495namespace Opm::gpuistl {
496 template<
class ScalarT>
497 Co2GasPvt<ScalarT, GpuBuffer>
500 return Co2GasPvt<ScalarT, GpuBuffer>(
502 GpuBuffer<ScalarT>(cpuCo2.getBrineReferenceDensity()),
503 GpuBuffer<ScalarT>(cpuCo2.getGasReferenceDensity()),
504 GpuBuffer<ScalarT>(cpuCo2.getSalinity()),
505 cpuCo2.getEnableEzrokhiDensity(),
506 cpuCo2.getEnableVaporization(),
507 cpuCo2.getActivityModel(),
508 cpuCo2.getGasType());
511 template <
class ScalarT>
512 Co2GasPvt<ScalarT, GpuView>
513 make_view(Co2GasPvt<ScalarT, GpuBuffer>& co2GasPvt)
515 using ContainedType = ScalarT;
521 return Co2GasPvt<ScalarT, GpuView>(
523 newBrineReferenceDensity,
524 newGasReferenceDensity,
526 co2GasPvt.getEnableEzrokhiDensity(),
527 co2GasPvt.getEnableVaporization(),
528 co2GasPvt.getActivityModel(),
529 co2GasPvt.getGasType());
A class for the brine fluid properties.
Binary coefficients for brine and CO2.
A class for the CO2 fluid properties.
PiecewiseLinearTwoPhaseMaterialParams< TraitsT, GPUContainerType > copy_to_gpu(const PiecewiseLinearTwoPhaseMaterialParams< TraitsT > ¶ms)
Move a PiecewiseLinearTwoPhaseMaterialParams-object to the GPU.
Definition PiecewiseLinearTwoPhaseMaterialParams.hpp:285
PiecewiseLinearTwoPhaseMaterialParams< TraitsT, ViewType > make_view(PiecewiseLinearTwoPhaseMaterialParams< TraitsT, ContainerType > ¶ms)
this function is intented to make a GPU friendly view of the PiecewiseLinearTwoPhaseMaterialParams
Definition PiecewiseLinearTwoPhaseMaterialParams.hpp:312
A simple version of pure water with density from Hu et al.
Binary coefficients for brine and CO2.
Definition Brine_CO2.hpp:48
static OPM_HOST_DEVICE void calculateMoleFractions(const CO2Params ¶ms, const Evaluation &temperature, const Evaluation &pg, const Evaluation &salinity, const int knownPhaseIdx, Evaluation &xlCO2, Evaluation &ygH2O, const int &activityModel, 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:113
static OPM_HOST_DEVICE Evaluation gasDiffCoeff(const CO2Params ¶ms, const Evaluation &temperature, const Evaluation &pressure, bool extrapolate=false)
Binary diffusion coefficent [m^2/s] of water in the CO2 phase.
Definition Brine_CO2.hpp:65
A class for the brine fluid properties.
Definition BrineDynamic.hpp:49
Definition CO2Tables.hpp:63
A class for the CO2 fluid properties.
Definition CO2.hpp:58
static OPM_HOST_DEVICE Evaluation gasDensity(const Params ¶ms, const Evaluation &temperature, const Evaluation &pressure, bool extrapolate=false)
Definition CO2.hpp:222
static OPM_HOST_DEVICE Scalar molarMass()
Definition CO2.hpp:73
static OPM_HOST_DEVICE Evaluation gasInternalEnergy(const Params ¶ms, const Evaluation &temperature, const Evaluation &pressure, bool extrapolate=false)
Definition CO2.hpp:195
static OPM_HOST_DEVICE Evaluation gasViscosity(const Params ¶ms, Evaluation temperature, const Evaluation &pressure, bool extrapolate=false)
Definition CO2.hpp:249
This class represents the Pressure-Volume-Temperature relations of the gas phase for CO2.
Definition Co2GasPvt.hpp:75
OPM_HOST_DEVICE Evaluation internalEnergy(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &rv, const Evaluation &rvw) const
Returns the specific enthalpy [J/kg] of gas given a set of parameters.
Definition Co2GasPvt.hpp:176
OPM_HOST_DEVICE Evaluation inverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &rv, const Evaluation &rvw) const
Returns the formation volume factor [-] of the fluid phase.
Definition Co2GasPvt.hpp:229
OPM_HOST_DEVICE Evaluation saturatedWaterVaporizationFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &saltConcentration) const
Returns the water vaporization factor [m^3/m^3] of water phase.
Definition Co2GasPvt.hpp:309
OPM_HOST_DEVICE 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 Co2GasPvt.hpp:205
OPM_HOST_DEVICE unsigned numRegions() const
Return the number of PVT regions which are considered by this PVT-object.
Definition Co2GasPvt.hpp:166
OPM_HOST_DEVICE void setEnableVaporizationWater(bool yesno)
Specify whether the PVT model should consider that the water component can vaporize in the gas phase.
Definition Co2GasPvt.hpp:143
OPM_HOST_DEVICE void initEnd()
Finish initializing the co2 phase PVT properties.
Definition Co2GasPvt.hpp:159
OPM_HOST_DEVICE Evaluation saturatedViscosity(unsigned, const Evaluation &temperature, const Evaluation &pressure) const
Returns the dynamic viscosity [Pa s] of fluid phase at saturated conditions.
Definition Co2GasPvt.hpp:216
OPM_HOST_DEVICE Evaluation saturationPressure(unsigned, const Evaluation &, const Evaluation &) const
Returns the saturation pressure of the gas phase [Pa] depending on its mass fraction of the brine com...
Definition Co2GasPvt.hpp:291
std::pair< LhsEval, LhsEval > inverseFormationVolumeFactorAndViscosity(const FluidState &fluidState, unsigned regionIdx)
Returns the formation volume factor [-] and viscosity [Pa s] of the fluid phase.
Definition Co2GasPvt.hpp:258
OPM_HOST_DEVICE void setThermalMixingModel(int thermalMixingModel)
Set thermal mixing model for co2 in brine.
Definition Co2GasPvt.cpp:150
OPM_HOST_DEVICE void setReferenceDensities(unsigned regionIdx, Scalar rhoRefBrine, Scalar rhoRefGas, Scalar)
Initialize the reference densities of all fluids for a given PVT region.
Definition Co2GasPvt.cpp:122
OPM_HOST_DEVICE void setActivityModelSalt(int activityModel)
Set activity coefficient model for salt in solubility model.
Definition Co2GasPvt.cpp:133
OPM_HOST_DEVICE Evaluation saturatedOilVaporizationFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &, const Evaluation &) const
Returns the oil vaporization factor [m^3/m^3] of the oil phase.
Definition Co2GasPvt.hpp:324
OPM_HOST_DEVICE Evaluation saturatedWaterVaporizationFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure) const
Returns the water vaporization factor [m^3/m^3] of the water phase.
Definition Co2GasPvt.hpp:300
OPM_HOST_DEVICE Evaluation saturatedInverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure) const
Returns the formation volume factor [-] of water saturated gas at given pressure.
Definition Co2GasPvt.hpp:272
OPM_HOST_DEVICE Evaluation saturatedOilVaporizationFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure) const
Returns the oil vaporization factor [m^3/m^3] of the oil phase.
Definition Co2GasPvt.hpp:335
BinaryCoeff::Brine_CO2< Scalar, H2O, CO2 > BinaryCoeffBrineCO2
The binary coefficients for brine and CO2 used by this fluid system.
Definition Co2GasPvt.hpp:85
Definition Co2StoreConfig.hpp:33
static Scalar molarMass()
Definition Component.hpp:93
Definition EclipseState.hpp:66
Definition Schedule.hpp:101
A simple version of pure water with density from Hu et al.
Definition SimpleHuDuanH2O.hpp:66
static OPM_HOST_DEVICE Evaluation liquidDensity(const Evaluation &temperature, const Evaluation &pressure, bool extrapolate)
The density of pure water at a given pressure and temperature .
Definition SimpleHuDuanH2O.hpp:316
static OPM_HOST_DEVICE Evaluation gasInternalEnergy(const Evaluation &temperature, const Evaluation &pressure)
Specific internal energy of steam .
Definition SimpleHuDuanH2O.hpp:228
Convience header to include the gpuistl headers if HAVE_CUDA is defined.
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30
Scalar Brine< Scalar, H2O >::salinity
Default value for the salinity of the brine (dimensionless).
Definition Brine.hpp:391