diff --git a/opm/material/fluidmatrixinteractions/EclDefaultMaterial.hpp b/opm/material/fluidmatrixinteractions/EclDefaultMaterial.hpp index bb8bd63bc..4f5a15743 100644 --- a/opm/material/fluidmatrixinteractions/EclDefaultMaterial.hpp +++ b/opm/material/fluidmatrixinteractions/EclDefaultMaterial.hpp @@ -421,8 +421,9 @@ public: * error. (But not calling it will still work.) */ template - static void updateHysteresis(Params& params, const FluidState& fluidState) + static bool updateHysteresis(Params& params, const FluidState& fluidState) { + bool changed = false; const Scalar Swco = params.Swl(); const Scalar Sw = clampSaturation(fluidState, waterPhaseIdx); @@ -439,11 +440,11 @@ public: // // Though be aware that from a physical perspective this is definitively // incorrect! - params.oilWaterParams().update(/*pcSw=*/ Sw, //1.0 - So, (Effect is significant vs benchmark.) + changed = changed || params.oilWaterParams().update(/*pcSw=*/ Sw, //1.0 - So, (Effect is significant vs benchmark.) /*krwSw=*/ 1.0 - So, /*krnSw=*/ 1.0 - So); - params.gasOilParams().update(/*pcSw=*/ 1.0 - Swco - Sg, + changed = changed || params.gasOilParams().update(/*pcSw=*/ 1.0 - Swco - Sg, /*krwSw=*/ 1.0 - Swco - Sg, /*krnSw=*/ 1.0 - Swco - Sg); } @@ -451,14 +452,15 @@ public: const Scalar Sw_ow = Sg + std::max(Swco, Sw); const Scalar So_go = 1.0 - Sw_ow; - params.oilWaterParams().update(/*pcSw=*/ Sw, + changed = changed || params.oilWaterParams().update(/*pcSw=*/ Sw, /*krwSw=*/ 1 - Sg, /*krnSw=*/ Sw_ow); - params.gasOilParams().update(/*pcSw=*/ 1.0 - Swco - Sg, - /*krwSw=*/ So_go, - /*krnSw=*/ 1.0 - Swco - Sg); + changed = changed || params.gasOilParams().update(/*pcSw=*/ 1.0 - Swco - Sg, + /*krwSw=*/ So_go, + /*krnSw=*/ 1.0 - Swco - Sg); } + return changed; } template diff --git a/opm/material/fluidmatrixinteractions/EclHysteresisTwoPhaseLawParams.hpp b/opm/material/fluidmatrixinteractions/EclHysteresisTwoPhaseLawParams.hpp index 7066a8a0a..6177be5dc 100644 --- a/opm/material/fluidmatrixinteractions/EclHysteresisTwoPhaseLawParams.hpp +++ b/opm/material/fluidmatrixinteractions/EclHysteresisTwoPhaseLawParams.hpp @@ -374,7 +374,7 @@ public: * This updates the scanning curves and the imbibition<->drainage reversal points as * appropriate. */ - void update(Scalar pcSw, Scalar /* krwSw */, Scalar krnSw) + bool update(Scalar pcSw, Scalar /* krwSw */, Scalar krnSw) { bool updateParams = false; @@ -412,6 +412,8 @@ public: if (updateParams) updateDynamicParams_(); + + return updateParams; } template diff --git a/opm/material/fluidmatrixinteractions/EclMaterialLawManager.hpp b/opm/material/fluidmatrixinteractions/EclMaterialLawManager.hpp index 82e22148f..5a36f8c2b 100644 --- a/opm/material/fluidmatrixinteractions/EclMaterialLawManager.hpp +++ b/opm/material/fluidmatrixinteractions/EclMaterialLawManager.hpp @@ -314,20 +314,20 @@ public: { return imbnumRegionArray_[elemIdx]; } template - void updateHysteresis(const FluidState& fluidState, unsigned elemIdx) + bool updateHysteresis(const FluidState& fluidState, unsigned elemIdx) { if (!enableHysteresis()) - return; - - MaterialLaw::updateHysteresis(materialLawParams(elemIdx), fluidState); + return false; + bool changed = MaterialLaw::updateHysteresis(materialLawParams(elemIdx), fluidState); if (hasDirectionalRelperms() || hasDirectionalImbnum()) { using Dir = FaceDir::DirEnum; constexpr int ndim = 3; Dir facedirs[ndim] = {Dir::XPlus, Dir::YPlus, Dir::ZPlus}; for (int i = 0; i - static void updateHysteresis(Params& params, const FluidState& fluidState) + static bool updateHysteresis(Params& params, const FluidState& fluidState) { switch (params.approach()) { case EclMultiplexerApproach::Stone1: - Stone1Material::updateHysteresis(params.template getRealParams(), + return Stone1Material::updateHysteresis(params.template getRealParams(), fluidState); break; case EclMultiplexerApproach::Stone2: - Stone2Material::updateHysteresis(params.template getRealParams(), + return Stone2Material::updateHysteresis(params.template getRealParams(), fluidState); break; case EclMultiplexerApproach::Default: - DefaultMaterial::updateHysteresis(params.template getRealParams(), + return DefaultMaterial::updateHysteresis(params.template getRealParams(), fluidState); break; case EclMultiplexerApproach::TwoPhase: - TwoPhaseMaterial::updateHysteresis(params.template getRealParams(), + return TwoPhaseMaterial::updateHysteresis(params.template getRealParams(), fluidState); break; case EclMultiplexerApproach::OnePhase: + return false; break; } } diff --git a/opm/material/fluidmatrixinteractions/EclStone1Material.hpp b/opm/material/fluidmatrixinteractions/EclStone1Material.hpp index 074409528..ee5043d44 100644 --- a/opm/material/fluidmatrixinteractions/EclStone1Material.hpp +++ b/opm/material/fluidmatrixinteractions/EclStone1Material.hpp @@ -417,16 +417,17 @@ public: * error. (But not calling it will still work.) */ template - static void updateHysteresis(Params& params, const FluidState& fluidState) + static bool updateHysteresis(Params& params, const FluidState& fluidState) { const Scalar Swco = params.Swl(); const Scalar Sw = scalarValue(fluidState.saturation(waterPhaseIdx)); const Scalar Sg = scalarValue(fluidState.saturation(gasPhaseIdx)); - - params.oilWaterParams().update(/*pcSw=*/Sw, /*krwSw=*/Sw, /*krnSw=*/Sw); - params.gasOilParams().update(/*pcSw=*/ 1.0 - Swco - Sg, - /*krwSw=*/ 1.0 - Swco - Sg, - /*krnSw=*/ 1.0 - Swco - Sg); + bool changed = false; + changed = changed || params.oilWaterParams().update(/*pcSw=*/Sw, /*krwSw=*/Sw, /*krnSw=*/Sw); + changed = changed || params.gasOilParams().update(/*pcSw=*/ 1.0 - Swco - Sg, + /*krwSw=*/ 1.0 - Swco - Sg, + /*krnSw=*/ 1.0 - Swco - Sg); + return changed; } }; diff --git a/opm/material/fluidmatrixinteractions/EclStone2Material.hpp b/opm/material/fluidmatrixinteractions/EclStone2Material.hpp index a9e807ed6..e3a1743c0 100644 --- a/opm/material/fluidmatrixinteractions/EclStone2Material.hpp +++ b/opm/material/fluidmatrixinteractions/EclStone2Material.hpp @@ -401,16 +401,16 @@ public: * error. (But not calling it will still work.) */ template - static void updateHysteresis(Params& params, const FluidState& fluidState) + static bool updateHysteresis(Params& params, const FluidState& fluidState) { const Scalar Swco = params.Swl(); const Scalar Sw = scalarValue(fluidState.saturation(waterPhaseIdx)); const Scalar Sg = scalarValue(fluidState.saturation(gasPhaseIdx)); - - params.oilWaterParams().update(/*pcSw=*/Sw, /*krwSw=*/Sw, /*krnSw=*/Sw); - params.gasOilParams().update(/*pcSw=*/ 1.0 - Swco - Sg, - /*krwSw=*/ 1.0 - Swco - Sg, - /*krnSw=*/ 1.0 - Swco - Sg); + bool changed = false; + changed = changed || params.oilWaterParams().update(/*pcSw=*/Sw, /*krwSw=*/Sw, /*krnSw=*/Sw); + changed = changed || params.gasOilParams().update(/*pcSw=*/ 1.0 - Swco - Sg, + /*krwSw=*/ 1.0 - Swco - Sg, + /*krnSw=*/ 1.0 - Swco - Sg); } }; diff --git a/opm/material/fluidmatrixinteractions/EclTwoPhaseMaterial.hpp b/opm/material/fluidmatrixinteractions/EclTwoPhaseMaterial.hpp index 6c23ac9b5..eda11e460 100644 --- a/opm/material/fluidmatrixinteractions/EclTwoPhaseMaterial.hpp +++ b/opm/material/fluidmatrixinteractions/EclTwoPhaseMaterial.hpp @@ -390,27 +390,27 @@ public: * error. (But not calling it will still work.) */ template - static void updateHysteresis(Params& params, const FluidState& fluidState) + static bool updateHysteresis(Params& params, const FluidState& fluidState) { switch (params.approach()) { case EclTwoPhaseApproach::GasOil: { Scalar So = scalarValue(fluidState.saturation(oilPhaseIdx)); - params.gasOilParams().update(/*pcSw=*/So, /*krwSw=*/So, /*krnSw=*/So); + return params.gasOilParams().update(/*pcSw=*/So, /*krwSw=*/So, /*krnSw=*/So); break; } case EclTwoPhaseApproach::OilWater: { Scalar Sw = scalarValue(fluidState.saturation(waterPhaseIdx)); - params.oilWaterParams().update(/*pcSw=*/Sw, /*krwSw=*/Sw, /*krnSw=*/Sw); + return params.oilWaterParams().update(/*pcSw=*/Sw, /*krwSw=*/Sw, /*krnSw=*/Sw); break; } case EclTwoPhaseApproach::GasWater: { Scalar Sw = scalarValue(fluidState.saturation(waterPhaseIdx)); - params.gasWaterParams().update(/*pcSw=*/1.0, /*krwSw=*/0.0, /*krnSw=*/Sw); + return params.gasWaterParams().update(/*pcSw=*/1.0, /*krwSw=*/0.0, /*krnSw=*/Sw); break; } }