27#ifndef OPM_WATER_PVT_MULTIPLEXER_HPP
28#define OPM_WATER_PVT_MULTIPLEXER_HPP
35#define OPM_WATER_PVT_MULTIPLEXER_CALL(codeToCall) \
36 switch (approach_) { \
37 case WaterPvtApproach::ConstantCompressibilityWater: { \
38 auto& pvtImpl = getRealPvt<WaterPvtApproach::ConstantCompressibilityWater>(); \
42 case WaterPvtApproach::ConstantCompressibilityBrine: { \
43 auto& pvtImpl = getRealPvt<WaterPvtApproach::ConstantCompressibilityBrine>(); \
47 case WaterPvtApproach::ThermalWater: { \
48 auto& pvtImpl = getRealPvt<WaterPvtApproach::ThermalWater>(); \
52 case WaterPvtApproach::BrineCo2: { \
53 auto& pvtImpl = getRealPvt<WaterPvtApproach::BrineCo2>(); \
57 case WaterPvtApproach::NoWater: \
58 throw std::logic_error("Not implemented: Water PVT of this deck!"); \
63enum class WaterPvtApproach {
65 ConstantCompressibilityBrine,
66 ConstantCompressibilityWater,
80template <
class Scalar,
bool enableThermal = true,
bool enableBrine = true>
86 approach_ = WaterPvtApproach::NoWater;
87 realWaterPvt_ =
nullptr;
92 , realWaterPvt_(realWaterPvt)
103 case WaterPvtApproach::ConstantCompressibilityWater: {
104 delete &getRealPvt<WaterPvtApproach::ConstantCompressibilityWater>();
107 case WaterPvtApproach::ConstantCompressibilityBrine: {
108 delete &getRealPvt<WaterPvtApproach::ConstantCompressibilityBrine>();
111 case WaterPvtApproach::ThermalWater: {
112 delete &getRealPvt<WaterPvtApproach::ThermalWater>();
115 case WaterPvtApproach::BrineCo2: {
116 delete &getRealPvt<WaterPvtApproach::BrineCo2>();
119 case WaterPvtApproach::NoWater:
134 { OPM_WATER_PVT_MULTIPLEXER_CALL(pvtImpl.initEnd()); }
140 { OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.numRegions());
return 1; }
146 { OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.waterReferenceDensity(regionIdx));
return 1000.; }
151 template <
class Evaluation>
153 const Evaluation& temperature,
154 const Evaluation& pressure,
155 const Evaluation& Rsw,
156 const Evaluation& saltconcentration)
const
157 { OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.internalEnergy(regionIdx, temperature, pressure, Rsw, saltconcentration));
return 0; }
162 template <
class Evaluation>
164 const Evaluation& temperature,
165 const Evaluation& pressure,
166 const Evaluation& Rsw,
167 const Evaluation& saltconcentration)
const
169 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.viscosity(regionIdx, temperature, pressure, Rsw, saltconcentration));
176 template <
class Evaluation>
178 const Evaluation& temperature,
179 const Evaluation& pressure,
180 const Evaluation& saltconcentration)
const
182 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.saturatedViscosity(regionIdx, temperature, pressure, saltconcentration));
189 template <
class Evaluation>
191 const Evaluation& temperature,
192 const Evaluation& pressure,
193 const Evaluation& Rsw,
194 const Evaluation& saltconcentration)
const
196 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.inverseFormationVolumeFactor(regionIdx, temperature, pressure, Rsw, saltconcentration));
203 template <
class Evaluation>
205 const Evaluation& temperature,
206 const Evaluation& pressure,
207 const Evaluation& saltconcentration)
const
209 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.saturatedInverseFormationVolumeFactor(regionIdx, temperature, pressure, saltconcentration));
216 template <
class Evaluation>
218 const Evaluation& temperature,
219 const Evaluation& pressure,
220 const Evaluation& saltconcentration)
const
222 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.saturatedGasDissolutionFactor(regionIdx, temperature, pressure, saltconcentration));
233 template <
class Evaluation>
235 const Evaluation& temperature,
236 const Evaluation& Rs,
237 const Evaluation& saltconcentration)
const
238 { OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.saturationPressure(regionIdx, temperature, Rs, saltconcentration));
return 0; }
244 template <
class Evaluation>
246 const Evaluation& pressure,
247 unsigned compIdx)
const
249 OPM_WATER_PVT_MULTIPLEXER_CALL(
return pvtImpl.diffusionCoefficient(temperature, pressure, compIdx));
253 void setApproach(WaterPvtApproach appr)
256 case WaterPvtApproach::ConstantCompressibilityWater:
260 case WaterPvtApproach::ConstantCompressibilityBrine:
264 case WaterPvtApproach::ThermalWater:
268 case WaterPvtApproach::BrineCo2:
272 case WaterPvtApproach::NoWater:
273 throw std::logic_error(
"Not implemented: Water PVT of this deck!");
285 {
return approach_; }
288 template <WaterPvtApproach approachV>
289 typename std::enable_if<approachV == WaterPvtApproach::ConstantCompressibilityWater, ConstantCompressibilityWaterPvt<Scalar> >::type& getRealPvt()
295 template <WaterPvtApproach approachV>
296 typename std::enable_if<approachV == WaterPvtApproach::ConstantCompressibilityWater, const ConstantCompressibilityWaterPvt<Scalar> >::type& getRealPvt()
const
299 return *
static_cast<ConstantCompressibilityWaterPvt<Scalar>*
>(realWaterPvt_);
302 template <WaterPvtApproach approachV>
303 typename std::enable_if<approachV == WaterPvtApproach::ConstantCompressibilityBrine, ConstantCompressibilityBrinePvt<Scalar> >::type& getRealPvt()
306 return *
static_cast<ConstantCompressibilityBrinePvt<Scalar>*
>(realWaterPvt_);
309 template <WaterPvtApproach approachV>
310 typename std::enable_if<approachV == WaterPvtApproach::ConstantCompressibilityBrine, const ConstantCompressibilityBrinePvt<Scalar> >::type& getRealPvt()
const
313 return *
static_cast<ConstantCompressibilityBrinePvt<Scalar>*
>(realWaterPvt_);
316 template <WaterPvtApproach approachV>
317 typename std::enable_if<approachV == WaterPvtApproach::ThermalWater, WaterPvtThermal<Scalar, enableBrine> >::type& getRealPvt()
320 return *
static_cast<WaterPvtThermal<Scalar, enableBrine>*
>(realWaterPvt_);
323 template <WaterPvtApproach approachV>
324 typename std::enable_if<approachV == WaterPvtApproach::ThermalWater, const WaterPvtThermal<Scalar, enableBrine> >::type& getRealPvt()
const
327 return *
static_cast<WaterPvtThermal<Scalar, enableBrine>*
>(realWaterPvt_);
330 template <WaterPvtApproach approachV>
331 typename std::enable_if<approachV == WaterPvtApproach::BrineCo2, BrineCo2Pvt<Scalar> >::type& getRealPvt()
334 return *
static_cast<BrineCo2Pvt<Scalar>*
>(realWaterPvt_);
337 template <WaterPvtApproach approachV>
338 typename std::enable_if<approachV == WaterPvtApproach::BrineCo2, const BrineCo2Pvt<Scalar> >::type& getRealPvt()
const
341 return *
static_cast<const BrineCo2Pvt<Scalar>*
>(realWaterPvt_);
344 const void* realWaterPvt()
const {
return realWaterPvt_; }
346 WaterPvtMultiplexer<Scalar,enableThermal,enableBrine>& operator=(
const WaterPvtMultiplexer<Scalar,enableThermal,enableBrine>& data)
348 approach_ = data.approach_;
350 case WaterPvtApproach::ConstantCompressibilityWater:
351 realWaterPvt_ =
new ConstantCompressibilityWaterPvt<Scalar>(*
static_cast<const ConstantCompressibilityWaterPvt<Scalar>*
>(data.realWaterPvt_));
353 case WaterPvtApproach::ConstantCompressibilityBrine:
354 realWaterPvt_ =
new ConstantCompressibilityBrinePvt<Scalar>(*
static_cast<const ConstantCompressibilityBrinePvt<Scalar>*
>(data.realWaterPvt_));
356 case WaterPvtApproach::ThermalWater:
357 realWaterPvt_ =
new WaterPvtThermal<Scalar, enableBrine>(*
static_cast<const WaterPvtThermal<Scalar, enableBrine>*
>(data.realWaterPvt_));
359 case WaterPvtApproach::BrineCo2:
360 realWaterPvt_ =
new BrineCo2Pvt<Scalar>(*
static_cast<const BrineCo2Pvt<Scalar>*
>(data.realWaterPvt_));
370 WaterPvtApproach approach_;
This class represents the Pressure-Volume-Temperature relations of the liquid phase for a CO2-Brine s...
Definition: BrineCo2Pvt.hpp:57
This class represents the Pressure-Volume-Temperature relations of the gas phase without vaporized oi...
Definition: ConstantCompressibilityBrinePvt.hpp:50
This class represents the Pressure-Volume-Temperature relations of the gas phase without vaporized oi...
Definition: ConstantCompressibilityWaterPvt.hpp:47
Definition: EclipseState.hpp:55
Definition: Schedule.hpp:130
This class represents the Pressure-Volume-Temperature relations of the water phase in the black-oil m...
Definition: WaterPvtMultiplexer.hpp:82
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:163
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:204
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:177
unsigned numRegions() const
Return the number of PVT regions which are considered by this PVT-object.
Definition: WaterPvtMultiplexer.hpp:139
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:217
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:152
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:234
WaterPvtApproach approach() const
Returns the concrete approach for calculating the PVT relations.
Definition: WaterPvtMultiplexer.hpp:284
const Scalar waterReferenceDensity(unsigned regionIdx) const
Return the reference density which are considered by this PVT-object.
Definition: WaterPvtMultiplexer.hpp:145
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:190
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:245
This class implements temperature dependence of the PVT properties of water.
Definition: WaterPvtThermal.hpp:50
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30