diff --git a/opm/simulators/wells/BlackoilWellModel_impl.hpp b/opm/simulators/wells/BlackoilWellModel_impl.hpp index 02fac730e..54900efe4 100644 --- a/opm/simulators/wells/BlackoilWellModel_impl.hpp +++ b/opm/simulators/wells/BlackoilWellModel_impl.hpp @@ -762,7 +762,7 @@ namespace Opm { continue; } else { // stopped wells are added to the container but marked as stopped - well_state_.thp()[w] = 0.; + well_state_.stopWell(w); wellIsStopped = true; } } @@ -809,7 +809,7 @@ namespace Opm { } if (well_status == Well::Status::STOP) { - well_state_.thp()[w] = 0.; + well_state_.stopWell(w); wellIsStopped = true; } diff --git a/opm/simulators/wells/WellState.hpp b/opm/simulators/wells/WellState.hpp index 4515051b0..2897e8a1d 100644 --- a/opm/simulators/wells/WellState.hpp +++ b/opm/simulators/wells/WellState.hpp @@ -69,7 +69,7 @@ namespace Opm // const int np = wells->number_of_phases; const int np = pu.num_phases; np_ = np; - open_for_output_.assign(nw, true); + status_.assign(nw, Well::Status::OPEN); bhp_.resize(nw, 0.0); thp_.resize(nw, 0.0); temperature_.resize(nw, 273.15 + 15.56); // standard condition temperature @@ -219,9 +219,12 @@ namespace Opm return np_; } + void openWell(int well_index) { + this->status_[well_index] = Well::Status::OPEN; + } virtual void shutWell(int well_index) { - this->open_for_output_[well_index] = false; + this->status_[well_index] = Well::Status::SHUT; this->thp_[well_index] = 0; this->bhp_[well_index] = 0; const int np = numPhases(); @@ -229,6 +232,10 @@ namespace Opm this->wellrates_[np * well_index + p] = 0; } + virtual void stopWell(int well_index) { + this->status_[well_index] = Well::Status::STOP; + this->thp_[well_index] = 0; + } virtual data::Wells report(const PhaseUsage& pu, const int* globalCellIdxMap) const { @@ -237,7 +244,7 @@ namespace Opm data::Wells dw; for( const auto& itr : this->wellMap_ ) { const auto well_index = itr.second[ 0 ]; - if (!this->open_for_output_[well_index]) + if (this->status_[well_index] != Well::Status::OPEN) continue; const auto& pwinfo = *parallel_well_info_[well_index]; @@ -314,7 +321,7 @@ namespace Opm std::vector perfpress_; int np_; protected: - std::vector open_for_output_; + std::vector status_; private: WellMapType wellMap_; diff --git a/opm/simulators/wells/WellStateFullyImplicitBlackoil.hpp b/opm/simulators/wells/WellStateFullyImplicitBlackoil.hpp index 36ef1d02b..21142a44e 100644 --- a/opm/simulators/wells/WellStateFullyImplicitBlackoil.hpp +++ b/opm/simulators/wells/WellStateFullyImplicitBlackoil.hpp @@ -559,7 +559,7 @@ namespace Opm for( const auto& wt : this->wellMap() ) { const auto w = wt.second[ 0 ]; const auto& pwinfo = *parallel_well_info_[w]; - if (!this->open_for_output_[w] || !pwinfo.isOwner()) + if ((this->status_[w] != Well::Status::OPEN) || !pwinfo.isOwner()) continue; auto& well = res.at( wt.first ); @@ -1075,6 +1075,10 @@ namespace Opm this->well_reservoir_rates_[np * well_index + p] = 0; } + virtual void stopWell(int well_index) override { + WellState::stopWell(well_index); + } + template void communicateGroupRates(const Comm& comm) { @@ -1178,7 +1182,7 @@ namespace Opm if (it != end) { // ... set the GRUP/not GRUP states. const int well_index = it->second[0]; - if (!this->open_for_output_[well_index]) { + if (this->status_[well_index] != Well::Status::OPEN) { // Well is shut. if (well.isInjector()) { globalIsInjectionGrup_[global_well_index] = 0;