From 7b4894b60000fe6e17b41f692bfa9e83012fa477 Mon Sep 17 00:00:00 2001 From: Tor Harald Sandve Date: Wed, 22 Jan 2025 10:53:54 +0100 Subject: [PATCH] cleanup based on review --- opm/simulators/wells/WellGroupHelpers.cpp | 58 +++++++++++++++++------ opm/simulators/wells/WellGroupHelpers.hpp | 9 ++++ 2 files changed, 52 insertions(+), 15 deletions(-) diff --git a/opm/simulators/wells/WellGroupHelpers.cpp b/opm/simulators/wells/WellGroupHelpers.cpp index 3ea7428de..b0f20b846 100644 --- a/opm/simulators/wells/WellGroupHelpers.cpp +++ b/opm/simulators/wells/WellGroupHelpers.cpp @@ -98,21 +98,13 @@ namespace Opm { const auto& groupTmp = schedule.getGroup(groupName, reportStepIdx); const auto& gefac = groupTmp.getGroupEfficiencyFactor(); rate += gefac * sumWellPhaseRates(res_rates, groupTmp, schedule, wellState, reportStepIdx, phasePos, injector); - const auto& gsatprod = schedule[reportStepIdx].gsatprod.get(); - // only sum once - if (wellState.isRank0() && !injector && gsatprod.has(groupName)) { - const auto& gsatprod_rates = gsatprod.get(groupName); - const auto& pu = wellState.phaseUsage(); - using Rate = GSatProd::GSatProdGroup::Rate; - if (pu.phase_used[BlackoilPhases::Aqua] && pu.phase_pos[BlackoilPhases::Aqua] == phasePos) { - rate += gsatprod_rates.rate[Rate::Water]; - } - if (pu.phase_used[BlackoilPhases::Liquid] && pu.phase_pos[BlackoilPhases::Liquid] == phasePos) { - rate += gsatprod_rates.rate[Rate::Oil]; - } - if (pu.phase_used[BlackoilPhases::Vapour] && pu.phase_pos[BlackoilPhases::Vapour] == phasePos) { - rate += gsatprod_rates.rate[Rate::Gas]; - } + } + + // only sum satelite production once + if (wellState.isRank0() && !injector) { + const auto rateComp = selectRateComponent(wellState.phaseUsage(), phasePos); + if (rateComp.has_value()) { + rate += satelliteProduction(schedule[reportStepIdx], group.groups(), *rateComp); } } @@ -154,6 +146,42 @@ namespace Opm { return rate; } +template +Scalar WellGroupHelpers:: +satelliteProduction(const ScheduleState& sched, + const std::vector& groups, + const GSatProd::GSatProdGroup::Rate rateComp) +{ + auto gsatProdRate = Scalar{}; + const auto& gsatProd = sched.gsatprod(); + for (const auto& group : groups) { + if (! gsatProd.has(group)) { + continue; + } + gsatProdRate += gsatProd.get(group).rate[rateComp]; + } + return gsatProdRate; +} + +template +std::optional WellGroupHelpers:: +selectRateComponent(const PhaseUsage& pu, const int phasePos) +{ + using Rate = GSatProd::GSatProdGroup::Rate; + + for (const auto& [phase, rateComp] : std::array { + std::pair { BlackoilPhases::Aqua, Rate::Water }, + std::pair { BlackoilPhases::Liquid, Rate::Oil }, + std::pair { BlackoilPhases::Vapour, Rate::Gas } }) + { + if (pu.phase_used[phase] && (pu.phase_pos[phase] == phasePos)) { + return rateComp; + } + } + + return std::nullopt; +} + template void WellGroupHelpers:: setCmodeGroup(const Group& group, diff --git a/opm/simulators/wells/WellGroupHelpers.hpp b/opm/simulators/wells/WellGroupHelpers.hpp index 00db85713..62bd15b28 100644 --- a/opm/simulators/wells/WellGroupHelpers.hpp +++ b/opm/simulators/wells/WellGroupHelpers.hpp @@ -22,8 +22,10 @@ #define OPM_WELLGROUPHELPERS_HEADER_INCLUDED #include +#include #include #include +#include #include #include @@ -56,6 +58,13 @@ public: const int phasePos, const bool injector); + static Scalar satelliteProduction(const ScheduleState& sched, + const std::vector& groups, + const GSatProd::GSatProdGroup::Rate rateComp); + + static std::optional + selectRateComponent(const PhaseUsage& pu, const int phasePos); + static void setCmodeGroup(const Group& group, const Schedule& schedule, const SummaryState& summaryState,