mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Add gaslift optimization support for MSW.
Implements gas lift optimization support for multisegmented wells (MSW).
This commit is contained in:
@@ -300,7 +300,8 @@ namespace Opm
|
||||
if (!Base::wellHasTHPConstraints(summaryState) || bhp_controlled_well) {
|
||||
computeWellRatesAtBhpLimit(ebosSimulator, well_potentials, deferred_logger);
|
||||
} else {
|
||||
well_potentials = computeWellPotentialWithTHP(ebosSimulator, deferred_logger);
|
||||
well_potentials = computeWellPotentialWithTHP(
|
||||
well_state, ebosSimulator, deferred_logger);
|
||||
}
|
||||
deferred_logger.debug("Cost in iterations of finding well potential for well "
|
||||
+ this->name() + ": " + std::to_string(debug_cost_counter_));
|
||||
@@ -342,7 +343,7 @@ namespace Opm
|
||||
void
|
||||
MultisegmentWell<TypeTag>::
|
||||
computeWellRatesWithBhp(const Simulator& ebosSimulator,
|
||||
const Scalar& bhp,
|
||||
const double& bhp,
|
||||
std::vector<double>& well_flux,
|
||||
DeferredLogger& deferred_logger) const
|
||||
{
|
||||
@@ -448,8 +449,10 @@ namespace Opm
|
||||
template<typename TypeTag>
|
||||
std::vector<double>
|
||||
MultisegmentWell<TypeTag>::
|
||||
computeWellPotentialWithTHP(const Simulator& ebos_simulator,
|
||||
DeferredLogger& deferred_logger) const
|
||||
computeWellPotentialWithTHP(
|
||||
const WellState& well_state,
|
||||
const Simulator& ebos_simulator,
|
||||
DeferredLogger& deferred_logger) const
|
||||
{
|
||||
std::vector<double> potentials(this->number_of_phases_, 0.0);
|
||||
const auto& summary_state = ebos_simulator.vanguard().summaryState();
|
||||
@@ -472,7 +475,8 @@ namespace Opm
|
||||
computeWellRatesWithBhpIterations(ebos_simulator, bhp, potentials, deferred_logger);
|
||||
}
|
||||
} else {
|
||||
auto bhp_at_thp_limit = computeBhpAtThpLimitProd(ebos_simulator, summary_state, deferred_logger);
|
||||
auto bhp_at_thp_limit = computeBhpAtThpLimitProd(
|
||||
well_state, ebos_simulator, summary_state, deferred_logger);
|
||||
if (bhp_at_thp_limit) {
|
||||
const auto& controls = well.productionControls(summary_state);
|
||||
const double bhp = std::max(*bhp_at_thp_limit, controls.bhp_limit);
|
||||
@@ -1293,11 +1297,16 @@ namespace Opm
|
||||
template<typename TypeTag>
|
||||
void
|
||||
MultisegmentWell<TypeTag>::
|
||||
checkOperabilityUnderTHPLimit(const Simulator& ebos_simulator, const WellState& /*well_state*/, DeferredLogger& deferred_logger)
|
||||
checkOperabilityUnderTHPLimit(
|
||||
const Simulator& ebos_simulator,
|
||||
const WellState& well_state,
|
||||
DeferredLogger& deferred_logger)
|
||||
{
|
||||
const auto& summaryState = ebos_simulator.vanguard().summaryState();
|
||||
const auto obtain_bhp = this->isProducer() ? computeBhpAtThpLimitProd(ebos_simulator, summaryState, deferred_logger)
|
||||
: computeBhpAtThpLimitInj(ebos_simulator, summaryState, deferred_logger);
|
||||
const auto obtain_bhp = this->isProducer()
|
||||
? computeBhpAtThpLimitProd(
|
||||
well_state, ebos_simulator, summaryState, deferred_logger)
|
||||
: computeBhpAtThpLimitInj(ebos_simulator, summaryState, deferred_logger);
|
||||
|
||||
if (obtain_bhp) {
|
||||
this->operability_status_.can_obtain_bhp_with_thp_limit = true;
|
||||
@@ -1734,15 +1743,30 @@ namespace Opm
|
||||
}
|
||||
|
||||
|
||||
template<typename TypeTag>
|
||||
std::optional<double>
|
||||
MultisegmentWell<TypeTag>::
|
||||
computeBhpAtThpLimitProd(const WellState& well_state,
|
||||
const Simulator& ebos_simulator,
|
||||
const SummaryState& summary_state,
|
||||
DeferredLogger& deferred_logger) const
|
||||
{
|
||||
return this->MultisegmentWell<TypeTag>::computeBhpAtThpLimitProdWithAlq(
|
||||
ebos_simulator,
|
||||
summary_state,
|
||||
deferred_logger,
|
||||
this->getALQ(well_state));
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<typename TypeTag>
|
||||
std::optional<double>
|
||||
MultisegmentWell<TypeTag>::
|
||||
computeBhpAtThpLimitProd(const Simulator& ebos_simulator,
|
||||
const SummaryState& summary_state,
|
||||
DeferredLogger& deferred_logger) const
|
||||
computeBhpAtThpLimitProdWithAlq(const Simulator& ebos_simulator,
|
||||
const SummaryState& summary_state,
|
||||
DeferredLogger& deferred_logger,
|
||||
double alq_value) const
|
||||
{
|
||||
// Make the frates() function.
|
||||
auto frates = [this, &ebos_simulator, &deferred_logger](const double bhp) {
|
||||
@@ -1757,11 +1781,12 @@ namespace Opm
|
||||
};
|
||||
|
||||
auto bhpAtLimit = this->MultisegmentWellGeneric<Scalar>::
|
||||
computeBhpAtThpLimitProd(frates,
|
||||
computeBhpAtThpLimitProdWithAlq(frates,
|
||||
summary_state,
|
||||
maxPerfPress(ebos_simulator),
|
||||
getRefDensity(),
|
||||
deferred_logger);
|
||||
deferred_logger,
|
||||
alq_value);
|
||||
|
||||
if(bhpAtLimit)
|
||||
return bhpAtLimit;
|
||||
@@ -1776,11 +1801,12 @@ namespace Opm
|
||||
};
|
||||
|
||||
return this->MultisegmentWellGeneric<Scalar>::
|
||||
computeBhpAtThpLimitProd(fratesIter,
|
||||
computeBhpAtThpLimitProdWithAlq(fratesIter,
|
||||
summary_state,
|
||||
maxPerfPress(ebos_simulator),
|
||||
getRefDensity(),
|
||||
deferred_logger);
|
||||
deferred_logger,
|
||||
alq_value);
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user