mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-14 02:13:27 -06:00
moving the inj_multiplier to BlackoilWellModelGeneric
to handle the situation that a well can be `SHUT` in the Schedule. If stored in PerfData, when a well is `SHUT`, the inforamtion related to WINJMULT will be discarded. Before we want to change how the `PerfData` works, storing `inj_multiplier` in BlackoilWellModelGeneric is the viable approach.
This commit is contained in:
parent
b50c404247
commit
cacec2739c
@ -1411,16 +1411,18 @@ void BlackoilWellModelGeneric::initInjMult() {
|
||||
if (well->isInjector() && well->wellEcl().getInjMultMode() != Well::InjMultMode::NONE) {
|
||||
const auto& ws = this->wellState().well(well->indexOfWell());
|
||||
const auto& perf_data = ws.perf_data;
|
||||
well->initInjMult(perf_data.inj_multiplier);
|
||||
if ((this->prev_inj_multipliers_.count(well->name())) == 0 ) {
|
||||
this->prev_inj_multipliers_[well->name()] = std::vector<double>(perf_data.size(), 1.0);
|
||||
}
|
||||
well->initInjMult(this->prev_inj_multipliers_.at(well->name()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BlackoilWellModelGeneric::updateInjMult(DeferredLogger& deferred_logger) {
|
||||
for (const auto& well : this->well_container_generic_) {
|
||||
if (well->wellEcl().getInjMultMode() != Well::InjMultMode::NONE && well->isInjector()) {
|
||||
auto& perf_data = this->wellState().well(well->indexOfWell()).perf_data;
|
||||
well->updateInjMult(perf_data.inj_multiplier, deferred_logger);
|
||||
if (well->isInjector() && well->wellEcl().getInjMultMode() != Well::InjMultMode::NONE) {
|
||||
well->updateInjMult(this->prev_inj_multipliers_[well->name()], deferred_logger);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -192,6 +192,7 @@ public:
|
||||
serializer(closed_this_step_);
|
||||
serializer(guideRate_);
|
||||
serializer(node_pressures_);
|
||||
serializer(prev_inj_multipliers_);
|
||||
serializer(active_wgstate_);
|
||||
serializer(last_valid_wgstate_);
|
||||
serializer(nupcol_wgstate_);
|
||||
@ -208,6 +209,7 @@ public:
|
||||
this->local_shut_wells_ == rhs.local_shut_wells_ &&
|
||||
this->closed_this_step_ == rhs.closed_this_step_ &&
|
||||
this->node_pressures_ == rhs.node_pressures_ &&
|
||||
this->prev_inj_multipliers_ == rhs.prev_inj_multipliers_ &&
|
||||
this->active_wgstate_ == rhs.active_wgstate_ &&
|
||||
this->last_valid_wgstate_ == rhs.last_valid_wgstate_ &&
|
||||
this->nupcol_wgstate_ == rhs.nupcol_wgstate_ &&
|
||||
@ -433,6 +435,9 @@ protected:
|
||||
std::unique_ptr<VFPProperties> vfp_properties_{};
|
||||
std::map<std::string, double> node_pressures_; // Storing network pressures for output.
|
||||
|
||||
// previous injection multiplier, it is used in the injection multiplier calculation for WINJMULT keyword
|
||||
std::unordered_map<std::string, std::vector<double>> prev_inj_multipliers_;
|
||||
|
||||
/*
|
||||
The various wellState members should be accessed and modified
|
||||
through the accessor functions wellState(), prevWellState(),
|
||||
|
@ -43,7 +43,6 @@ PerfData::PerfData(std::size_t num_perf, double pressure_first_connection_, bool
|
||||
, ecl_index(num_perf)
|
||||
{
|
||||
if (injector) {
|
||||
this->inj_multiplier.resize(num_perf, 1.0);
|
||||
this->water_throughput.resize(num_perf);
|
||||
this->skin_pressure.resize(num_perf);
|
||||
this->water_velocity.resize(num_perf);
|
||||
@ -95,7 +94,6 @@ bool PerfData::try_assign(const PerfData& other) {
|
||||
this->solvent_rates = other.solvent_rates;
|
||||
this->polymer_rates = other.polymer_rates;
|
||||
this->brine_rates = other.brine_rates;
|
||||
this->inj_multiplier = other.inj_multiplier;
|
||||
this->water_throughput = other.water_throughput;
|
||||
this->skin_pressure = other.skin_pressure;
|
||||
this->water_velocity = other.water_velocity;
|
||||
@ -119,7 +117,6 @@ bool PerfData::operator==(const PerfData& rhs) const
|
||||
this->connection_transmissibility_factor == rhs.connection_transmissibility_factor &&
|
||||
this->satnum_id == rhs.satnum_id &&
|
||||
this->ecl_index == rhs.ecl_index &&
|
||||
this->inj_multiplier == rhs.inj_multiplier &&
|
||||
this->water_throughput == rhs.water_throughput &&
|
||||
this->skin_pressure == rhs.skin_pressure &&
|
||||
this->water_velocity == rhs.water_velocity;
|
||||
|
@ -57,7 +57,6 @@ public:
|
||||
serializer(connection_transmissibility_factor);
|
||||
serializer(satnum_id);
|
||||
serializer(ecl_index);
|
||||
serializer(inj_multiplier);
|
||||
serializer(water_throughput);
|
||||
serializer(skin_pressure);
|
||||
serializer(water_velocity);
|
||||
@ -79,9 +78,6 @@ public:
|
||||
std::vector<double> connection_transmissibility_factor;
|
||||
std::vector<int> satnum_id;
|
||||
std::vector<std::size_t> ecl_index;
|
||||
// the injection multiplier due to WINJMULT keyword
|
||||
// it only applies to injectors
|
||||
std::vector<double> inj_multiplier;
|
||||
|
||||
// The water_throughput, skin_pressure and water_velocity variables are only
|
||||
// used for injectors to check the injectivity.
|
||||
|
@ -177,7 +177,7 @@ add_test_compare_parallel_simulation(CASENAME winjmult_msw
|
||||
FILENAME WINJMULT_MSW
|
||||
SIMULATOR flow
|
||||
ABS_TOL ${abs_tol}
|
||||
REL_TOL 0.21
|
||||
REL_TOL 0.12
|
||||
DIR winjmult
|
||||
TEST_ARGS --enable-tuning=true)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user