From 7f37b16f3c66bea384c329a7890ceab4adda8a0e Mon Sep 17 00:00:00 2001 From: Tor Harald Sandve Date: Wed, 26 Jun 2024 10:17:49 +0200 Subject: [PATCH] Add option to not use saturated tables For co2storage and h2storage we dont have a concept of tables and should not spend time on checking if we are at the saturated front --- .../fluidsystems/BlackOilFluidSystem.cpp | 8 ++++ .../fluidsystems/BlackOilFluidSystem.hpp | 42 +++++++++++++------ 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/opm/material/fluidsystems/BlackOilFluidSystem.cpp b/opm/material/fluidsystems/BlackOilFluidSystem.cpp index af176d09dad..3d59ba6a753 100644 --- a/opm/material/fluidsystems/BlackOilFluidSystem.cpp +++ b/opm/material/fluidsystems/BlackOilFluidSystem.cpp @@ -159,6 +159,10 @@ initFromState(const EclipseState& eclState, const Schedule& schedule) } } + // For co2storage and h2storage we dont have a concept of tables and should not spend time on + // checking if we are at the saturated front + setUseSaturatedTables(!(eclState.runspec().h2Storage() || eclState.runspec().co2Storage())); + setEnableDiffusion(eclState.getSimulationConfig().isDiffusive()); if (enableDiffusion()) { const auto& diffCoeffTables = eclState.getTableManager().getDiffusionCoefficientTable(); @@ -220,6 +224,7 @@ void BlackOilFluidSystem:: initBegin(std::size_t numPvtRegions) { isInitialized_ = false; + useSaturatedTables_ = true; enableDissolvedGas_ = true; enableDissolvedGasInWater_ = false; @@ -450,6 +455,9 @@ template <> std::vector> BlackOilFluidSystem bool BlackOilFluidSystem::isInitialized_ = false; template <> bool BlackOilFluidSystem::isInitialized_ = false; +template <> bool BlackOilFluidSystem::useSaturatedTables_ = false; +template <> bool BlackOilFluidSystem::useSaturatedTables_ = false; + // IMPORTANT: The following two lines must come after the template specializations above // or else the static variable above will appear as undefined in the generated object file. template class BlackOilFluidSystem; diff --git a/opm/material/fluidsystems/BlackOilFluidSystem.hpp b/opm/material/fluidsystems/BlackOilFluidSystem.hpp index 5ce9b0e18b3..a7f7e158cbb 100644 --- a/opm/material/fluidsystems/BlackOilFluidSystem.hpp +++ b/opm/material/fluidsystems/BlackOilFluidSystem.hpp @@ -288,6 +288,13 @@ class BlackOilFluidSystem : public BaseFluidSystem(fluidState, regionIdx); - if (fluidState.saturation(gasPhaseIdx) > 0.0 + if (useSaturatedTables() && fluidState.saturation(gasPhaseIdx) > 0.0 && Rs >= (1.0 - 1e-10)*oilPvt_->saturatedGasDissolutionFactor(regionIdx, scalarValue(T), scalarValue(p))) { return oilPvt_->saturatedInverseFormationVolumeFactor(regionIdx, T, p); @@ -767,20 +782,20 @@ class BlackOilFluidSystem : public BaseFluidSystem(fluidState, regionIdx); const auto& Rv = BlackOil::template getRv_(fluidState, regionIdx); - if (fluidState.saturation(waterPhaseIdx) > 0.0 + if (useSaturatedTables() && fluidState.saturation(waterPhaseIdx) > 0.0 && Rvw >= (1.0 - 1e-10)*gasPvt_->saturatedWaterVaporizationFactor(regionIdx, scalarValue(T), scalarValue(p)) && fluidState.saturation(oilPhaseIdx) > 0.0 && Rv >= (1.0 - 1e-10)*gasPvt_->saturatedOilVaporizationFactor(regionIdx, scalarValue(T), scalarValue(p))) { return gasPvt_->saturatedInverseFormationVolumeFactor(regionIdx, T, p); } else { - return gasPvt_->inverseFormationVolumeFactor(regionIdx, T, p, Rv, Rvw); + return gasPvt_->inverseFormationVolumeFactor(regionIdx, T, p, Rv, Rvw); } } if (enableVaporizedOil()) { const auto& Rv = BlackOil::template getRv_(fluidState, regionIdx); - if (fluidState.saturation(oilPhaseIdx) > 0.0 + if (useSaturatedTables() && fluidState.saturation(oilPhaseIdx) > 0.0 && Rv >= (1.0 - 1e-10)*gasPvt_->saturatedOilVaporizationFactor(regionIdx, scalarValue(T), scalarValue(p))) { return gasPvt_->saturatedInverseFormationVolumeFactor(regionIdx, T, p); @@ -792,7 +807,7 @@ class BlackOilFluidSystem : public BaseFluidSystem(fluidState, regionIdx); - if (fluidState.saturation(waterPhaseIdx) > 0.0 + if (useSaturatedTables() && fluidState.saturation(waterPhaseIdx) > 0.0 && Rvw >= (1.0 - 1e-10)*gasPvt_->saturatedWaterVaporizationFactor(regionIdx, scalarValue(T), scalarValue(p))) { return gasPvt_->saturatedInverseFormationVolumeFactor(regionIdx, T, p); @@ -811,7 +826,7 @@ class BlackOilFluidSystem : public BaseFluidSystem(fluidState, regionIdx); if (enableDissolvedGasInWater()) { const auto& Rsw = BlackOil::template getRsw_(fluidState, regionIdx); - if (fluidState.saturation(gasPhaseIdx) > 0.0 + if (useSaturatedTables() && fluidState.saturation(gasPhaseIdx) > 0.0 && Rsw >= (1.0 - 1e-10)*waterPvt_->saturatedGasDissolutionFactor(regionIdx, scalarValue(T), scalarValue(p), scalarValue(saltConcentration))) { return waterPvt_->saturatedInverseFormationVolumeFactor(regionIdx, T, p, saltConcentration); @@ -995,7 +1010,7 @@ class BlackOilFluidSystem : public BaseFluidSystem(fluidState, regionIdx); - if (fluidState.saturation(gasPhaseIdx) > 0.0 + if (useSaturatedTables() && fluidState.saturation(gasPhaseIdx) > 0.0 && Rs >= (1.0 - 1e-10)*oilPvt_->saturatedGasDissolutionFactor(regionIdx, scalarValue(T), scalarValue(p))) { return oilPvt_->saturatedViscosity(regionIdx, T, p); @@ -1012,7 +1027,7 @@ class BlackOilFluidSystem : public BaseFluidSystem(fluidState, regionIdx); const auto& Rv = BlackOil::template getRv_(fluidState, regionIdx); - if (fluidState.saturation(waterPhaseIdx) > 0.0 + if (useSaturatedTables() && fluidState.saturation(waterPhaseIdx) > 0.0 && Rvw >= (1.0 - 1e-10)*gasPvt_->saturatedWaterVaporizationFactor(regionIdx, scalarValue(T), scalarValue(p)) && fluidState.saturation(oilPhaseIdx) > 0.0 && Rv >= (1.0 - 1e-10)*gasPvt_->saturatedOilVaporizationFactor(regionIdx, scalarValue(T), scalarValue(p))) @@ -1024,7 +1039,7 @@ class BlackOilFluidSystem : public BaseFluidSystem(fluidState, regionIdx); - if (fluidState.saturation(oilPhaseIdx) > 0.0 + if (useSaturatedTables() && fluidState.saturation(oilPhaseIdx) > 0.0 && Rv >= (1.0 - 1e-10)*gasPvt_->saturatedOilVaporizationFactor(regionIdx, scalarValue(T), scalarValue(p))) { return gasPvt_->saturatedViscosity(regionIdx, T, p); @@ -1035,7 +1050,7 @@ class BlackOilFluidSystem : public BaseFluidSystem(fluidState, regionIdx); - if (fluidState.saturation(waterPhaseIdx) > 0.0 + if (useSaturatedTables() && fluidState.saturation(waterPhaseIdx) > 0.0 && Rvw >= (1.0 - 1e-10)*gasPvt_->saturatedWaterVaporizationFactor(regionIdx, scalarValue(T), scalarValue(p))) { return gasPvt_->saturatedViscosity(regionIdx, T, p); @@ -1055,7 +1070,7 @@ class BlackOilFluidSystem : public BaseFluidSystem(fluidState, regionIdx); if (enableDissolvedGasInWater()) { const auto& Rsw = BlackOil::template getRsw_(fluidState, regionIdx); - if (fluidState.saturation(gasPhaseIdx) > 0.0 + if (useSaturatedTables() && fluidState.saturation(gasPhaseIdx) > 0.0 && Rsw >= (1.0 - 1e-10)*waterPvt_->saturatedGasDissolutionFactor(regionIdx, scalarValue(T), scalarValue(p), scalarValue(saltConcentration))) { return waterPvt_->saturatedViscosity(regionIdx, T, p, saltConcentration); @@ -1541,6 +1556,8 @@ class BlackOilFluidSystem : public BaseFluidSystem canonicalToActivePhaseIdx_; static bool isInitialized_; + + static bool useSaturatedTables_; }; template using BOFS = BlackOilFluidSystem; @@ -1564,7 +1581,8 @@ template<> std::shared_ptr> BOFS::waterPvt_; \ template<> std::vector> BOFS::referenceDensity_; \ template<> std::vector> BOFS::molarMass_; \ template<> std::vector> BOFS::diffusionCoefficients_; \ -template<> bool BOFS::isInitialized_; +template<> bool BOFS::isInitialized_; \ +template<> bool BOFS::useSaturatedTables_; DECLARE_INSTANCE(float) DECLARE_INSTANCE(double)