27#ifndef OPM_WATER_PVT_MULTIPLEXER_HPP
28#define OPM_WATER_PVT_MULTIPLEXER_HPP
36#define OPM_WATER_PVT_MULTIPLEXER_CALL(codeToCall, ...) \
37 switch (approach_) { \
38 case WaterPvtApproach::ConstantCompressibilityWater: { \
39 auto& pvtImpl = getRealPvt<WaterPvtApproach::ConstantCompressibilityWater>(); \
43 case WaterPvtApproach::ConstantCompressibilityBrine: { \
44 auto& pvtImpl = getRealPvt<WaterPvtApproach::ConstantCompressibilityBrine>(); \
48 case WaterPvtApproach::ThermalWater: { \
49 auto& pvtImpl = getRealPvt<WaterPvtApproach::ThermalWater>(); \
53 case WaterPvtApproach::BrineCo2: { \
54 auto& pvtImpl = getRealPvt<WaterPvtApproach::BrineCo2>(); \
58 case WaterPvtApproach::BrineH2: { \
59 auto& pvtImpl = getRealPvt<WaterPvtApproach::BrineH2>(); \
64 case WaterPvtApproach::NoWater: \
65 throw std::logic_error("Not implemented: Water PVT of this deck!"); \
70enum class WaterPvtApproach {
72 ConstantCompressibilityBrine,
73 ConstantCompressibilityWater,
88template <
class Scalar,
bool enableThermal = true,
bool enableBrine = true>
93 : approach_(WaterPvtApproach::NoWater)
94 , realWaterPvt_(
nullptr)
100 , realWaterPvt_(realWaterPvt)
110 bool mixingEnergy()
const
112 return approach_ == WaterPvtApproach::ThermalWater;
131 void setVapPars(
const Scalar par1,
const Scalar par2);
141 template <
class Evaluation>
143 const Evaluation& temperature,
144 const Evaluation& pressure,
145 const Evaluation& Rsw,
146 const Evaluation& saltconcentration)
const
147 { OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.internalEnergy(regionIdx, temperature, pressure, Rsw, saltconcentration)); }
149 Scalar hVap(
unsigned regionIdx)
const;
154 template <
class Evaluation>
156 const Evaluation& temperature,
157 const Evaluation& pressure,
158 const Evaluation& Rsw,
159 const Evaluation& saltconcentration)
const
161 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.viscosity(regionIdx, temperature, pressure, Rsw, saltconcentration));
167 template <
class Evaluation>
169 const Evaluation& temperature,
170 const Evaluation& pressure,
171 const Evaluation& saltconcentration)
const
173 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.saturatedViscosity(regionIdx, temperature, pressure, saltconcentration));
179 template <
class Evaluation>
181 const Evaluation& temperature,
182 const Evaluation& pressure,
183 const Evaluation& Rsw,
184 const Evaluation& saltconcentration)
const
186 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.inverseFormationVolumeFactor(regionIdx, temperature, pressure, Rsw, saltconcentration));
192 template <
class Evaluation>
194 const Evaluation& temperature,
195 const Evaluation& pressure,
196 const Evaluation& saltconcentration)
const
198 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.saturatedInverseFormationVolumeFactor(regionIdx, temperature, pressure, saltconcentration));
204 template <
class Evaluation>
206 const Evaluation& temperature,
207 const Evaluation& pressure,
208 const Evaluation& saltconcentration)
const
210 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.saturatedGasDissolutionFactor(regionIdx, temperature, pressure, saltconcentration));
220 template <
class Evaluation>
222 const Evaluation& temperature,
223 const Evaluation& Rs,
224 const Evaluation& saltconcentration)
const
225 { OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.saturationPressure(regionIdx, temperature, Rs, saltconcentration)); }
230 template <
class Evaluation>
232 const Evaluation& pressure,
233 unsigned compIdx)
const
235 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.diffusionCoefficient(temperature, pressure, compIdx));
238 void setApproach(WaterPvtApproach appr);
246 {
return approach_; }
249 template <WaterPvtApproach approachV>
250 typename std::enable_if<approachV == WaterPvtApproach::ConstantCompressibilityWater, ConstantCompressibilityWaterPvt<Scalar> >::type& getRealPvt()
256 template <WaterPvtApproach approachV>
257 typename std::enable_if<approachV == WaterPvtApproach::ConstantCompressibilityWater, const ConstantCompressibilityWaterPvt<Scalar> >::type& getRealPvt()
const
260 return *
static_cast<ConstantCompressibilityWaterPvt<Scalar>*
>(realWaterPvt_);
263 template <WaterPvtApproach approachV>
264 typename std::enable_if<approachV == WaterPvtApproach::ConstantCompressibilityBrine, ConstantCompressibilityBrinePvt<Scalar> >::type& getRealPvt()
267 return *
static_cast<ConstantCompressibilityBrinePvt<Scalar>*
>(realWaterPvt_);
270 template <WaterPvtApproach approachV>
271 typename std::enable_if<approachV == WaterPvtApproach::ConstantCompressibilityBrine, const ConstantCompressibilityBrinePvt<Scalar> >::type& getRealPvt()
const
274 return *
static_cast<ConstantCompressibilityBrinePvt<Scalar>*
>(realWaterPvt_);
277 template <WaterPvtApproach approachV>
278 typename std::enable_if<approachV == WaterPvtApproach::ThermalWater, WaterPvtThermal<Scalar, enableBrine> >::type& getRealPvt()
281 return *
static_cast<WaterPvtThermal<Scalar, enableBrine>*
>(realWaterPvt_);
284 template <WaterPvtApproach approachV>
285 typename std::enable_if<approachV == WaterPvtApproach::ThermalWater, const WaterPvtThermal<Scalar, enableBrine> >::type& getRealPvt()
const
288 return *
static_cast<WaterPvtThermal<Scalar, enableBrine>*
>(realWaterPvt_);
291 template <WaterPvtApproach approachV>
292 typename std::enable_if<approachV == WaterPvtApproach::BrineCo2, BrineCo2Pvt<Scalar> >::type& getRealPvt()
295 return *
static_cast<BrineCo2Pvt<Scalar>*
>(realWaterPvt_);
298 template <WaterPvtApproach approachV>
299 typename std::enable_if<approachV == WaterPvtApproach::BrineCo2, const BrineCo2Pvt<Scalar> >::type& getRealPvt()
const
302 return *
static_cast<const BrineCo2Pvt<Scalar>*
>(realWaterPvt_);
305 template <WaterPvtApproach approachV>
306 typename std::enable_if<approachV == WaterPvtApproach::BrineH2, BrineH2Pvt<Scalar> >::type& getRealPvt()
309 return *
static_cast<BrineH2Pvt<Scalar>*
>(realWaterPvt_);
312 template <WaterPvtApproach approachV>
313 typename std::enable_if<approachV == WaterPvtApproach::BrineH2, const BrineH2Pvt<Scalar> >::type& getRealPvt()
const
316 return *
static_cast<const BrineH2Pvt<Scalar>*
>(realWaterPvt_);
319 const void* realWaterPvt()
const {
return realWaterPvt_; }
321 WaterPvtMultiplexer<Scalar,enableThermal,enableBrine>&
322 operator=(
const WaterPvtMultiplexer<Scalar,enableThermal,enableBrine>& data);
325 WaterPvtApproach approach_{WaterPvtApproach::NoWater};
326 void* realWaterPvt_{
nullptr};
This class represents the Pressure-Volume-Temperature relations of the liquid phase for a CO2-Brine s...
This class represents the Pressure-Volume-Temperature relations of the liquid phase for a H2-Brine sy...
This class represents the Pressure-Volume-Temperature relations of the gas phase without vaporized oi...
This class represents the Pressure-Volume-Temperature relations of the gas phase without vaporized oi...
This class implements temperature dependence of the PVT properties of water.
This class represents the Pressure-Volume-Temperature relations of the gas phase without vaporized oi...
Definition ConstantCompressibilityWaterPvt.hpp:47
Definition EclipseState.hpp:62
Definition Schedule.hpp:101
This class represents the Pressure-Volume-Temperature relations of the water phase in the black-oil m...
Definition WaterPvtMultiplexer.hpp:90
Evaluation viscosity(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &Rsw, const Evaluation &saltconcentration) const
Returns the dynamic viscosity [Pa s] of the fluid phase given a set of parameters.
Definition WaterPvtMultiplexer.hpp:155
Evaluation saturatedInverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &saltconcentration) const
Returns the formation volume factor [-] of the fluid phase.
Definition WaterPvtMultiplexer.hpp:193
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 WaterPvtMultiplexer.hpp:168
unsigned numRegions() const
Return the number of PVT regions which are considered by this PVT-object.
Definition WaterPvtMultiplexer.cpp:97
Evaluation saturatedGasDissolutionFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &saltconcentration) const
Returns the gas dissolution factor [m^3/m^3] of saturated water.
Definition WaterPvtMultiplexer.hpp:205
Evaluation internalEnergy(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &Rsw, const Evaluation &saltconcentration) const
Returns the specific enthalpy [J/kg] of gas given a set of parameters.
Definition WaterPvtMultiplexer.hpp:142
Evaluation saturationPressure(unsigned regionIdx, const Evaluation &temperature, const Evaluation &Rs, const Evaluation &saltconcentration) const
Returns the saturation pressure [Pa] of water given the mass fraction of the gas component in the wat...
Definition WaterPvtMultiplexer.hpp:221
WaterPvtApproach approach() const
Returns the concrete approach for calculating the PVT relations.
Definition WaterPvtMultiplexer.hpp:245
Scalar waterReferenceDensity(unsigned regionIdx) const
Return the reference density which are considered by this PVT-object.
Definition WaterPvtMultiplexer.cpp:111
Evaluation inverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &Rsw, const Evaluation &saltconcentration) const
Returns the formation volume factor [-] of the fluid phase.
Definition WaterPvtMultiplexer.hpp:180
Evaluation diffusionCoefficient(const Evaluation &temperature, const Evaluation &pressure, unsigned compIdx) const
Calculate the binary molecular diffusion coefficient for a component in a fluid phase [mol^2 * s / (k...
Definition WaterPvtMultiplexer.hpp:231
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30