32#ifndef EWOMS_BLACK_OIL_EXTBO_MODULE_HH
33#define EWOMS_BLACK_OIL_EXTBO_MODULE_HH
35#include <dune/common/fvector.hh>
77 static constexpr unsigned zFractionIdx = Indices::zFractionIdx;
78 static constexpr unsigned contiZfracEqIdx = Indices::contiZfracEqIdx;
81 static constexpr unsigned gasPhaseIdx = FluidSystem::gasPhaseIdx;
82 static constexpr unsigned oilPhaseIdx = FluidSystem::oilPhaseIdx;
105 static bool primaryVarApplies(
unsigned pvIdx)
107 if constexpr (enableExtbo) {
108 return pvIdx == zFractionIdx;
127 return static_cast<Scalar
>(1.0);
130 static bool eqApplies(
unsigned eqIdx)
132 if constexpr (enableExtbo) {
133 return eqIdx == contiZfracEqIdx;
144 return "conti^solvent";
152 return static_cast<Scalar
>(1.0);
155 template <
class LhsEval>
156 static void addStorage(Dune::FieldVector<LhsEval, numEq>&
storage,
157 const IntensiveQuantities& intQuants)
159 if constexpr (enableExtbo) {
160 if constexpr (blackoilConserveSurfaceVolume) {
164 Toolbox::template
decay<LhsEval>(intQuants.fluidState().saturation(gasPhaseIdx)) *
165 Toolbox::template
decay<LhsEval>(intQuants.fluidState().invB(gasPhaseIdx));
166 if (FluidSystem::enableDissolvedGas()) {
171 Toolbox::template
decay<LhsEval>(intQuants.fluidState().saturation(oilPhaseIdx)) *
172 Toolbox::template
decay<LhsEval>(intQuants.fluidState().invB(oilPhaseIdx));
181 Toolbox::template
decay<LhsEval>(intQuants.fluidState().saturation(gasPhaseIdx)) *
182 Toolbox::template
decay<LhsEval>(intQuants.fluidState().invB(gasPhaseIdx));
186 throw std::runtime_error(
"Only component conservation in terms of surface volumes is implemented. ");
196 if constexpr (enableExtbo) {
199 if constexpr (blackoilConserveSurfaceVolume) {
202 const unsigned upIdxGas =
static_cast<unsigned>(
extQuants.upstreamIndex(gasPhaseIdx));
206 flux[contiZfracEqIdx] =
209 fsGas.invB(gasPhaseIdx);
212 flux[contiZfracEqIdx] =
217 if (FluidSystem::enableDissolvedGas()) {
218 const unsigned upIdxOil =
static_cast<unsigned>(
extQuants.upstreamIndex(oilPhaseIdx));
222 flux[contiZfracEqIdx] +=
226 fsOil.invB(oilPhaseIdx);
229 flux[contiZfracEqIdx] +=
238 throw std::runtime_error(
"Only component conservation in terms of surface volumes is implemented. ");
249 if constexpr (enableExtbo) {
250 priVars[zFractionIdx] = zFraction;
258 const PrimaryVariables&
oldPv,
259 const EqVector&
delta)
261 if constexpr (enableExtbo) {
276 return static_cast<Scalar
>(0.0);
285 return std::abs(Toolbox::scalarValue(
resid[contiZfracEqIdx]));
288 template <
class DofEntity>
291 if constexpr (enableExtbo) {
292 const unsigned dofIdx = model.dofMapper().index(
dof);
294 const PrimaryVariables& priVars = model.solution(0)[dofIdx];
299 template <
class DofEntity>
302 if constexpr (enableExtbo) {
303 const unsigned dofIdx = model.dofMapper().index(
dof);
305 PrimaryVariables&
priVars0 = model.solution(0)[dofIdx];
306 PrimaryVariables&
priVars1 = model.solution(1)[dofIdx];
315 template <
typename Value>
316 static Value xVolume(
unsigned pvtRegionIdx,
const Value& pressure,
const Value&
z)
317 {
return params_.X_[pvtRegionIdx].eval(
z, pressure,
true); }
319 template <
typename Value>
320 static Value yVolume(
unsigned pvtRegionIdx,
const Value& pressure,
const Value&
z)
321 {
return params_.Y_[pvtRegionIdx].eval(
z, pressure,
true); }
323 template <
typename Value>
324 static Value pbubRs(
unsigned pvtRegionIdx,
const Value&
z,
const Value& rs)
325 {
return params_.PBUB_RS_[pvtRegionIdx].eval(
z, rs,
true); }
327 template <
typename Value>
328 static Value pbubRv(
unsigned pvtRegionIdx,
const Value&
z,
const Value& rv)
329 {
return params_.PBUB_RV_[pvtRegionIdx].eval(
z, rv,
true); }
331 template <
typename Value>
332 static Value oilViscosity(
unsigned pvtRegionIdx,
const Value& pressure,
const Value&
z)
333 {
return params_.VISCO_[pvtRegionIdx].eval(
z, pressure,
true); }
335 template <
typename Value>
336 static Value gasViscosity(
unsigned pvtRegionIdx,
const Value& pressure,
const Value&
z)
337 {
return params_.VISCG_[pvtRegionIdx].eval(
z, pressure,
true); }
339 template <
typename Value>
340 static Value bo(
unsigned pvtRegionIdx,
const Value& pressure,
const Value&
z)
341 {
return params_.BO_[pvtRegionIdx].eval(
z, pressure,
true); }
343 template <
typename Value>
344 static Value bg(
unsigned pvtRegionIdx,
const Value& pressure,
const Value&
z)
345 {
return params_.BG_[pvtRegionIdx].eval(
z, pressure,
true); }
347 template <
typename Value>
348 static Value rs(
unsigned pvtRegionIdx,
const Value& pressure,
const Value&
z)
349 {
return params_.RS_[pvtRegionIdx].eval(
z, pressure,
true); }
351 template <
typename Value>
352 static Value rv(
unsigned pvtRegionIdx,
const Value& pressure,
const Value&
z)
353 {
return params_.RV_[pvtRegionIdx].eval(
z, pressure,
true); }
355 static Scalar referenceDensity(
unsigned regionIdx)
356 {
return params_.zReferenceDensity_[
regionIdx]; }
361 template <
typename Value>
362 static Value oilCmp(
unsigned pvtRegionIdx,
const Value&
z)
363 {
return params_.oilCmp_[pvtRegionIdx].eval(
z,
true); }
365 template <
typename Value>
366 static Value gasCmp(
unsigned pvtRegionIdx,
const Value&
z)
367 {
return params_.gasCmp_[pvtRegionIdx].eval(
z,
true); }
373template <
class TypeTag,
bool enableExtboV>
375BlackOilExtboModule<TypeTag, enableExtboV>::params_;
377template <
class TypeTag,
bool enableExtboV>
387template <
class TypeTag>
401 static constexpr int zFractionIdx = Indices::zFractionIdx;
402 static constexpr int oilPhaseIdx = FluidSystem::oilPhaseIdx;
403 static constexpr int gasPhaseIdx = FluidSystem::gasPhaseIdx;
426 const unsigned pvtRegionIdx = priVars.pvtRegionIndex();
427 const auto& fs = asImp_().fluidState_;
429 zFraction_ = priVars.makeEvaluation(zFractionIdx,
timeIdx);
431 oilViscosity_ = ExtboModule::oilViscosity(pvtRegionIdx, fs.pressure(oilPhaseIdx), zFraction_);
432 gasViscosity_ = ExtboModule::gasViscosity(pvtRegionIdx, fs.pressure(gasPhaseIdx), zFraction_);
434 bo_ = ExtboModule::bo(pvtRegionIdx, fs.pressure(oilPhaseIdx), zFraction_);
435 bg_ = ExtboModule::bg(pvtRegionIdx, fs.pressure(gasPhaseIdx), zFraction_);
437 bz_ = ExtboModule::bg(pvtRegionIdx, fs.pressure(oilPhaseIdx), Evaluation{0.99});
439 if (FluidSystem::enableDissolvedGas()) {
440 rs_ = ExtboModule::rs(pvtRegionIdx, fs.pressure(oilPhaseIdx), zFraction_);
446 if (FluidSystem::enableVaporizedOil()) {
447 rv_ = ExtboModule::rv(pvtRegionIdx, fs.pressure(gasPhaseIdx), zFraction_);
453 xVolume_ = ExtboModule::xVolume(pvtRegionIdx, fs.pressure(oilPhaseIdx), zFraction_);
454 yVolume_ = ExtboModule::yVolume(pvtRegionIdx, fs.pressure(oilPhaseIdx), zFraction_);
456 Evaluation
pbub = fs.pressure(oilPhaseIdx);
458 if (priVars.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Sw) {
460 Scalar
sw = priVars.makeEvaluation(Indices::waterSwitchIdx,
timeIdx).value();
466 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rs) {
467 rs_ = priVars.makeEvaluation(Indices::compositionSwitchIdx,
timeIdx);
468 const Evaluation zLim = ExtboModule::zLim(pvtRegionIdx);
469 if (zFraction_ > zLim) {
470 pbub = ExtboModule::pbubRs(pvtRegionIdx, zLim, rs_);
472 pbub = ExtboModule::pbubRs(pvtRegionIdx, zFraction_, rs_);
474 bo_ = ExtboModule::bo(pvtRegionIdx,
pbub, zFraction_) +
475 ExtboModule::oilCmp(pvtRegionIdx, zFraction_) * (fs.pressure(oilPhaseIdx) -
pbub);
477 xVolume_ = ExtboModule::xVolume(pvtRegionIdx,
pbub, zFraction_);
480 if (priVars.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Rv) {
481 rv_ = priVars.makeEvaluation(Indices::compositionSwitchIdx,
timeIdx);
482 const Evaluation
rvsat = ExtboModule::rv(pvtRegionIdx,
pbub, zFraction_);
483 bg_ = ExtboModule::bg(pvtRegionIdx,
pbub, zFraction_) +
484 ExtboModule::gasCmp(pvtRegionIdx, zFraction_) * (rv_ -
rvsat);
486 yVolume_ = ExtboModule::yVolume(pvtRegionIdx,
pbub, zFraction_);
497 const auto&
iq = asImp_();
498 auto& fs = asImp_().fluidState_;
500 const unsigned pvtRegionIdx =
iq.pvtRegionIndex();
501 zRefDensity_ = ExtboModule::referenceDensity(pvtRegionIdx);
503 fs.setInvB(oilPhaseIdx, 1.0 / bo_);
504 fs.setInvB(gasPhaseIdx, 1.0 / bg_);
506 fs.setDensity(oilPhaseIdx,
507 fs.invB(oilPhaseIdx) *
508 (FluidSystem::referenceDensity(oilPhaseIdx, pvtRegionIdx) +
509 (1.0 - xVolume_) * fs.Rs() * FluidSystem::referenceDensity(gasPhaseIdx, pvtRegionIdx) +
510 xVolume_ * fs.Rs() * zRefDensity_));
511 fs.setDensity(gasPhaseIdx,
512 fs.invB(gasPhaseIdx) *
513 (FluidSystem::referenceDensity(gasPhaseIdx, pvtRegionIdx) *
514 (1.0 - yVolume_) + yVolume_* zRefDensity_ +
515 FluidSystem::referenceDensity(oilPhaseIdx, pvtRegionIdx) * fs.Rv()));
518 const Evaluation& zFraction()
const
519 {
return zFraction_; }
521 const Evaluation& xVolume()
const
524 const Evaluation& yVolume()
const
527 const Evaluation& oilViscosity()
const
528 {
return oilViscosity_; }
530 const Evaluation& gasViscosity()
const
531 {
return gasViscosity_; }
533 const Evaluation& bo()
const
536 const Evaluation& bg()
const
539 const Evaluation& rs()
const
542 const Evaluation& rv()
const
545 const Evaluation zPureInvFormationVolumeFactor()
const
546 {
return 1.0 / bz_; }
548 Scalar zRefDensity()
const
549 {
return zRefDensity_; }
552 Implementation& asImp_()
553 {
return *
static_cast<Implementation*
>(
this); }
558 Evaluation zFraction_;
565 Evaluation oilViscosity_;
566 Evaluation gasViscosity_;
577template <
class TypeTag>
588 void zFractionUpdate_(
const ElementContext&,
593 const Evaluation& xVolume()
const
594 {
throw std::runtime_error(
"xVolume() called but extbo is disabled"); }
596 const Evaluation& yVolume()
const
597 {
throw std::runtime_error(
"yVolume() called but extbo is disabled"); }
599 const Evaluation& oilViscosity()
const
600 {
throw std::runtime_error(
"oilViscosity() called but extbo is disabled"); }
602 const Evaluation& gasViscosity()
const
603 {
throw std::runtime_error(
"gasViscosity() called but extbo is disabled"); }
605 const Evaluation& rs()
const
606 {
throw std::runtime_error(
"rs() called but extbo is disabled"); }
608 const Evaluation& rv()
const
609 {
throw std::runtime_error(
"rv() called but extbo is disabled"); }
611 const Evaluation& zPureInvFormationVolumeFactor()
const
612 {
throw std::runtime_error(
"zPureInvFormationVolumeFactor() called but extbo is disabled"); }
614 const Evaluation& zFraction()
const
615 {
throw std::runtime_error(
"zFraction() called but extbo is disabled"); }
617 const Evaluation& zInverseFormationVolumeFactor()
const
618 {
throw std::runtime_error(
"zInverseFormationVolumeFactor() called but extbo is disabled"); }
620 Scalar zRefDensity()
const
621 {
throw std::runtime_error(
"zRefDensity() called but extbo is disabled"); }
636 Implementation& asImp_()
637 {
return *
static_cast<Implementation*
>(
this); }
640template <
class TypeTag>
Defines a type tags and some fundamental properties all models.
Contains the parameters required to extend the black-oil model by solvent component.
Declares the properties required by the black oil model.
Provides the solvent specific extensive quantities to the generic black-oil module's extensive quanti...
Definition blackoilextbomodules.hh:633
void zFractionUpdate_(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Compute extended pvt properties from table lookups.
Definition blackoilextbomodules.hh:411
void zPvtUpdate_()
Re-compute face densities to account for zFraction dependency.
Definition blackoilextbomodules.hh:495
void zFractionUpdate_(const PrimaryVariables &priVars, unsigned timeIdx)
Compute extended pvt properties from table lookups.
Definition blackoilextbomodules.hh:423
Provides the volumetric quantities required for the equations needed by the solvents extension of the...
Definition blackoilextbomodules.hh:378
Contains the high level supplements required to extend the black oil model.
Definition blackoilextbomodules.hh:62
static Scalar computeResidualError(const EqVector &resid)
Return how much a residual is considered an error.
Definition blackoilextbomodules.hh:282
static void updatePrimaryVars(PrimaryVariables &newPv, const PrimaryVariables &oldPv, const EqVector &delta)
Do a Newton-Raphson update the primary variables of the solvents.
Definition blackoilextbomodules.hh:257
static void registerOutputModules(Model &, Simulator &)
Register all solvent specific VTK and ECL output modules.
Definition blackoilextbomodules.hh:101
static Scalar computeUpdateError(const PrimaryVariables &, const EqVector &)
Return how much a Newton-Raphson update is considered an error.
Definition blackoilextbomodules.hh:270
static void registerParameters()
Register all run-time parameters for the black-oil solvent module.
Definition blackoilextbomodules.hh:95
static void setParams(BlackOilExtboParams< Scalar > &¶ms)
Set parameters.
Definition blackoilextbomodules.hh:87
static void assignPrimaryVars(PrimaryVariables &priVars, Scalar zFraction)
Assign the solvent specific primary variables to a PrimaryVariables object.
Definition blackoilextbomodules.hh:246
Declare the properties used by the infrastructure code of the finite volume discretizations.
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilbioeffectsmodules.hh:43
constexpr auto getPropValue()
get the value data member of a property
Definition propertysystem.hh:240
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition propertysystem.hh:233
Struct holding the parameters for the BlackoilExtboModule class.
Definition blackoilextboparams.hpp:49