add gsatprod to group rates

This commit is contained in:
Tor Harald Sandve
2025-01-17 12:34:47 +01:00
parent fef6cfcf38
commit f9d6644197
4 changed files with 29 additions and 0 deletions

View File

@@ -119,6 +119,12 @@ void GlobalWellInfo<Scalar>::clear()
this->m_efficiency_scaling_factors.assign(this->name_map.size(), 1.0);
}
template<class Scalar>
bool GlobalWellInfo<Scalar>::isRank0() const
{
return is_rank0_;
}
template<class Scalar>
Scalar GlobalWellInfo<Scalar>::
efficiency_scaling_factor(const std::string& wname) const

View File

@@ -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<std::size_t> local_map; // local_index -> global_index
@@ -89,6 +91,7 @@ private:
std::vector<int> m_in_producing_group; // global_index -> int/bool
std::vector<int> m_is_open; // global_index -> int/bool
std::vector<Scalar> m_efficiency_scaling_factors; // global_index --> double
bool is_rank0_{true};
};

View File

@@ -24,6 +24,7 @@
#include <opm/input/eclipse/Schedule/Schedule.hpp>
#include <opm/input/eclipse/Schedule/Group/GConSump.hpp>
#include <opm/input/eclipse/Schedule/Group/GConSale.hpp>
#include <opm/input/eclipse/Schedule/Group/GSatProd.hpp>
#include <opm/input/eclipse/Schedule/Group/GPMaint.hpp>
#include <opm/input/eclipse/Schedule/Group/Group.hpp>
#include <opm/input/eclipse/Schedule/Group/GuideRateConfig.hpp>
@@ -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()) {

View File

@@ -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);