From 575907941d67e77b87163ff0e831ae68b386aae3 Mon Sep 17 00:00:00 2001 From: Kai Bao Date: Tue, 27 Nov 2018 14:38:50 +0100 Subject: [PATCH] removing some repeated code in phaseUsageFromDeck --- opm/core/props/phaseUsageFromDeck.hpp | 107 +++++--------------------- 1 file changed, 19 insertions(+), 88 deletions(-) diff --git a/opm/core/props/phaseUsageFromDeck.hpp b/opm/core/props/phaseUsageFromDeck.hpp index 1b2fb4f6f..de171b68d 100644 --- a/opm/core/props/phaseUsageFromDeck.hpp +++ b/opm/core/props/phaseUsageFromDeck.hpp @@ -31,19 +31,15 @@ namespace Opm { - - /// Looks at presence of WATER, OIL and GAS keywords in state object - /// to determine active phases. - inline PhaseUsage phaseUsageFromDeck(const Opm::EclipseState& eclipseState) - { + /// Determine the active phases + inline PhaseUsage phaseUsage(const Phases& phases) { PhaseUsage pu; std::fill(pu.phase_used, pu.phase_used + BlackoilPhases::MaxNumPhases + BlackoilPhases::NumCryptoPhases, 0); - const auto& phase = eclipseState.runspec().phases(); // Discover phase usage. - pu.phase_used[BlackoilPhases::Aqua] = phase.active(Phase::WATER); - pu.phase_used[BlackoilPhases::Liquid] = phase.active(Phase::OIL); - pu.phase_used[BlackoilPhases::Vapour] = phase.active(Phase::GAS); + pu.phase_used[BlackoilPhases::Aqua] = phases.active(Phase::WATER); + pu.phase_used[BlackoilPhases::Liquid] = phases.active(Phase::OIL); + pu.phase_used[BlackoilPhases::Vapour] = phases.active(Phase::GAS); pu.num_phases = 0; int numActivePhases = 0; @@ -70,7 +66,7 @@ namespace Opm } // Add solvent info - pu.has_solvent = phase.active(Phase::SOLVENT); + pu.has_solvent = phases.active(Phase::SOLVENT); if (pu.has_solvent) { // this is quite a hack: even though solvent is not considered as in // MaxNumPhases and pu.num_phases because this would break a lot of @@ -84,7 +80,7 @@ namespace Opm pu.phase_pos[BlackoilPhases::Solvent] = -1; // Add polymer info - pu.has_polymer = phase.active(Phase::POLYMER); + pu.has_polymer = phases.active(Phase::POLYMER); if (pu.has_polymer) { // this is quite a hack: even though polymer is not considered as in // MaxNumPhases and pu.num_phases because this would break a lot of @@ -98,7 +94,7 @@ namespace Opm pu.phase_pos[BlackoilPhases::Polymer] = -1; // Add energy info - pu.has_energy = phase.active(Phase::ENERGY); + pu.has_energy = phases.active(Phase::ENERGY); if (pu.has_energy) { // this is quite a hack: even though energy is not considered as in // MaxNumPhases and pu.num_phases because this would break a lot of @@ -114,88 +110,23 @@ namespace Opm return pu; } + /// Looks at presence of WATER, OIL and GAS keywords in state object + /// to determine active phases. + inline PhaseUsage phaseUsageFromDeck(const Opm::EclipseState& eclipseState) + { + const auto& phases = eclipseState.runspec().phases(); + + return phaseUsage(phases); + } + /// Looks at presence of WATER, OIL and GAS keywords in deck /// to determine active phases. inline PhaseUsage phaseUsageFromDeck(const Opm::Deck& deck) { - PhaseUsage pu; - std::fill(pu.phase_used, pu.phase_used + BlackoilPhases::MaxNumPhases + BlackoilPhases::NumCryptoPhases, 0); - Runspec runspec( deck ); - const auto& phase = runspec.phases(); + const auto& phases = runspec.phases(); - // Discover phase usage. - pu.phase_used[BlackoilPhases::Aqua] = phase.active(Phase::WATER); - pu.phase_used[BlackoilPhases::Liquid] = phase.active(Phase::OIL); - pu.phase_used[BlackoilPhases::Vapour] = phase.active(Phase::GAS); - - pu.num_phases = 0; - int numActivePhases = 0; - for (int phaseIdx = 0; phaseIdx < BlackoilPhases::MaxNumPhases; ++phaseIdx) { - if (!pu.phase_used[phaseIdx]) { - pu.phase_pos[phaseIdx] = -1; - } - else { - pu.phase_pos[phaseIdx] = numActivePhases; - ++ numActivePhases; - pu.num_phases = numActivePhases; - } - } - - // Only 2 or 3 phase systems handled. - if (pu.num_phases < 2 || pu.num_phases > 3) { - OPM_THROW(std::runtime_error, "Cannot handle cases with " << pu.num_phases << " phases."); - } - - // We need oil systems, since we do not support the keywords needed for - // water-gas systems. - if (!pu.phase_used[BlackoilPhases::Liquid]) { - OPM_THROW(std::runtime_error, "Cannot handle cases with no OIL, i.e. water-gas systems."); - } - - // Add solvent info - pu.has_solvent = phase.active(Phase::SOLVENT); - if (pu.has_solvent) { - // this is quite a hack: even though solvent is not considered as in - // MaxNumPhases and pu.num_phases because this would break a lot of - // assumptions in old code, it is nevertheless an index to be translated - // to. solvent and solvent are even larger hacks because not even this can be - // done for them. - pu.phase_pos[BlackoilPhases::Solvent] = numActivePhases; - ++ numActivePhases; - } - else - pu.phase_pos[BlackoilPhases::Solvent] = -1; - - // Add polymer info - pu.has_polymer = phase.active(Phase::POLYMER); - if (pu.has_polymer) { - // this is quite a hack: even though polymer is not considered as in - // MaxNumPhases and pu.num_phases because this would break a lot of - // assumptions in old code, it is nevertheless an index to be translated - // to. polymer and solvent are even larger hacks because not even this can be - // done for them. - pu.phase_pos[BlackoilPhases::Polymer] = numActivePhases; - ++ numActivePhases; - } - else - pu.phase_pos[BlackoilPhases::Polymer] = -1; - - // Add energy info - pu.has_energy = phase.active(Phase::ENERGY); - if (pu.has_energy) { - // this is quite a hack: even though energy is not considered as in - // MaxNumPhases and pu.num_phases because this would break a lot of - // assumptions in old code, it is nevertheless an index to be translated - // to. polymer and solvent are even larger hacks because not even this can be - // done for them. - pu.phase_pos[BlackoilPhases::Energy] = numActivePhases; - ++ numActivePhases; - } - else - pu.phase_pos[BlackoilPhases::Energy] = -1; - - return pu; + return phaseUsage(phases); } }