Use SingleWellState for reservoir rates

This commit is contained in:
Joakim Hove 2021-08-06 10:45:13 +02:00
parent 755de65eb4
commit 8b652c821b
6 changed files with 13 additions and 38 deletions

View File

@ -27,6 +27,7 @@ SingleWellState::SingleWellState(bool is_producer, std::size_t num_phases, doubl
, well_potentials(num_phases)
, productivity_index(num_phases)
, surface_rates(num_phases)
, reservoir_rates(num_phases)
{}
@ -51,6 +52,7 @@ void SingleWellState::shut() {
this->thp = 0;
this->status = Well::Status::SHUT;
std::fill(this->surface_rates.begin(), this->surface_rates.end(), 0);
std::fill(this->reservoir_rates.begin(), this->reservoir_rates.end(), 0);
std::fill(this->productivity_index.begin(), this->productivity_index.end(), 0);
}

View File

@ -42,6 +42,7 @@ public:
std::vector<double> well_potentials;
std::vector<double> productivity_index;
std::vector<double> surface_rates;
std::vector<double> reservoir_rates;
SegmentState segments;
Events events;
Well::InjectorCMode injection_cmode{Well::InjectorCMode::CMODE_UNDEFINED};

View File

@ -99,7 +99,7 @@ namespace {
double factor = wellEcl.getEfficiencyFactor();
const auto& ws = wellState.well(well_index);
if (res_rates) {
const auto& well_rates = wellState.wellReservoirRates(well_index);
const auto& well_rates = ws.reservoir_rates;
if (injector)
rate += factor * well_rates[phasePos];
else

View File

@ -75,10 +75,7 @@ calculateReservoirRates(WellState& well_state) const
std::vector<double> voidage_rates(np, 0.0);
rateConverter_.calcReservoirVoidageRates(fipreg, pvtRegionIdx_, surface_rates, voidage_rates);
for (int p = 0; p < np; ++p) {
well_state.wellReservoirRates(index_of_well_)[p] = voidage_rates[p];
}
ws.reservoir_rates = voidage_rates;
}
@ -129,13 +126,13 @@ activeProductionConstraint(const WellState& well_state,
if (controls.hasControl(Well::ProducerCMode::RESV) && currentControl != Well::ProducerCMode::RESV) {
double current_rate = 0.0;
if (pu.phase_used[BlackoilPhases::Aqua])
current_rate -= well_state.wellReservoirRates(well_index)[pu.phase_pos[BlackoilPhases::Aqua]];
current_rate -= ws.reservoir_rates[pu.phase_pos[BlackoilPhases::Aqua]];
if (pu.phase_used[BlackoilPhases::Liquid])
current_rate -= well_state.wellReservoirRates(well_index)[pu.phase_pos[BlackoilPhases::Liquid]];
current_rate -= ws.reservoir_rates[pu.phase_pos[BlackoilPhases::Liquid]];
if (pu.phase_used[BlackoilPhases::Vapour])
current_rate -= well_state.wellReservoirRates(well_index)[pu.phase_pos[BlackoilPhases::Vapour]];
current_rate -= ws.reservoir_rates[pu.phase_pos[BlackoilPhases::Vapour]];
if (controls.prediction_mode && controls.resv_rate < current_rate)
return Well::ProducerCMode::RESV;
@ -229,13 +226,13 @@ activeInjectionConstraint(const WellState& well_state,
{
double current_rate = 0.0;
if( pu.phase_used[BlackoilPhases::Aqua] )
current_rate += well_state.wellReservoirRates(well_index)[ pu.phase_pos[BlackoilPhases::Aqua] ];
current_rate += ws.reservoir_rates[ pu.phase_pos[BlackoilPhases::Aqua] ];
if( pu.phase_used[BlackoilPhases::Liquid] )
current_rate += well_state.wellReservoirRates(well_index)[ pu.phase_pos[BlackoilPhases::Liquid] ];
current_rate += ws.reservoir_rates[ pu.phase_pos[BlackoilPhases::Liquid] ];
if( pu.phase_used[BlackoilPhases::Vapour] )
current_rate += well_state.wellReservoirRates(well_index)[ pu.phase_pos[BlackoilPhases::Vapour] ];
current_rate += ws.reservoir_rates[ pu.phase_pos[BlackoilPhases::Vapour] ];
if (controls.reservoir_rate < current_rate)
return Well::InjectorCMode::RESV;

View File

@ -244,7 +244,6 @@ void WellState::init(const std::vector<double>& cellPressures,
nperf += wpd.size();
}
well_reservoir_rates_.clear();
{
const auto& wg_events = schedule[report_step].wellgroup_events();
for (const auto& ecl_well : wells_ecl) {
@ -279,8 +278,6 @@ void WellState::init(const std::vector<double>& cellPressures,
}
perf_data.pressure[perf] = cellPressures[well_perf_data[w][perf].cell_index];
}
this->well_reservoir_rates_.add(wname, std::vector<double>(np, 0));
}
for (int w = 0; w < nw; ++w) {
@ -347,7 +344,7 @@ void WellState::init(const std::vector<double>& cellPressures,
}
new_well.surface_rates = prev_well.surface_rates;
wellReservoirRates(w) = prevState->wellReservoirRates(oldIndex);
new_well.reservoir_rates = prev_well.reservoir_rates;
new_well.well_potentials = prev_well.well_potentials;
// perfPhaseRates
@ -472,7 +469,7 @@ WellState::report(const int* globalCellIdxMap,
continue;
}
const auto& reservoir_rates = this->well_reservoir_rates_[well_index];
const auto& reservoir_rates = ws.reservoir_rates;
const auto& well_potentials = ws.well_potentials;
const auto& wpi = ws.productivity_index;
const auto& wv = ws.surface_rates;
@ -811,12 +808,6 @@ void WellState::shutWell(int well_index)
{
auto& ws = this->well(well_index);
ws.shut();
const int np = numPhases();
auto& resv = this->well_reservoir_rates_[well_index];
for (int p = 0; p < np; ++p) {
resv[p] = 0.0;
}
auto& perf_data = this->perfData(well_index);
auto& connpi = perf_data.prod_index;

View File

@ -149,18 +149,6 @@ public:
/// One rate pr well
double brineWellRate(const int w) const;
const WellContainer<std::vector<double>>& wellReservoirRates() const { return well_reservoir_rates_; }
std::vector<double>& wellReservoirRates(std::size_t well_index)
{
return well_reservoir_rates_[well_index];
}
const std::vector<double>& wellReservoirRates(std::size_t well_index) const
{
return well_reservoir_rates_[well_index];
}
template<class Comm>
void communicateGroupRates(const Comm& comm);
@ -319,10 +307,6 @@ private:
// not.
std::map<std::string, std::pair<bool, std::vector<double>>> well_rates;
// phase rates under reservoir condition for wells
// or voidage phase rates
WellContainer<std::vector<double>> well_reservoir_rates_;
data::Segment
reportSegmentResults(const PhaseUsage& pu,
const int well_id,