From f9d66441975b4343e89c5253efa008ba13a40294 Mon Sep 17 00:00:00 2001 From: Tor Harald Sandve Date: Fri, 17 Jan 2025 12:34:47 +0100 Subject: [PATCH] add gsatprod to group rates --- opm/simulators/wells/GlobalWellInfo.cpp | 6 ++++++ opm/simulators/wells/GlobalWellInfo.hpp | 3 +++ opm/simulators/wells/WellGroupHelpers.cpp | 16 ++++++++++++++++ opm/simulators/wells/WellState.hpp | 4 ++++ 4 files changed, 29 insertions(+) diff --git a/opm/simulators/wells/GlobalWellInfo.cpp b/opm/simulators/wells/GlobalWellInfo.cpp index 294a4d117..0509c7fa4 100644 --- a/opm/simulators/wells/GlobalWellInfo.cpp +++ b/opm/simulators/wells/GlobalWellInfo.cpp @@ -119,6 +119,12 @@ void GlobalWellInfo::clear() this->m_efficiency_scaling_factors.assign(this->name_map.size(), 1.0); } +template +bool GlobalWellInfo::isRank0() const +{ + return is_rank0_; +} + template Scalar GlobalWellInfo:: efficiency_scaling_factor(const std::string& wname) const diff --git a/opm/simulators/wells/GlobalWellInfo.hpp b/opm/simulators/wells/GlobalWellInfo.hpp index 03c9152cb..c941e2969 100644 --- a/opm/simulators/wells/GlobalWellInfo.hpp +++ b/opm/simulators/wells/GlobalWellInfo.hpp @@ -65,6 +65,7 @@ public: comm.sum( this->m_in_producing_group.data(), size); comm.sum( this->m_is_open.data(), size); comm.min( this->m_efficiency_scaling_factors.data(), size); + is_rank0_ = (comm.rank() == 0); } @@ -80,6 +81,7 @@ public: void update_efficiency_scaling_factor(std::size_t well_index, const Scalar efficiency_scaling_factor); Scalar efficiency_scaling_factor(const std::string& wname) const; void clear(); + bool isRank0() const; private: std::vector local_map; // local_index -> global_index @@ -89,6 +91,7 @@ private: std::vector m_in_producing_group; // global_index -> int/bool std::vector m_is_open; // global_index -> int/bool std::vector m_efficiency_scaling_factors; // global_index --> double + bool is_rank0_{true}; }; diff --git a/opm/simulators/wells/WellGroupHelpers.cpp b/opm/simulators/wells/WellGroupHelpers.cpp index e54bb5783..c313ca76e 100644 --- a/opm/simulators/wells/WellGroupHelpers.cpp +++ b/opm/simulators/wells/WellGroupHelpers.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -97,6 +98,21 @@ 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(); + if (pu.phase_used[BlackoilPhases::Aqua] && pu.phase_pos[BlackoilPhases::Aqua] == phasePos) { + rate += gsatprod_rates.water_rate; + } + if (pu.phase_used[BlackoilPhases::Liquid] && pu.phase_pos[BlackoilPhases::Liquid] == phasePos) { + rate += gsatprod_rates.oil_rate; + } + if (pu.phase_used[BlackoilPhases::Vapour] && pu.phase_pos[BlackoilPhases::Vapour] == phasePos) { + rate += gsatprod_rates.gas_rate; + } + } } for (const std::string& wellName : group.wells()) { diff --git a/opm/simulators/wells/WellState.hpp b/opm/simulators/wells/WellState.hpp index fb5e4d063..a73925d28 100644 --- a/opm/simulators/wells/WellState.hpp +++ b/opm/simulators/wells/WellState.hpp @@ -260,6 +260,10 @@ public: bool wellIsOwned(const std::string& wellName) const; + bool isRank0() const { + return this->global_well_info.value().isRank0(); + } + void updateStatus(int well_index, WellStatus status); void openWell(int well_index);