diff --git a/opm/simulators/wells/MultisegmentWell_impl.hpp b/opm/simulators/wells/MultisegmentWell_impl.hpp index a4f8c71f04..bc5a7a6cac 100644 --- a/opm/simulators/wells/MultisegmentWell_impl.hpp +++ b/opm/simulators/wells/MultisegmentWell_impl.hpp @@ -569,8 +569,8 @@ namespace Opm const double dt = simulator.timeStepSize(); // solve equations bool converged = false; - if (this->well_ecl_.isProducer() && this->wellHasTHPConstraints(summary_state)) { - converged = well_copy.solveWellWithTHPConstraint(simulator, dt, inj_controls, prod_controls, well_state_copy, group_state, deferred_logger); + if (this->well_ecl_.isProducer()) { + converged = well_copy.solveWellWithOperabilityCheck(simulator, dt, inj_controls, prod_controls, well_state_copy, group_state, deferred_logger); } else { converged = well_copy.iterateWellEqWithSwitching(simulator, dt, inj_controls, prod_controls, well_state_copy, group_state, deferred_logger); } diff --git a/opm/simulators/wells/StandardWell_impl.hpp b/opm/simulators/wells/StandardWell_impl.hpp index 751a087c92..63ddeceab4 100644 --- a/opm/simulators/wells/StandardWell_impl.hpp +++ b/opm/simulators/wells/StandardWell_impl.hpp @@ -1640,8 +1640,8 @@ namespace Opm const double dt = simulator.timeStepSize(); // iterate to get a solution at the given bhp. bool converged = false; - if (this->well_ecl_.isProducer() && this->wellHasTHPConstraints(summary_state)) { - converged = well_copy.solveWellWithTHPConstraint(simulator, dt, inj_controls, prod_controls, well_state_copy, group_state, deferred_logger); + if (this->well_ecl_.isProducer()) { + converged = well_copy.solveWellWithOperabilityCheck(simulator, dt, inj_controls, prod_controls, well_state_copy, group_state, deferred_logger); } else { converged = well_copy.iterateWellEqWithSwitching(simulator, dt, inj_controls, prod_controls, well_state_copy, group_state, deferred_logger); } diff --git a/opm/simulators/wells/WellInterface.hpp b/opm/simulators/wells/WellInterface.hpp index c7f65320b3..9ac1463fe4 100644 --- a/opm/simulators/wells/WellInterface.hpp +++ b/opm/simulators/wells/WellInterface.hpp @@ -422,13 +422,13 @@ protected: const GroupState& group_state, DeferredLogger& deferred_logger); - bool solveWellWithTHPConstraint(const Simulator& simulator, - const double dt, - const Well::InjectionControls& inj_controls, - const Well::ProductionControls& prod_controls, - WellState& well_state, - const GroupState& group_state, - DeferredLogger& deferred_logger); + bool solveWellWithOperabilityCheck(const Simulator& simulator, + const double dt, + const Well::InjectionControls& inj_controls, + const Well::ProductionControls& prod_controls, + WellState& well_state, + const GroupState& group_state, + DeferredLogger& deferred_logger); std::optional estimateOperableBhp(const Simulator& ebos_simulator, diff --git a/opm/simulators/wells/WellInterface_impl.hpp b/opm/simulators/wells/WellInterface_impl.hpp index 6f772b08e9..53f263d6c4 100644 --- a/opm/simulators/wells/WellInterface_impl.hpp +++ b/opm/simulators/wells/WellInterface_impl.hpp @@ -520,8 +520,8 @@ namespace Opm if (!this->param_.local_well_solver_control_switching_){ converged = this->iterateWellEqWithControl(simulator, dt, inj_controls, prod_controls, well_state, group_state, deferred_logger); } else { - if (this->param_.use_implicit_ipr_ && this->well_ecl_.isProducer() && this->wellHasTHPConstraints(summary_state) && (this->well_ecl_.getStatus() == WellStatus::OPEN)) { - converged = solveWellWithTHPConstraint(simulator, dt, inj_controls, prod_controls, well_state, group_state, deferred_logger); + if (this->param_.use_implicit_ipr_ && this->well_ecl_.isProducer() && (this->well_ecl_.getStatus() == WellStatus::OPEN)) { + converged = solveWellWithOperabilityCheck(simulator, dt, inj_controls, prod_controls, well_state, group_state, deferred_logger); } else { converged = this->iterateWellEqWithSwitching(simulator, dt, inj_controls, prod_controls, well_state, group_state, deferred_logger); } @@ -564,13 +564,13 @@ namespace Opm template bool WellInterface:: - solveWellWithTHPConstraint(const Simulator& simulator, - const double dt, - const Well::InjectionControls& inj_controls, - const Well::ProductionControls& prod_controls, - WellState& well_state, - const GroupState& group_state, - DeferredLogger& deferred_logger) + solveWellWithOperabilityCheck(const Simulator& simulator, + const double dt, + const Well::InjectionControls& inj_controls, + const Well::ProductionControls& prod_controls, + WellState& well_state, + const GroupState& group_state, + DeferredLogger& deferred_logger) { OPM_TIMEFUNCTION(); const auto& summary_state = simulator.vanguard().summaryState(); @@ -668,6 +668,15 @@ namespace Opm const SummaryState& summary_state, DeferredLogger& deferred_logger) { + if (!this->wellHasTHPConstraints(summary_state)) { + const Scalar bhp_limit = WellBhpThpCalculator(*this).mostStrictBhpFromBhpLimits(summary_state); + const bool converged = solveWellWithBhp(simulator, dt, bhp_limit, well_state, deferred_logger); + if (!converged || this->wellIsStopped()) { + return std::nullopt; + } + + return bhp_limit; + } OPM_TIMEFUNCTION(); // Given an unconverged well or closed well, estimate an operable bhp (if any) // Get minimal bhp from vfp-curve