27#ifndef OPM_WATER_PVT_THERMAL_HPP
28#define OPM_WATER_PVT_THERMAL_HPP
41template <
class Scalar,
bool enableThermal,
bool enableBrine>
42class WaterPvtMultiplexer;
50template <
class Scalar,
bool enableBrine>
60 const std::vector<Scalar>& viscrefPress,
61 const std::vector<Scalar>& watdentRefTemp,
62 const std::vector<Scalar>& watdentCT1,
63 const std::vector<Scalar>& watdentCT2,
64 const std::vector<Scalar>& watJTRefPres,
65 const std::vector<Scalar>& watJTC,
66 const std::vector<Scalar>& pvtwRefPress,
67 const std::vector<Scalar>& pvtwRefB,
68 const std::vector<Scalar>& pvtwCompressibility,
69 const std::vector<Scalar>& pvtwViscosity,
70 const std::vector<Scalar>& pvtwViscosibility,
71 const std::vector<TabulatedOneDFunction>& watvisctCurves,
72 const std::vector<TabulatedOneDFunction>& internalEnergyCurves,
76 bool enableInternalEnergy)
77 : isothermalPvt_(isothermalPvt)
78 , viscrefPress_(viscrefPress)
79 , watdentRefTemp_(watdentRefTemp)
80 , watdentCT1_(watdentCT1)
81 , watdentCT2_(watdentCT2)
82 , watJTRefPres_(watJTRefPres)
84 , pvtwRefPress_(pvtwRefPress)
86 , pvtwCompressibility_(pvtwCompressibility)
87 , pvtwViscosity_(pvtwViscosity)
88 , pvtwViscosibility_(pvtwViscosibility)
89 , watvisctCurves_(watvisctCurves)
90 , internalEnergyCurves_(internalEnergyCurves)
94 , enableInternalEnergy_(enableInternalEnergy)
101 {
delete isothermalPvt_; }
115 void setVapPars(
const Scalar par1,
const Scalar par2)
117 isothermalPvt_->setVapPars(par1, par2);
130 {
return enableThermalDensity_; }
136 {
return enableJouleThomson_; }
142 {
return enableThermalViscosity_; }
144 Scalar hVap(
unsigned regionIdx)
const
145 {
return this->hVap_[regionIdx]; }
147 std::size_t numRegions()
const
148 {
return pvtwRefPress_.size(); }
153 template <
class Evaluation>
155 const Evaluation& temperature,
156 const Evaluation& pressure,
157 const Evaluation& Rsw,
158 const Evaluation& saltconcentration)
const
160 if (!enableInternalEnergy_) {
161 throw std::runtime_error(
"Requested the internal energy of water but it is disabled");
164 if (!enableJouleThomson_) {
168 return internalEnergyCurves_[regionIdx].eval(temperature,
true);
171 Evaluation Tref = watdentRefTemp_[regionIdx];
172 Evaluation Pref = watJTRefPres_[regionIdx];
173 Scalar JTC = watJTC_[regionIdx];
176 Evaluation Cp = internalEnergyCurves_[regionIdx].eval(temperature,
true)/temperature;
177 Evaluation density = invB * waterReferenceDensity(regionIdx);
179 Evaluation enthalpyPres;
181 enthalpyPres = -Cp * JTC * (pressure - Pref);
183 else if (enableThermalDensity_) {
184 Scalar c1T = watdentCT1_[regionIdx];
185 Scalar c2T = watdentCT2_[regionIdx];
187 Evaluation alpha = (c1T + 2 * c2T * (temperature - Tref)) /
188 (1 + c1T *(temperature - Tref) + c2T * (temperature - Tref) * (temperature - Tref));
190 constexpr const int N = 100;
191 Evaluation deltaP = (pressure - Pref) / N;
192 Evaluation enthalpyPresPrev = 0;
193 for (std::size_t i = 0; i < N; ++i) {
194 Evaluation Pnew = Pref + i * deltaP;
196 Pnew, Rsw, saltconcentration) *
197 waterReferenceDensity(regionIdx);
198 Evaluation jouleThomsonCoefficient = -(1.0 / Cp) * (1.0 - alpha * temperature) / rho;
199 Evaluation deltaEnthalpyPres = -Cp * jouleThomsonCoefficient * deltaP;
200 enthalpyPres = enthalpyPresPrev + deltaEnthalpyPres;
201 enthalpyPresPrev = enthalpyPres;
205 throw std::runtime_error(
"Requested Joule-thomson calculation but "
206 "thermal water density (WATDENT) is not provided");
209 Evaluation enthalpy = Cp * (temperature - Tref) + enthalpyPres;
211 return enthalpy - pressure/density;
218 template <
class Evaluation>
220 const Evaluation& temperature,
221 const Evaluation& pressure,
222 const Evaluation& Rsw,
223 const Evaluation& saltconcentration)
const
225 const auto& isothermalMu = isothermalPvt_->
viscosity(regionIdx, temperature,
226 pressure, Rsw, saltconcentration);
231 Scalar x = -pvtwViscosibility_[regionIdx] * (viscrefPress_[regionIdx] -
232 pvtwRefPress_[regionIdx]);
233 Scalar muRef = pvtwViscosity_[regionIdx] / (1.0 + x + 0.5 * x * x);
236 const auto& muWatvisct = watvisctCurves_[regionIdx].eval(temperature,
true);
237 return isothermalMu * muWatvisct / muRef;
243 template <
class Evaluation>
245 const Evaluation& temperature,
246 const Evaluation& pressure,
247 const Evaluation& saltconcentration)
const
250 pressure, saltconcentration);
255 Scalar x = -pvtwViscosibility_[regionIdx] * (viscrefPress_[regionIdx] -
256 pvtwRefPress_[regionIdx]);
257 Scalar muRef = pvtwViscosity_[regionIdx] / (1.0 + x + 0.5 * x * x);
260 const auto& muWatvisct = watvisctCurves_[regionIdx].eval(temperature,
true);
261 return isothermalMu * muWatvisct / muRef;
267 template <
class Evaluation>
269 const Evaluation& temperature,
270 const Evaluation& pressure,
271 const Evaluation& saltconcentration)
const
273 Evaluation Rsw = 0.0;
275 Rsw, saltconcentration);
280 template <
class Evaluation>
282 const Evaluation& temperature,
283 const Evaluation& pressure,
284 const Evaluation& Rsw,
285 const Evaluation& saltconcentration)
const
289 pressure, Rsw, saltconcentration);
292 Scalar BwRef = pvtwRefB_[regionIdx];
293 Scalar TRef = watdentRefTemp_[regionIdx];
294 const Evaluation& X = pvtwCompressibility_[regionIdx] * (pressure -
295 pvtwRefPress_[regionIdx]);
296 Scalar cT1 = watdentCT1_[regionIdx];
297 Scalar cT2 = watdentCT2_[regionIdx];
298 const Evaluation& Y = temperature - TRef;
303 return 1.0 / (((1 - X) * (1 + cT1 * Y + cT2 * Y * Y)) * BwRef);
313 template <
class Evaluation>
317 const Evaluation& )
const
323 template <
class Evaluation>
327 const Evaluation& )
const
330 template <
class Evaluation>
331 Evaluation diffusionCoefficient(
const Evaluation& ,
335 throw std::runtime_error(
"Not implemented: The PVT model does not provide "
336 "a diffusionCoefficient()");
339 const IsothermalPvt* isoThermalPvt()
const
340 {
return isothermalPvt_; }
342 Scalar waterReferenceDensity(
unsigned regionIdx)
const
345 const std::vector<Scalar>& viscrefPress()
const
346 {
return viscrefPress_; }
348 const std::vector<Scalar>& watdentRefTemp()
const
349 {
return watdentRefTemp_; }
351 const std::vector<Scalar>& watdentCT1()
const
352 {
return watdentCT1_; }
354 const std::vector<Scalar>& watdentCT2()
const
355 {
return watdentCT2_; }
357 const std::vector<Scalar>& pvtwRefPress()
const
358 {
return pvtwRefPress_; }
360 const std::vector<Scalar>& pvtwRefB()
const
361 {
return pvtwRefB_; }
363 const std::vector<Scalar>& pvtwCompressibility()
const
364 {
return pvtwCompressibility_; }
366 const std::vector<Scalar>& pvtwViscosity()
const
367 {
return pvtwViscosity_; }
369 const std::vector<Scalar>& pvtwViscosibility()
const
370 {
return pvtwViscosibility_; }
372 const std::vector<TabulatedOneDFunction>& watvisctCurves()
const
373 {
return watvisctCurves_; }
375 const std::vector<TabulatedOneDFunction>& internalEnergyCurves()
const
376 {
return internalEnergyCurves_; }
378 bool enableInternalEnergy()
const
379 {
return enableInternalEnergy_; }
381 const std::vector<Scalar>& watJTRefPres()
const
382 {
return watJTRefPres_; }
384 const std::vector<Scalar>& watJTC()
const
387 bool operator==(
const WaterPvtThermal<Scalar, enableBrine>& data)
const;
389 WaterPvtThermal<Scalar, enableBrine>&
390 operator=(
const WaterPvtThermal<Scalar, enableBrine>& data);
393 IsothermalPvt* isothermalPvt_{
nullptr};
397 std::vector<Scalar> viscrefPress_{};
399 std::vector<Scalar> watdentRefTemp_{};
400 std::vector<Scalar> watdentCT1_{};
401 std::vector<Scalar> watdentCT2_{};
403 std::vector<Scalar> watJTRefPres_{};
404 std::vector<Scalar> watJTC_{};
406 std::vector<Scalar> pvtwRefPress_{};
407 std::vector<Scalar> pvtwRefB_{};
408 std::vector<Scalar> pvtwCompressibility_{};
409 std::vector<Scalar> pvtwViscosity_{};
410 std::vector<Scalar> pvtwViscosibility_{};
412 std::vector<TabulatedOneDFunction> watvisctCurves_{};
415 std::vector<TabulatedOneDFunction> internalEnergyCurves_{};
416 std::vector<Scalar> hVap_{};
418 bool enableThermalDensity_{
false};
419 bool enableJouleThomson_{
false};
420 bool enableThermalViscosity_{
false};
421 bool enableInternalEnergy_{
false};
Implements a linearly interpolated scalar function that depends on one variable.
Definition EclipseState.hpp:63
Definition Schedule.hpp:101
Implements a linearly interpolated scalar function that depends on one variable.
Definition Tabulated1DFunction.hpp:51
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 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
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
This class implements temperature dependence of the PVT properties of water.
Definition WaterPvtThermal.hpp:52
bool enableThermalViscosity() const
Returns true iff the viscosity of the water phase is temperature dependent.
Definition WaterPvtThermal.hpp:141
Evaluation saturationPressure(unsigned, const Evaluation &, const Evaluation &, const Evaluation &) const
Returns the saturation pressure of the water phase [Pa] depending on its mass fraction of the gas com...
Definition WaterPvtThermal.hpp:314
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 WaterPvtThermal.hpp:219
void initEnd()
Finish initializing the thermal part of the water phase PVT properties.
Definition WaterPvtThermal.hpp:123
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 WaterPvtThermal.hpp:281
bool enableThermalDensity() const
Returns true iff the density of the water phase is temperature dependent.
Definition WaterPvtThermal.hpp:129
Evaluation saturatedGasDissolutionFactor(unsigned, const Evaluation &, const Evaluation &, const Evaluation &) const
Returns the gas dissolution factor [m^3/m^3] of the water phase.
Definition WaterPvtThermal.hpp:324
Evaluation internalEnergy(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &Rsw, const Evaluation &saltconcentration) const
Returns the specific internal energy [J/kg] of water given a set of parameters.
Definition WaterPvtThermal.hpp:154
Evaluation saturatedInverseFormationVolumeFactor(unsigned regionIdx, const Evaluation &temperature, const Evaluation &pressure, const Evaluation &saltconcentration) const
Returns the formation volume factor [-] of the fluid phase.
Definition WaterPvtThermal.hpp:268
bool enableJouleThomson() const
Returns true iff Joule-Thomson effect for the water phase is active.
Definition WaterPvtThermal.hpp:135
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 WaterPvtThermal.hpp:244
void setNumRegions(std::size_t numRegions)
Set the number of PVT-regions considered by this object.
Definition WaterPvtThermal.cpp:185
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30