From 1ec3a6065ab8dc2bee63eb6cfc8082dc96f2851f Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Tue, 1 Sep 2015 13:18:44 +0200 Subject: [PATCH] SaturationPropsFromDeck: fix some array index screw-ups in the twophase case I don't think the code gets more beatiful because of this, but it seems like it does not crash anymore. --- .../props/satfunc/SaturationPropsFromDeck.cpp | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/opm/core/props/satfunc/SaturationPropsFromDeck.cpp b/opm/core/props/satfunc/SaturationPropsFromDeck.cpp index f0813a3d1..8bc8bf64e 100644 --- a/opm/core/props/satfunc/SaturationPropsFromDeck.cpp +++ b/opm/core/props/satfunc/SaturationPropsFromDeck.cpp @@ -200,23 +200,38 @@ namespace Opm double* smin, double* smax) const { - const int np = BlackoilPhases::MaxNumPhases; + int wpos = phaseUsage_.phase_pos[BlackoilPhases::Aqua]; + int gpos = phaseUsage_.phase_pos[BlackoilPhases::Vapour]; + int opos = phaseUsage_.phase_pos[BlackoilPhases::Liquid]; + + const int np = phaseUsage_.num_phases; for (int i = 0; i < n; ++i) { const auto& scaledDrainageInfo = materialLawManager_->oilWaterScaledEpsInfoDrainage(cells[i]); - smin[np*i + BlackoilPhases::Aqua] = scaledDrainageInfo.Swl; - smax[np*i + BlackoilPhases::Aqua] = scaledDrainageInfo.Swu; - smin[np*i + BlackoilPhases::Vapour] = scaledDrainageInfo.Sgl; - smax[np*i + BlackoilPhases::Vapour] = scaledDrainageInfo.Sgu; + if (phaseUsage_.phase_used[BlackoilPhases::Aqua]) { + smin[np*i + wpos] = scaledDrainageInfo.Swl; + smax[np*i + wpos] = scaledDrainageInfo.Swu; + } - smin[np*i + BlackoilPhases::Liquid] = 1.0; - smax[np*i + BlackoilPhases::Liquid] = 1.0; - smin[np*i + BlackoilPhases::Liquid] -= smax[np*i + BlackoilPhases::Aqua]; - smax[np*i + BlackoilPhases::Liquid] -= smin[np*i + BlackoilPhases::Aqua]; - smin[np*i + BlackoilPhases::Liquid] -= smax[np*i + BlackoilPhases::Vapour]; - smax[np*i + BlackoilPhases::Liquid] -= smin[np*i + BlackoilPhases::Vapour]; - smin[np*i + BlackoilPhases::Liquid] = std::max(0.0, smin[np*i + BlackoilPhases::Liquid]); + if (phaseUsage_.phase_used[BlackoilPhases::Vapour]) { + smin[np*i + gpos] = scaledDrainageInfo.Sgl; + smax[np*i + gpos] = scaledDrainageInfo.Sgu; + } + + if (phaseUsage_.phase_used[BlackoilPhases::Liquid]) { + smin[np*i + opos] = 1.0; + smax[np*i + opos] = 1.0; + if (phaseUsage_.phase_used[BlackoilPhases::Aqua]) { + smin[np*i + opos] -= smax[np*i + wpos]; + smax[np*i + opos] -= smin[np*i + wpos]; + } + if (phaseUsage_.phase_used[BlackoilPhases::Vapour]) { + smin[np*i + opos] -= smax[np*i + gpos]; + smax[np*i + opos] -= smin[np*i + gpos]; + } + smin[np*i + opos] = std::max(0.0, smin[np*i + opos]); + } } }