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");
121 OPM_HOST_DEVICE
void setVapPars(
const Scalar,
const Scalar)
126 OPM_HOST_DEVICE
static constexpr bool isActive()
146 { enableVaporization_ = yesno; }
169 {
return gasReferenceDensity_.size(); }
171 OPM_HOST_DEVICE Scalar hVap(
unsigned )
const
177 template <
class Evaluation>
179 const Evaluation& temperature,
180 const Evaluation& pressure,
181 const Evaluation& rv,
182 const Evaluation& rvw)
const
185 if (gastype_ == Co2StoreConfig::GasMixingType::NONE) {
190 assert(gastype_ == Co2StoreConfig::GasMixingType::IDEAL);
192 Evaluation result = 0;
195 assert(rv == 0.0 || rvw == 0.0);
196 const Evaluation xBrine = convertRvwToXgW_(max(rvw,rv),regionIdx);
206 template <
class Evaluation>
207 OPM_HOST_DEVICE Evaluation
viscosity(
unsigned regionIdx,
208 const Evaluation& temperature,
209 const Evaluation& pressure,
211 const Evaluation& )
const
217 template <
class Evaluation>
219 const Evaluation& temperature,
220 const Evaluation& pressure)
const
230 template <
class Evaluation>
232 const Evaluation& temperature,
233 const Evaluation& pressure,
234 const Evaluation& rv,
235 const Evaluation& rvw)
const
237 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
238 if (!enableVaporization_) {
239 return CO2::gasDensity(co2Tables, temperature, pressure, extrapolate) /
240 gasReferenceDensity_[regionIdx];
244 const auto& rhoCo2 =
CO2::gasDensity(co2Tables, temperature, pressure, extrapolate);
251 return rhoCo2 / (gasReferenceDensity_[regionIdx] +
252 max(rvw,rv) * brineReferenceDensity_[regionIdx]);
258 template <
class Flu
idState,
class LhsEval =
typename Flu
idState::Scalar>
259 std::pair<LhsEval, LhsEval>
262 const LhsEval& T = decay<LhsEval>(fluidState.temperature(FluidState::gasPhaseIdx));
263 const LhsEval& p = decay<LhsEval>(fluidState.pressure(FluidState::gasPhaseIdx));
264 const LhsEval& Rv = decay<LhsEval>(fluidState.Rv());
265 const LhsEval& Rvw = decay<LhsEval>(fluidState.Rvw());
267 this->
viscosity(regionIdx, T, p, Rv, Rvw) };
273 template <
class Evaluation>
275 const Evaluation& temperature,
276 const Evaluation& pressure)
const
278 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
279 const Evaluation rvw = rvwSat_(regionIdx, temperature, pressure,
280 Evaluation(salinity_[regionIdx]));
282 pressure, Evaluation(0.0), rvw);
292 template <
class Evaluation>
295 const Evaluation& )
const
301 template <
class Evaluation>
303 const Evaluation& temperature,
304 const Evaluation& pressure)
const
305 {
return rvwSat_(regionIdx, temperature, pressure, Evaluation(salinity_[regionIdx])); }
310 template <
class Evaluation = Scalar>
312 const Evaluation& temperature,
313 const Evaluation& pressure,
314 const Evaluation& saltConcentration)
const
316 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
317 const Evaluation salinity = salinityFromConcentration(temperature, pressure,
319 return rvwSat_(regionIdx, temperature, pressure, salinity);
325 template <
class Evaluation>
327 const Evaluation& temperature,
328 const Evaluation& pressure,
330 const Evaluation& )
const
331 {
return rvwSat_(regionIdx, temperature, pressure, Evaluation(salinity_[regionIdx])); }
336 template <
class Evaluation>
338 const Evaluation& temperature,
339 const Evaluation& pressure)
const
340 {
return rvwSat_(regionIdx, temperature, pressure, Evaluation(salinity_[regionIdx])); }
342 template <
class Evaluation>
343 OPM_HOST_DEVICE Evaluation diffusionCoefficient(
const Evaluation& temperature,
344 const Evaluation& pressure,
350 OPM_HOST_DEVICE Scalar gasReferenceDensity(
unsigned regionIdx)
const
352 return gasReferenceDensity_[regionIdx];
355 OPM_HOST_DEVICE Scalar oilReferenceDensity(
unsigned regionIdx)
const
356 {
return brineReferenceDensity_[regionIdx]; }
358 OPM_HOST_DEVICE Scalar waterReferenceDensity(
unsigned regionIdx)
const
359 {
return brineReferenceDensity_[regionIdx]; }
361 OPM_HOST_DEVICE Scalar
salinity(
unsigned regionIdx)
const
362 {
return salinity_[regionIdx]; }
364 void setEzrokhiDenCoeff(
const std::vector<EzrokhiTable>& denaqa);
367 OPM_HOST_DEVICE
const ContainerT& getBrineReferenceDensity()
const
368 {
return brineReferenceDensity_; }
370 OPM_HOST_DEVICE
const ContainerT& getGasReferenceDensity()
const
371 {
return gasReferenceDensity_; }
373 OPM_HOST_DEVICE
const ContainerT& getSalinity()
const
374 {
return salinity_; }
376 OPM_HOST_DEVICE
bool getEnableEzrokhiDensity()
const
377 {
return enableEzrokhiDensity_; }
379 OPM_HOST_DEVICE
bool getEnableVaporization()
const
380 {
return enableVaporization_; }
382 OPM_HOST_DEVICE
int getActivityModel()
const
383 {
return activityModel_; }
385 OPM_HOST_DEVICE Co2StoreConfig::GasMixingType getGasType()
const
388 OPM_HOST_DEVICE
const Params& getParams()
const
389 {
return co2Tables; }
392 template <
class LhsEval>
393 LhsEval ezrokhiExponent_(
const LhsEval& temperature,
394 const ContainerT& ezrokhiCoeff)
const
396 const LhsEval& tempC = temperature - 273.15;
397 return ezrokhiCoeff[0] + tempC * (ezrokhiCoeff[1] + ezrokhiCoeff[2] * tempC);
400 template <
class LhsEval>
401 OPM_HOST_DEVICE LhsEval rvwSat_(
unsigned regionIdx,
402 const LhsEval& temperature,
403 const LhsEval& pressure,
404 const LhsEval& salinity)
const
406 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
407 if (!enableVaporization_) {
426 xgH2O = max(0.0, min(1.0, xgH2O));
428 return convertXgWToRvw(convertxgWToXgW(xgH2O, salinity), regionIdx);
435 template <
class LhsEval>
436 OPM_HOST_DEVICE LhsEval convertXgWToRvw(
const LhsEval& XgW,
unsigned regionIdx)
const
438 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
439 Scalar rho_wRef = brineReferenceDensity_[regionIdx];
440 Scalar rho_gRef = gasReferenceDensity_[regionIdx];
442 return XgW / (1.0 - XgW) * (rho_gRef / rho_wRef);
449 template <
class LhsEval>
450 OPM_HOST_DEVICE LhsEval convertRvwToXgW_(
const LhsEval& Rvw,
unsigned regionIdx)
const
452 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
453 Scalar rho_wRef = brineReferenceDensity_[regionIdx];
454 Scalar rho_gRef = gasReferenceDensity_[regionIdx];
456 const LhsEval& rho_wG = Rvw * rho_wRef;
457 return rho_wG / (rho_gRef + rho_wG);
462 template <
class LhsEval>
463 OPM_HOST_DEVICE LhsEval convertxgWToXgW(
const LhsEval& xgW,
const LhsEval& salinity)
const
465 OPM_TIMEFUNCTION_LOCAL(Subsystem::PvtProps);
469 return xgW * M_Brine / (xgW * (M_Brine - M_CO2) + M_CO2);
473 template <
class ScalarT>
474 friend Co2GasPvt<ScalarT, gpuistl::GpuView>
475 gpuistl::make_view(Co2GasPvt<ScalarT, gpuistl::GpuBuffer>&);
478 template <
class LhsEval>
479 OPM_HOST_DEVICE
const LhsEval salinityFromConcentration(
const LhsEval&T,
const LhsEval& P,
480 const LhsEval& saltConcentration)
const
483 ContainerT brineReferenceDensity_{};
484 ContainerT gasReferenceDensity_{};
485 ContainerT salinity_{};
486 ContainerT ezrokhiDenNaClCoeff_{};
487 bool enableEzrokhiDensity_ =
false;
488 bool enableVaporization_ =
true;
489 int activityModel_{};
490 Co2StoreConfig::GasMixingType gastype_{};
497namespace Opm::gpuistl {
498 template<
class ScalarT>
499 Co2GasPvt<ScalarT, GpuBuffer>
502 return Co2GasPvt<ScalarT, GpuBuffer>(
504 GpuBuffer<ScalarT>(cpuCo2.getBrineReferenceDensity()),
505 GpuBuffer<ScalarT>(cpuCo2.getGasReferenceDensity()),
506 GpuBuffer<ScalarT>(cpuCo2.getSalinity()),
507 cpuCo2.getEnableEzrokhiDensity(),
508 cpuCo2.getEnableVaporization(),
509 cpuCo2.getActivityModel(),
510 cpuCo2.getGasType());
513 template <
class ScalarT>
514 Co2GasPvt<ScalarT, GpuView>
515 make_view(Co2GasPvt<ScalarT, GpuBuffer>& co2GasPvt)
517 using ContainedType = ScalarT;
523 return Co2GasPvt<ScalarT, GpuView>(
525 newBrineReferenceDensity,
526 newGasReferenceDensity,
528 co2GasPvt.getEnableEzrokhiDensity(),
529 co2GasPvt.getEnableVaporization(),
530 co2GasPvt.getActivityModel(),
531 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:46
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:111
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:63
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:178
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:231
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:311
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:207
OPM_HOST_DEVICE unsigned numRegions() const
Return the number of PVT regions which are considered by this PVT-object.
Definition Co2GasPvt.hpp:168
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:145
OPM_HOST_DEVICE void initEnd()
Finish initializing the co2 phase PVT properties.
Definition Co2GasPvt.hpp:161
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:218
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:293
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:260
OPM_HOST_DEVICE void setThermalMixingModel(int thermalMixingModel)
Set thermal mixing model for co2 in brine.
Definition Co2GasPvt.cpp:152
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:124
OPM_HOST_DEVICE void setActivityModelSalt(int activityModel)
Set activity coefficient model for salt in solubility model.
Definition Co2GasPvt.cpp:135
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:326
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:302
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:274
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:337
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:62
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