Iterate ALQ when testing gaslift well

When testing a gaslift well under THP control, if the
well does not converge with maximum alq, try to reduce alq
in increments until well equations converge.
This commit is contained in:
Håkon Hægland 2023-03-02 23:17:03 +01:00
parent c52ab4ccd5
commit 4ba5e3efad
2 changed files with 47 additions and 4 deletions

View File

@ -263,6 +263,13 @@ public:
void checkWellOperability(const Simulator& ebos_simulator, const WellState& well_state, DeferredLogger& deferred_logger);
bool gliftBeginTimeStepWellTestIterateWellEquations(
const Simulator& ebos_simulator,
const double dt,
WellState& well_state,
const GroupState &group_state,
DeferredLogger& deferred_logger);
void gliftBeginTimeStepWellTestUpdateALQ(const Simulator& ebos_simulator,
WellState& well_state,
DeferredLogger& deferred_logger);

View File

@ -382,12 +382,16 @@ namespace Opm
const double dt = ebosSimulator.timeStepSize();
const auto& summary_state = ebosSimulator.vanguard().summaryState();
const bool has_thp_limit = this->wellHasTHPConstraints(summary_state);
if (has_thp_limit)
bool converged;
if (has_thp_limit) {
well_state.well(this->indexOfWell()).production_cmode = Well::ProducerCMode::THP;
else
converged = gliftBeginTimeStepWellTestIterateWellEquations(
ebosSimulator, dt, well_state, group_state, deferred_logger);
}
else {
well_state.well(this->indexOfWell()).production_cmode = Well::ProducerCMode::BHP;
const bool converged = iterateWellEquations(ebosSimulator, dt, well_state, group_state, deferred_logger);
converged = iterateWellEquations(ebosSimulator, dt, well_state, group_state, deferred_logger);
}
if (converged) {
deferred_logger.debug("WellTest: Well equation for well " + this->name() + " converged");
return true;
@ -584,6 +588,38 @@ namespace Opm
}
}
template<typename TypeTag>
bool
WellInterface<TypeTag>::
gliftBeginTimeStepWellTestIterateWellEquations(
const Simulator& ebos_simulator,
const double dt,
WellState& well_state,
const GroupState &group_state,
DeferredLogger& deferred_logger)
{
const auto& well_name = this->name();
const auto& summary_state = ebos_simulator.vanguard().summaryState();
assert(this->wellHasTHPConstraints(summary_state));
const auto& schedule = ebos_simulator.vanguard().schedule();
auto report_step_idx = ebos_simulator.episodeIndex();
const auto& glo = schedule.glo(report_step_idx);
assert(glo.has_well(well_name));
auto increment = glo.gaslift_increment();
auto alq = well_state.getALQ(well_name);
bool converged;
while (alq > 0) {
well_state.setALQ(well_name, alq);
if ((converged =
iterateWellEquations(ebos_simulator, dt, well_state, group_state, deferred_logger)))
{
return converged;
}
alq -= increment;
}
return false;
}
template<typename TypeTag>
void
WellInterface<TypeTag>::