Calculate gradients with group limits.

Take into account group limits when calculating gradients for individual
wells in stage 2 of gas lift optimization.
This commit is contained in:
Håkon Hægland 2022-10-17 22:05:35 +02:00 committed by Tor Harald Sandve
parent 9c61262329
commit 686a6a969d
3 changed files with 25 additions and 16 deletions

View File

@ -86,8 +86,8 @@ GasLiftSingleWellGeneric::GasLiftSingleWellGeneric(DeferredLogger& deferred_logg
****************************************/ ****************************************/
// NOTE: Used from GasLiftStage2 // NOTE: Used from GasLiftStage2
std::optional<GasLiftSingleWellGeneric::GradInfo> std::optional<GasLiftSingleWellGeneric::GradInfo>
GasLiftSingleWellGeneric:: GasLiftSingleWellGeneric::calcIncOrDecGradient(
calcIncOrDecGradient(double oil_rate, double gas_rate, double alq, bool increase) const double oil_rate, double gas_rate, double water_rate, double alq, bool increase) const
{ {
auto [new_alq_opt, alq_is_limited] = addOrSubtractAlqIncrement_(alq, increase); auto [new_alq_opt, alq_is_limited] = addOrSubtractAlqIncrement_(alq, increase);
// TODO: What to do if ALQ is limited and new_alq != alq? // TODO: What to do if ALQ is limited and new_alq != alq?
@ -98,21 +98,29 @@ calcIncOrDecGradient(double oil_rate, double gas_rate, double alq, bool increase
auto [new_bhp, bhp_is_limited] = getBhpWithLimit_(*bhp); auto [new_bhp, bhp_is_limited] = getBhpWithLimit_(*bhp);
// TODO: What to do if BHP is limited? // TODO: What to do if BHP is limited?
auto rates = computeWellRates_(new_bhp, bhp_is_limited); auto rates = computeWellRates_(new_bhp, bhp_is_limited);
double new_oil_rate, new_gas_rate, new_water_rate; // double new_oil_rate, new_gas_rate, new_water_rate;
bool oil_is_limited, gas_is_limited, water_is_limited; // bool oil_is_limited, gas_is_limited, water_is_limited;
std::tie(new_oil_rate, oil_is_limited) = getOilRateWithLimit_(rates); // std::tie(new_oil_rate, oil_is_limited) = getOilRateWithLimit_(rates);
std::tie(new_gas_rate, gas_is_limited) = getGasRateWithLimit_(rates); // std::tie(new_gas_rate, gas_is_limited) = getGasRateWithLimit_(rates);
std::tie(new_water_rate, water_is_limited) = getWaterRateWithLimit_(rates); // std::tie(new_water_rate, water_is_limited) = getWaterRateWithLimit_(rates);
if (!increase && new_oil_rate < 0 ) { const auto ratesLimited = getLimitedRatesFromRates_(rates);
BasicRates oldrates = {oil_rate, gas_rate, water_rate, false};
const auto new_rates = updateRatesToGroupLimits_(oldrates, ratesLimited);
if (!increase && new_rates.oil < 0) {
return std::nullopt; return std::nullopt;
} }
auto grad = calcEcoGradient_( auto grad = calcEcoGradient_(oil_rate, new_rates.oil, gas_rate, new_rates.gas, increase);
oil_rate, new_oil_rate, gas_rate, new_gas_rate, increase); return GradInfo(grad,
return GradInfo(grad, new_oil_rate, oil_is_limited, new_rates.oil,
new_gas_rate, gas_is_limited, new_water_rate, water_is_limited, new_rates.oil_is_limited,
new_alq, alq_is_limited); new_rates.gas,
} new_rates.gas_is_limited,
else { new_rates.water,
new_rates.water_is_limited,
new_alq,
alq_is_limited);
} else {
return std::nullopt; return std::nullopt;
} }
} }

View File

@ -93,6 +93,7 @@ public:
const std::string& name() const { return well_name_; } const std::string& name() const { return well_name_; }
std::optional<GradInfo> calcIncOrDecGradient(double oil_rate, double gas_rate, std::optional<GradInfo> calcIncOrDecGradient(double oil_rate, double gas_rate,
double water_rate,
double alq, bool increase) const; double alq, bool increase) const;
std::unique_ptr<GasLiftWellState> runOptimize(const int iteration_idx); std::unique_ptr<GasLiftWellState> runOptimize(const int iteration_idx);

View File

@ -157,7 +157,7 @@ calcIncOrDecGrad_(
else { else {
auto [oil_rate, gas_rate] = state.getRates(); auto [oil_rate, gas_rate] = state.getRates();
auto alq = state.alq(); auto alq = state.alq();
auto grad = gs_well.calcIncOrDecGradient(oil_rate, gas_rate, alq, increase); auto grad = gs_well.calcIncOrDecGradient(oil_rate, gas_rate, state.waterRate(), alq, increase);
if (grad) { if (grad) {
const std::string msg = fmt::format( const std::string msg = fmt::format(
"well {} : adding {} gradient = {}", "well {} : adding {} gradient = {}",