mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Use SingleWellState for reservoir rates
This commit is contained in:
parent
755de65eb4
commit
8b652c821b
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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};
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user