BlackOilPrimaryVariables: use if constexpr

This commit is contained in:
Arne Morten Kvarving 2022-08-09 09:08:02 +02:00
parent d2ba89f39a
commit 4d003ea85a

View File

@ -84,10 +84,10 @@ class BlackOilPrimaryVariables : public FvBasePrimaryVariables<TypeTag>
enum { compositionSwitchIdx = Indices::compositionSwitchIdx }; enum { compositionSwitchIdx = Indices::compositionSwitchIdx };
enum { saltConcentrationIdx = Indices::saltConcentrationIdx }; enum { saltConcentrationIdx = Indices::saltConcentrationIdx };
static const bool compositionSwitchEnabled = Indices::compositionSwitchIdx >= 0; static constexpr bool compositionSwitchEnabled = Indices::compositionSwitchIdx >= 0;
static const bool waterEnabled = Indices::waterEnabled; static constexpr bool waterEnabled = Indices::waterEnabled;
static const bool gasEnabled = Indices::gasEnabled; static constexpr bool gasEnabled = Indices::gasEnabled;
static const bool oilEnabled = Indices::oilEnabled; static constexpr bool oilEnabled = Indices::oilEnabled;
// phase indices from the fluid system // phase indices from the fluid system
enum { numPhases = getPropValue<TypeTag, Properties::NumPhases>() }; enum { numPhases = getPropValue<TypeTag, Properties::NumPhases>() };
@ -293,7 +293,7 @@ public:
bool gasPresent = FluidSystem::phaseIsActive(gasPhaseIdx)?(fluidState.saturation(gasPhaseIdx) > 0.0):false; bool gasPresent = FluidSystem::phaseIsActive(gasPhaseIdx)?(fluidState.saturation(gasPhaseIdx) > 0.0):false;
bool oilPresent = FluidSystem::phaseIsActive(oilPhaseIdx)?(fluidState.saturation(oilPhaseIdx) > 0.0):false; bool oilPresent = FluidSystem::phaseIsActive(oilPhaseIdx)?(fluidState.saturation(oilPhaseIdx) > 0.0):false;
bool waterPresent = FluidSystem::phaseIsActive(waterPhaseIdx)?(fluidState.saturation(waterPhaseIdx) > 0.0):false; bool waterPresent = FluidSystem::phaseIsActive(waterPhaseIdx)?(fluidState.saturation(waterPhaseIdx) > 0.0):false;
static const Scalar thresholdWaterFilledCell = 1.0 - 1e-6; constexpr const Scalar thresholdWaterFilledCell = 1.0 - 1e-6;
bool onlyWater = FluidSystem::phaseIsActive(waterPhaseIdx)?(fluidState.saturation(waterPhaseIdx) > thresholdWaterFilledCell):false; bool onlyWater = FluidSystem::phaseIsActive(waterPhaseIdx)?(fluidState.saturation(waterPhaseIdx) > thresholdWaterFilledCell):false;
const auto& saltSaturation = BlackOil::getSaltSaturation_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_); const auto& saltSaturation = BlackOil::getSaltSaturation_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_);
bool precipitatedSaltPresent = enableSaltPrecipitation?(saltSaturation > 0.0):false; bool precipitatedSaltPresent = enableSaltPrecipitation?(saltSaturation > 0.0):false;
@ -309,7 +309,7 @@ public:
// gas and oil: both hydrocarbon phases are in equilibrium (i.e., saturated // gas and oil: both hydrocarbon phases are in equilibrium (i.e., saturated
// with the "protagonist" component of the other phase.) // with the "protagonist" component of the other phase.)
if (FluidSystem::enableVaporizedWater() && !waterPresent) if (FluidSystem::enableVaporizedWater() && !waterPresent)
primaryVarsMeaning_ = Rvw_po_Sg; primaryVarsMeaning_ = Rvw_po_Sg;
else else
primaryVarsMeaning_ = Sw_po_Sg; primaryVarsMeaning_ = Sw_po_Sg;
} }
@ -328,12 +328,12 @@ public:
if (FluidSystem::enableVaporizedOil()) if (FluidSystem::enableVaporizedOil())
primaryVarsMeaning_ = Sw_pg_Rv; primaryVarsMeaning_ = Sw_pg_Rv;
else if (FluidSystem::enableVaporizedWater() && !waterPresent) else if (FluidSystem::enableVaporizedWater() && !waterPresent)
primaryVarsMeaning_ = Rvw_po_Sg; primaryVarsMeaning_ = Rvw_po_Sg;
else else
primaryVarsMeaning_ = Sw_po_Sg; primaryVarsMeaning_ = Sw_po_Sg;
} }
if (enableSaltPrecipitation){ if constexpr (enableSaltPrecipitation){
if (precipitatedSaltPresent) if (precipitatedSaltPresent)
primaryVarsMeaningBrine_ = Sp; primaryVarsMeaningBrine_ = Sp;
else else
@ -342,76 +342,76 @@ public:
// assign the actual primary variables // assign the actual primary variables
if (primaryVarsMeaning() == OnePhase_p) { if (primaryVarsMeaning() == OnePhase_p) {
if (waterEnabled) { if constexpr (waterEnabled) {
(*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(waterPhaseIdx)); (*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(waterPhaseIdx));
} else { } else {
throw std::logic_error("For single-phase runs, only pure water is presently allowed."); throw std::logic_error("For single-phase runs, only pure water is presently allowed.");
} }
} }
else if (primaryVarsMeaning() == Sw_po_Sg) { else if (primaryVarsMeaning() == Sw_po_Sg) {
if (waterEnabled) if constexpr (waterEnabled)
(*this)[waterSaturationIdx] = FsToolbox::value(fluidState.saturation(waterPhaseIdx)); (*this)[waterSaturationIdx] = FsToolbox::value(fluidState.saturation(waterPhaseIdx));
if (gasEnabled && waterEnabled && !oilEnabled) { if constexpr (gasEnabled && waterEnabled && !oilEnabled) {
//-> water-gas system //-> water-gas system
(*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(gasPhaseIdx)); (*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(gasPhaseIdx));
} }
else if (oilEnabled) { else if constexpr (oilEnabled) {
(*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(oilPhaseIdx)); (*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(oilPhaseIdx));
} }
if( compositionSwitchEnabled ) if constexpr (compositionSwitchEnabled)
(*this)[compositionSwitchIdx] = FsToolbox::value(fluidState.saturation(gasPhaseIdx)); (*this)[compositionSwitchIdx] = FsToolbox::value(fluidState.saturation(gasPhaseIdx));
} }
else if (primaryVarsMeaning() == Sw_po_Rs) { else if (primaryVarsMeaning() == Sw_po_Rs) {
const auto& Rs = BlackOil::getRs_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_); const auto& Rs = BlackOil::getRs_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_);
if (waterEnabled) if constexpr (waterEnabled)
(*this)[waterSaturationIdx] = FsToolbox::value(fluidState.saturation(waterPhaseIdx)); (*this)[waterSaturationIdx] = FsToolbox::value(fluidState.saturation(waterPhaseIdx));
(*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(oilPhaseIdx)); (*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(oilPhaseIdx));
if( compositionSwitchEnabled ) if constexpr (compositionSwitchEnabled)
(*this)[compositionSwitchIdx] = Rs; (*this)[compositionSwitchIdx] = Rs;
} }
else if (primaryVarsMeaning() == Rvw_po_Sg && FluidSystem::enableVaporizedWater()) { else if (primaryVarsMeaning() == Rvw_po_Sg && FluidSystem::enableVaporizedWater()) {
const auto& Rvw = BlackOil::getRvw_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_); const auto& Rvw = BlackOil::getRvw_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_);
if (waterEnabled) if constexpr (waterEnabled)
(*this)[waterSaturationIdx] = Rvw; //waterSaturationIdx becomes a switching idx (*this)[waterSaturationIdx] = Rvw; //waterSaturationIdx becomes a switching idx
if (gasEnabled && waterEnabled && !oilEnabled) { if constexpr (gasEnabled && waterEnabled && !oilEnabled) {
//-> water-gas system //-> water-gas system
(*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(gasPhaseIdx)); (*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(gasPhaseIdx));
} }
else if (oilEnabled) { else if constexpr (oilEnabled) {
(*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(oilPhaseIdx)); (*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(oilPhaseIdx));
} }
if( compositionSwitchEnabled ) if constexpr (compositionSwitchEnabled)
(*this)[compositionSwitchIdx] = FsToolbox::value(fluidState.saturation(gasPhaseIdx)); (*this)[compositionSwitchIdx] = FsToolbox::value(fluidState.saturation(gasPhaseIdx));
} }
else if (primaryVarsMeaning() == Rvw_pg_Rv && FluidSystem::enableVaporizedWater()) { else if (primaryVarsMeaning() == Rvw_pg_Rv && FluidSystem::enableVaporizedWater()) {
const auto& Rvw = BlackOil::getRvw_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_); const auto& Rvw = BlackOil::getRvw_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_);
const auto& Rv = BlackOil::getRv_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_); const auto& Rv = BlackOil::getRv_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_);
if (waterEnabled) if constexpr (waterEnabled)
(*this)[waterSaturationIdx] = Rvw; //waterSaturationIdx becomes a switching idx (*this)[waterSaturationIdx] = Rvw; //waterSaturationIdx becomes a switching idx
if (gasEnabled && waterEnabled && !oilEnabled) { if constexpr (gasEnabled && waterEnabled && !oilEnabled) {
//-> water-gas system //-> water-gas system
(*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(gasPhaseIdx)); (*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(gasPhaseIdx));
} }
else if (oilEnabled) { else if constexpr (oilEnabled) {
(*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(oilPhaseIdx)); (*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(oilPhaseIdx));
} }
if( compositionSwitchEnabled ) if constexpr (compositionSwitchEnabled)
(*this)[compositionSwitchIdx] = Rv; (*this)[compositionSwitchIdx] = Rv;
} }
else { else {
assert(primaryVarsMeaning() == Sw_pg_Rv); assert(primaryVarsMeaning() == Sw_pg_Rv);
const auto& Rv = BlackOil::getRv_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_); const auto& Rv = BlackOil::getRv_<FluidSystem, FluidState, Scalar>(fluidState, pvtRegionIdx_);
if (waterEnabled) if constexpr (waterEnabled)
(*this)[waterSaturationIdx] = FsToolbox::value(fluidState.saturation(waterPhaseIdx)); (*this)[waterSaturationIdx] = FsToolbox::value(fluidState.saturation(waterPhaseIdx));
(*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(gasPhaseIdx)); (*this)[pressureSwitchIdx] = FsToolbox::value(fluidState.pressure(gasPhaseIdx));
if( compositionSwitchEnabled ) if constexpr (compositionSwitchEnabled)
(*this)[compositionSwitchIdx] = Rv; (*this)[compositionSwitchIdx] = Rv;
} }
if (enableSaltPrecipitation) { if constexpr (enableSaltPrecipitation) {
if (primaryVarsMeaningBrine() == Sp) { if (primaryVarsMeaningBrine() == Sp) {
(*this)[saltConcentrationIdx] = FsToolbox::value(saltSaturation); (*this)[saltConcentrationIdx] = FsToolbox::value(saltSaturation);
} }
@ -453,7 +453,7 @@ public:
if (waterEnabled && primaryVarsMeaning() != Rvw_po_Sg && primaryVarsMeaning() != Rvw_pg_Rv ) if (waterEnabled && primaryVarsMeaning() != Rvw_po_Sg && primaryVarsMeaning() != Rvw_pg_Rv )
Sw = (*this)[Indices::waterSaturationIdx]; Sw = (*this)[Indices::waterSaturationIdx];
if (enableSaltPrecipitation) { if constexpr (enableSaltPrecipitation) {
Scalar saltSolubility = BrineModule::saltSol(pvtRegionIndex()); Scalar saltSolubility = BrineModule::saltSol(pvtRegionIndex());
if (primaryVarsMeaningBrine() == Sp) { if (primaryVarsMeaningBrine() == Sp) {
Scalar saltSat = (*this)[saltConcentrationIdx]; Scalar saltSat = (*this)[saltConcentrationIdx];
@ -473,19 +473,19 @@ public:
// Primary variable switches possibilities for black-oil (from -> to) // Primary variable switches possibilities for black-oil (from -> to)
// Sw_po_Sg (3-phase) -> Rvw_po_Sg, Sw_pg_Rv, Rvw_pg_Rv, Sw_po_Rs // Sw_po_Sg (3-phase) -> Rvw_po_Sg, Sw_pg_Rv, Rvw_pg_Rv, Sw_po_Rs
// Sw_pg_Rv (water-gas) -> Rvw_pg_Rv, Sw_po_Sg, Rvw_po_Sg // Sw_pg_Rv (water-gas) -> Rvw_pg_Rv, Sw_po_Sg, Rvw_po_Sg
// Rvw_po_Sg (gas-oil) -> Sw_po_Sg, Rvw_pg_Rv // Rvw_po_Sg (gas-oil) -> Sw_po_Sg, Rvw_pg_Rv
// Rvw_pg_Rv (gas) -> Sw_pg_Rv, Rvw_po_Sg // Rvw_pg_Rv (gas) -> Sw_pg_Rv, Rvw_po_Sg
// Sw_po_Rs (water-oil) -> Sw_po_Sg // Sw_po_Rs (water-oil) -> Sw_po_Sg
if (primaryVarsMeaning() == Sw_po_Sg) { if (primaryVarsMeaning() == Sw_po_Sg) {
// special case for cells with almost only water // special case for cells with almost only water
if (Sw >= thresholdWaterFilledCell) { if (Sw >= thresholdWaterFilledCell) {
// make sure water saturations does not exceed 1.0 // make sure water saturations does not exceed 1.0
if (waterEnabled) if constexpr (waterEnabled)
(*this)[Indices::waterSaturationIdx] = 1.0; (*this)[Indices::waterSaturationIdx] = 1.0;
// the hydrocarbon gas saturation is set to 0.0 // the hydrocarbon gas saturation is set to 0.0
if (compositionSwitchEnabled) if constexpr (compositionSwitchEnabled)
(*this)[Indices::compositionSwitchIdx] = 0.0; (*this)[Indices::compositionSwitchIdx] = 0.0;
return false; return false;
@ -493,14 +493,14 @@ public:
// phase equilibrium, i.e., both hydrocarbon phases are present. // phase equilibrium, i.e., both hydrocarbon phases are present.
Scalar Sg = 0.0; Scalar Sg = 0.0;
if (compositionSwitchEnabled) if constexpr (compositionSwitchEnabled)
Sg = (*this)[Indices::compositionSwitchIdx]; Sg = (*this)[Indices::compositionSwitchIdx];
Scalar So = 1.0 - Sw - Sg - solventSaturation_(); Scalar So = 1.0 - Sw - Sg - solventSaturation_();
Scalar So3 = 1.0 - Sg - solventSaturation_(); Scalar So3 = 1.0 - Sg - solventSaturation_();
//water disappears //water disappears
if(Sw < -eps && So3 > 0.0 && Sg > 0.0 && FluidSystem::enableVaporizedWater()) { if(Sw < -eps && So3 > 0.0 && Sg > 0.0 && FluidSystem::enableVaporizedWater()) {
Scalar po = (*this)[Indices::pressureSwitchIdx]; Scalar po = (*this)[Indices::pressureSwitchIdx];
Scalar T = asImp_().temperature_(); Scalar T = asImp_().temperature_();
Scalar pC[numPhases] = { 0.0 }; Scalar pC[numPhases] = { 0.0 };
const MaterialLawParams& matParams = problem.materialLawParams(globalDofIdx); const MaterialLawParams& matParams = problem.materialLawParams(globalDofIdx);
@ -510,13 +510,13 @@ public:
T, T,
pg); pg);
setPrimaryVarsMeaning(Rvw_po_Sg); setPrimaryVarsMeaning(Rvw_po_Sg);
(*this)[Indices::waterSaturationIdx] = RvwSat; //primary variable becomes Rvw (*this)[Indices::waterSaturationIdx] = RvwSat; //primary variable becomes Rvw
return true; return true;
} }
//water and oil disappears //water and oil disappears
if(Sw < -eps && So3 <-eps && Sg > 0.0 && FluidSystem::enableVaporizedWater() && FluidSystem::enableVaporizedOil()) { if(Sw < -eps && So3 <-eps && Sg > 0.0 && FluidSystem::enableVaporizedWater() && FluidSystem::enableVaporizedOil()) {
Scalar po = (*this)[Indices::pressureSwitchIdx]; Scalar po = (*this)[Indices::pressureSwitchIdx];
Scalar T = asImp_().temperature_(); Scalar T = asImp_().temperature_();
Scalar pC[numPhases] = { 0.0 }; Scalar pC[numPhases] = { 0.0 };
const MaterialLawParams& matParams = problem.materialLawParams(globalDofIdx); const MaterialLawParams& matParams = problem.materialLawParams(globalDofIdx);
@ -526,21 +526,22 @@ public:
T, T,
pg); pg);
Scalar SoMax = problem.maxOilSaturation(globalDofIdx);
Scalar RvMax = problem.maxOilVaporizationFactor(/*timeIdx=*/0, globalDofIdx);
Scalar RvSat = enableExtbo ? ExtboModule::rv(pvtRegionIndex(),
pg,
zFraction_())
: FluidSystem::gasPvt().saturatedOilVaporizationFactor(pvtRegionIdx_,
T,
pg,
Scalar(0),
SoMax);
setPrimaryVarsMeaning(Rvw_pg_Rv); setPrimaryVarsMeaning(Rvw_pg_Rv);
(*this)[Indices::pressureSwitchIdx] = pg; (*this)[Indices::pressureSwitchIdx] = pg;
(*this)[Indices::waterSaturationIdx] = RvwSat; //primary variable becomes Rvw (*this)[Indices::waterSaturationIdx] = RvwSat; //primary variable becomes Rvw
if (compositionSwitchEnabled) if constexpr (compositionSwitchEnabled) {
Scalar SoMax = problem.maxOilSaturation(globalDofIdx);
Scalar RvMax = problem.maxOilVaporizationFactor(/*timeIdx=*/0, globalDofIdx);
Scalar RvSat = enableExtbo ? ExtboModule::rv(pvtRegionIndex(),
pg,
zFraction_())
: FluidSystem::gasPvt().saturatedOilVaporizationFactor(pvtRegionIdx_,
T,
pg,
Scalar(0),
SoMax);
(*this)[Indices::compositionSwitchIdx] = std::min(RvMax, RvSat); (*this)[Indices::compositionSwitchIdx] = std::min(RvMax, RvSat);
}
return true; return true;
} }
@ -554,23 +555,23 @@ public:
// represents the oil phase pressure, so we do not need to change // represents the oil phase pressure, so we do not need to change
// this. For the gas dissolution factor, we use the low-level blackoil // this. For the gas dissolution factor, we use the low-level blackoil
// PVT objects to calculate the mole fraction of gas saturated oil. // PVT objects to calculate the mole fraction of gas saturated oil.
Scalar po = (*this)[Indices::pressureSwitchIdx];
Scalar T = asImp_().temperature_();
Scalar SoMax = problem.maxOilSaturation(globalDofIdx);
Scalar RsMax = problem.maxGasDissolutionFactor(/*timeIdx=*/0, globalDofIdx);
Scalar RsSat = enableExtbo ? ExtboModule::rs(pvtRegionIndex(),
po,
zFraction_())
: FluidSystem::oilPvt().saturatedGasDissolutionFactor(pvtRegionIdx_,
T,
po,
So2,
SoMax);
setPrimaryVarsMeaning(Sw_po_Rs); setPrimaryVarsMeaning(Sw_po_Rs);
if (compositionSwitchEnabled) if constexpr (compositionSwitchEnabled) {
Scalar po = (*this)[Indices::pressureSwitchIdx];
Scalar T = asImp_().temperature_();
Scalar SoMax = problem.maxOilSaturation(globalDofIdx);
Scalar RsMax = problem.maxGasDissolutionFactor(/*timeIdx=*/0, globalDofIdx);
Scalar RsSat = enableExtbo ? ExtboModule::rs(pvtRegionIndex(),
po,
zFraction_())
: FluidSystem::oilPvt().saturatedGasDissolutionFactor(pvtRegionIdx_,
T,
po,
So2,
SoMax);
(*this)[Indices::compositionSwitchIdx] = (*this)[Indices::compositionSwitchIdx] =
std::min(RsMax, RsSat); std::min(RsMax, RsSat);
}
return true; return true;
} }
@ -590,21 +591,22 @@ public:
// we start at the Rv value that corresponds to that of oil-saturated // we start at the Rv value that corresponds to that of oil-saturated
// hydrocarbon gas // hydrocarbon gas
Scalar T = asImp_().temperature_();
Scalar SoMax = problem.maxOilSaturation(globalDofIdx);
Scalar RvMax = problem.maxOilVaporizationFactor(/*timeIdx=*/0, globalDofIdx);
Scalar RvSat = enableExtbo ? ExtboModule::rv(pvtRegionIndex(),
pg,
zFraction_())
: FluidSystem::gasPvt().saturatedOilVaporizationFactor(pvtRegionIdx_,
T,
pg,
Scalar(0),
SoMax);
setPrimaryVarsMeaning(Sw_pg_Rv); setPrimaryVarsMeaning(Sw_pg_Rv);
(*this)[Indices::pressureSwitchIdx] = pg; (*this)[Indices::pressureSwitchIdx] = pg;
if (compositionSwitchEnabled) if constexpr (compositionSwitchEnabled) {
Scalar T = asImp_().temperature_();
Scalar SoMax = problem.maxOilSaturation(globalDofIdx);
Scalar RvMax = problem.maxOilVaporizationFactor(/*timeIdx=*/0, globalDofIdx);
Scalar RvSat = enableExtbo ? ExtboModule::rv(pvtRegionIndex(),
pg,
zFraction_())
: FluidSystem::gasPvt().saturatedOilVaporizationFactor(pvtRegionIdx_,
T,
pg,
Scalar(0),
SoMax);
(*this)[Indices::compositionSwitchIdx] = std::min(RvMax, RvSat); (*this)[Indices::compositionSwitchIdx] = std::min(RvMax, RvSat);
}
return true; return true;
} }
@ -619,7 +621,7 @@ public:
// switch back to phase equilibrium mode if the oil phase vanishes (i.e., // switch back to phase equilibrium mode if the oil phase vanishes (i.e.,
// the water-only case) // the water-only case)
setPrimaryVarsMeaning(Sw_po_Sg); setPrimaryVarsMeaning(Sw_po_Sg);
if (waterEnabled) if constexpr (waterEnabled)
(*this)[Indices::waterSaturationIdx] = 1.0; // water saturation (*this)[Indices::waterSaturationIdx] = 1.0; // water saturation
(*this)[Indices::compositionSwitchIdx] = 0.0; // hydrocarbon gas saturation (*this)[Indices::compositionSwitchIdx] = 0.0; // hydrocarbon gas saturation
@ -657,11 +659,10 @@ public:
return false; return false;
} }
else if (primaryVarsMeaning() == Rvw_po_Sg) { else if (primaryVarsMeaning() == Rvw_po_Sg) {
Scalar po = (*this)[Indices::pressureSwitchIdx];
Scalar po = (*this)[Indices::pressureSwitchIdx];
Scalar T = asImp_().temperature_(); Scalar T = asImp_().temperature_();
Scalar Sg = 0.0; Scalar Sg = 0.0;
if (compositionSwitchEnabled) if constexpr (compositionSwitchEnabled)
Sg = (*this)[Indices::compositionSwitchIdx]; Sg = (*this)[Indices::compositionSwitchIdx];
Scalar So = 1.0 - Sg - solventSaturation_(); Scalar So = 1.0 - Sg - solventSaturation_();
@ -671,7 +672,7 @@ public:
Scalar pg = po + (pC[gasPhaseIdx] - pC[oilPhaseIdx]); Scalar pg = po + (pC[gasPhaseIdx] - pC[oilPhaseIdx]);
Scalar RvwSat = FluidSystem::gasPvt().saturatedWaterVaporizationFactor(pvtRegionIdx_, Scalar RvwSat = FluidSystem::gasPvt().saturatedWaterVaporizationFactor(pvtRegionIdx_,
T, T,
pg); pg);
Scalar Rvw = (*this)[Indices::waterSaturationIdx]; Scalar Rvw = (*this)[Indices::waterSaturationIdx];
if (Rvw > RvwSat*(1.0 + eps)) { if (Rvw > RvwSat*(1.0 + eps)) {
// water phase appears // water phase appears
@ -684,20 +685,21 @@ public:
//oil phase dissappears //oil phase dissappears
computeCapillaryPressures_(pC, /*So=*/ 0.0, Sg + solventSaturation_(), /*Sw=*/ 0.0, matParams); computeCapillaryPressures_(pC, /*So=*/ 0.0, Sg + solventSaturation_(), /*Sw=*/ 0.0, matParams);
pg = po + (pC[gasPhaseIdx] - pC[oilPhaseIdx]); pg = po + (pC[gasPhaseIdx] - pC[oilPhaseIdx]);
Scalar SoMax = problem.maxOilSaturation(globalDofIdx);
Scalar RvMax = problem.maxOilVaporizationFactor(/*timeIdx=*/0, globalDofIdx);
Scalar RvSat = enableExtbo ? ExtboModule::rv(pvtRegionIndex(),
pg,
zFraction_())
: FluidSystem::gasPvt().saturatedOilVaporizationFactor(pvtRegionIdx_,
T,
pg,
Scalar(0),
SoMax);
setPrimaryVarsMeaning(Rvw_pg_Rv); setPrimaryVarsMeaning(Rvw_pg_Rv);
(*this)[Indices::pressureSwitchIdx] = pg; (*this)[Indices::pressureSwitchIdx] = pg;
if (compositionSwitchEnabled) if constexpr (compositionSwitchEnabled) {
Scalar SoMax = problem.maxOilSaturation(globalDofIdx);
Scalar RvMax = problem.maxOilVaporizationFactor(/*timeIdx=*/0, globalDofIdx);
Scalar RvSat = enableExtbo ? ExtboModule::rv(pvtRegionIndex(),
pg,
zFraction_())
: FluidSystem::gasPvt().saturatedOilVaporizationFactor(pvtRegionIdx_,
T,
pg,
Scalar(0),
SoMax);
(*this)[Indices::compositionSwitchIdx] = std::min(RvMax, RvSat); (*this)[Indices::compositionSwitchIdx] = std::min(RvMax, RvSat);
}
return true; return true;
} }
@ -705,11 +707,11 @@ public:
} }
else if (primaryVarsMeaning() == Rvw_pg_Rv) { else if (primaryVarsMeaning() == Rvw_pg_Rv) {
//only gas phase //only gas phase
Scalar pg = (*this)[Indices::pressureSwitchIdx]; Scalar pg = (*this)[Indices::pressureSwitchIdx];
Scalar T = asImp_().temperature_(); Scalar T = asImp_().temperature_();
Scalar RvwSat = FluidSystem::gasPvt().saturatedWaterVaporizationFactor(pvtRegionIdx_, Scalar RvwSat = FluidSystem::gasPvt().saturatedWaterVaporizationFactor(pvtRegionIdx_,
T, T,
pg); pg);
Scalar Rvw = (*this)[Indices::waterSaturationIdx]; Scalar Rvw = (*this)[Indices::waterSaturationIdx];
if (Rvw > RvwSat*(1.0 + eps)) { if (Rvw > RvwSat*(1.0 + eps)) {
// water phase appears // water phase appears
@ -751,7 +753,7 @@ public:
return true; return true;
} }
return false; return false;
} }
else { else {
assert(primaryVarsMeaning() == Sw_pg_Rv); assert(primaryVarsMeaning() == Sw_pg_Rv);
assert(compositionSwitchEnabled); assert(compositionSwitchEnabled);
@ -775,7 +777,7 @@ public:
Scalar po = pg + (pC[oilPhaseIdx] - pC[gasPhaseIdx]); Scalar po = pg + (pC[oilPhaseIdx] - pC[gasPhaseIdx]);
setPrimaryVarsMeaning(Sw_po_Sg); setPrimaryVarsMeaning(Sw_po_Sg);
if (waterEnabled) if constexpr (waterEnabled)
(*this)[Indices::waterSaturationIdx] = 1.0; (*this)[Indices::waterSaturationIdx] = 1.0;
(*this)[Indices::pressureSwitchIdx] = po; (*this)[Indices::pressureSwitchIdx] = po;
@ -784,17 +786,17 @@ public:
return true; return true;
} }
//water disappears //water disappears
if(Sw < -eps && FluidSystem::enableVaporizedWater()) { if(Sw < -eps && FluidSystem::enableVaporizedWater()) {
Scalar RvwSat = FluidSystem::gasPvt().saturatedWaterVaporizationFactor(pvtRegionIdx_, Scalar RvwSat = FluidSystem::gasPvt().saturatedWaterVaporizationFactor(pvtRegionIdx_,
T, T,
pg); pg);
setPrimaryVarsMeaning(Rvw_pg_Rv); setPrimaryVarsMeaning(Rvw_pg_Rv);
(*this)[Indices::waterSaturationIdx] = RvwSat; //primary variable becomes Rvw (*this)[Indices::waterSaturationIdx] = RvwSat; //primary variable becomes Rvw
return true; return true;
} }
// Only the gas and the water phases are present. The oil phase appears as // Only the gas and the water phases are present. The oil phase appears as
// soon as more of the oil component is present in the hydrocarbon gas phase // soon as more of the oil component is present in the hydrocarbon gas phase
// than what saturated gas contains. Note that we use the blackoil specific // than what saturated gas contains. Note that we use the blackoil specific
@ -848,10 +850,10 @@ public:
if (primaryVarsMeaning() == Sw_po_Sg) { if (primaryVarsMeaning() == Sw_po_Sg) {
Scalar Sg = 0.0; Scalar Sg = 0.0;
if (compositionSwitchEnabled) if constexpr (compositionSwitchEnabled)
Sg = (*this)[Indices::compositionSwitchIdx]; Sg = (*this)[Indices::compositionSwitchIdx];
Scalar Ssol = 0.0; Scalar Ssol = 0.0;
if (enableSolvent) if constexpr (enableSolvent)
Ssol =(*this) [Indices::solventSaturationIdx]; Ssol =(*this) [Indices::solventSaturationIdx];
Scalar So = 1.0 - Sw - Sg - Ssol; Scalar So = 1.0 - Sw - Sg - Ssol;
@ -865,17 +867,17 @@ public:
Sg = Sg/St; Sg = Sg/St;
Ssol = Ssol/St; Ssol = Ssol/St;
assert(St>0.5); assert(St>0.5);
if (waterEnabled) if constexpr (waterEnabled)
(*this)[Indices::waterSaturationIdx]= Sw; (*this)[Indices::waterSaturationIdx]= Sw;
if (compositionSwitchEnabled) if constexpr (compositionSwitchEnabled)
(*this)[Indices::compositionSwitchIdx] = Sg; (*this)[Indices::compositionSwitchIdx] = Sg;
if (enableSolvent) if constexpr (enableSolvent)
(*this)[Indices::solventSaturationIdx] = Ssol; (*this)[Indices::solventSaturationIdx] = Ssol;
return not(St==1); return not(St==1);
}else if (primaryVarsMeaning() == Sw_po_Rs) { }else if (primaryVarsMeaning() == Sw_po_Rs) {
Scalar Ssol = 0.0; Scalar Ssol = 0.0;
if (enableSolvent) if constexpr (enableSolvent)
Ssol = (*this)[Indices::solventSaturationIdx]; Ssol = (*this)[Indices::solventSaturationIdx];
Scalar So = 1.0 - Sw - Ssol; Scalar So = 1.0 - Sw - Ssol;
Sw = std::min(std::max(Sw,0.0),1.0); Sw = std::min(std::max(Sw,0.0),1.0);
@ -886,16 +888,16 @@ public:
assert(St>0.5); assert(St>0.5);
Sw=Sw/St; Sw=Sw/St;
Ssol=Ssol/St; Ssol=Ssol/St;
if (waterEnabled) if constexpr (waterEnabled)
(*this)[Indices::waterSaturationIdx]= Sw; (*this)[Indices::waterSaturationIdx]= Sw;
if (enableSolvent) if constexpr (enableSolvent)
(*this)[Indices::solventSaturationIdx] = Ssol; (*this)[Indices::solventSaturationIdx] = Ssol;
return not(St==1); return not(St==1);
}else{ }else{
assert(primaryVarsMeaning() == Sw_pg_Rv); assert(primaryVarsMeaning() == Sw_pg_Rv);
assert(compositionSwitchEnabled); assert(compositionSwitchEnabled);
Scalar Ssol=0.0; Scalar Ssol=0.0;
if (enableSolvent) if constexpr (enableSolvent)
Ssol = (*this)[Indices::solventSaturationIdx]; Ssol = (*this)[Indices::solventSaturationIdx];
Scalar Sg = 1.0 - Sw - Ssol; Scalar Sg = 1.0 - Sw - Ssol;
//So = 0.0; //So = 0.0;
@ -906,9 +908,9 @@ public:
assert(St>0.5); assert(St>0.5);
Sw=Sw/St; Sw=Sw/St;
Ssol=Ssol/St; Ssol=Ssol/St;
if (waterEnabled) if constexpr (waterEnabled)
(*this)[Indices::waterSaturationIdx]= Sw; (*this)[Indices::waterSaturationIdx]= Sw;
if (enableSolvent) if constexpr (enableSolvent)
(*this)[Indices::solventSaturationIdx] = Ssol; (*this)[Indices::solventSaturationIdx] = Ssol;
return not(St==1); return not(St==1);
} }
@ -953,90 +955,90 @@ private:
Scalar solventSaturation_() const Scalar solventSaturation_() const
{ {
if (!enableSolvent) if constexpr (enableSolvent)
return (*this)[Indices::solventSaturationIdx];
else
return 0.0; return 0.0;
return (*this)[Indices::solventSaturationIdx];
} }
Scalar zFraction_() const Scalar zFraction_() const
{ {
if (!enableExtbo) if constexpr (enableExtbo)
return (*this)[Indices::zFractionIdx];
else
return 0.0; return 0.0;
return (*this)[Indices::zFractionIdx];
} }
Scalar polymerConcentration_() const Scalar polymerConcentration_() const
{ {
if (!enablePolymer) if constexpr (enablePolymer)
return (*this)[Indices::polymerConcentrationIdx];
else
return 0.0; return 0.0;
return (*this)[Indices::polymerConcentrationIdx];
} }
Scalar foamConcentration_() const Scalar foamConcentration_() const
{ {
if (!enableFoam) if constexpr (enableFoam)
return (*this)[Indices::foamConcentrationIdx];
else
return 0.0; return 0.0;
return (*this)[Indices::foamConcentrationIdx];
} }
Scalar saltConcentration_() const Scalar saltConcentration_() const
{ {
if (!enableBrine) if constexpr (enableBrine)
return (*this)[Indices::saltConcentrationIdx];
else
return 0.0; return 0.0;
return (*this)[Indices::saltConcentrationIdx];
} }
Scalar temperature_() const Scalar temperature_() const
{ {
if (!enableEnergy) if constexpr (enableEnergy)
return (*this)[Indices::temperatureIdx];
else
return FluidSystem::reservoirTemperature(); return FluidSystem::reservoirTemperature();
return (*this)[Indices::temperatureIdx];
} }
Scalar microbialConcentration_() const Scalar microbialConcentration_() const
{ {
if (!enableMICP) if constexpr (enableMICP)
return (*this)[Indices::microbialConcentrationIdx];
else
return 0.0; return 0.0;
return (*this)[Indices::microbialConcentrationIdx];
} }
Scalar oxygenConcentration_() const Scalar oxygenConcentration_() const
{ {
if (!enableMICP) if constexpr (enableMICP)
return (*this)[Indices::oxygenConcentrationIdx];
else
return 0.0; return 0.0;
return (*this)[Indices::oxygenConcentrationIdx];
} }
Scalar ureaConcentration_() const Scalar ureaConcentration_() const
{ {
if (!enableMICP) if constexpr (enableMICP)
return (*this)[Indices::ureaConcentrationIdx];
else
return 0.0; return 0.0;
return (*this)[Indices::ureaConcentrationIdx];
} }
Scalar biofilmConcentration_() const Scalar biofilmConcentration_() const
{ {
if (!enableMICP) if constexpr (enableMICP)
return (*this)[Indices::biofilmConcentrationIdx];
else
return 0.0; return 0.0;
return (*this)[Indices::biofilmConcentrationIdx];
} }
Scalar calciteConcentration_() const Scalar calciteConcentration_() const
{ {
if (!enableMICP) if constexpr (enableMICP)
return (*this)[Indices::calciteConcentrationIdx];
else
return 0.0; return 0.0;
return (*this)[Indices::calciteConcentrationIdx];
} }
template <class Container> template <class Container>