52 static constexpr int Water = BlackoilPhases::Aqua;
53 static constexpr int Oil = BlackoilPhases::Liquid;
54 static constexpr int Gas = BlackoilPhases::Vapour;
55 static constexpr int NUM_PHASES = 3;
56 static constexpr Scalar ALQ_EPSILON = 1
e-8;
59 using GLiftSyncGroups = std::set<int>;
60 using Rate =
typename GasLiftGroupInfo<Scalar>::Rate;
61 using MessageType =
typename GasLiftCommon<Scalar>::MessageType;
72 bool water_is_limited_,
77 , oil_is_limited{oil_is_limited_}
79 , gas_is_limited{gas_is_limited_}
81 , water_is_limited{water_is_limited_}
83 , alq_is_limited{alq_is_limited_}
91 Scalar new_water_rate;
92 bool water_is_limited;
99 const std::string& name()
const {
return well_name_; }
101 std::optional<GradInfo> calcIncOrDecGradient(Scalar oil_rate,
109 std::unique_ptr<GasLiftWellState<Scalar>> runOptimize(
const int iteration_idx);
124 const Parallel::Communication& comm,
134 bhp_is_limited{rates.bhp_is_limited}
152 bhp_is_limited = rates.bhp_is_limited;
171 return this->oil + this->water;
173 throw std::runtime_error(
"This should not happen");
177 Scalar oil, gas, water;
183 enum class LimitType {well, group, none};
187 bool oil_is_limited_,
188 bool gas_is_limited_,
189 bool water_is_limited_,
194 , oil_is_limited{oil_is_limited_}
195 , gas_is_limited{gas_is_limited_}
196 , water_is_limited{water_is_limited_}
200 set_initial_limit_type_();
204 bool oil_is_limited_,
205 bool gas_is_limited_,
206 bool water_is_limited_)
208 , oil_is_limited{oil_is_limited_}
209 , gas_is_limited{gas_is_limited_}
210 , water_is_limited{water_is_limited_}
212 set_initial_limit_type_();
217 return oil_is_limited || gas_is_limited || water_is_limited;
222 LimitType limit_type;
225 bool water_is_limited;
226 std::optional<Rate> oil_limiting_target;
227 std::optional<Rate> water_limiting_target;
230 void set_initial_limit_type_()
232 limit_type = limited() ? LimitType::well : LimitType::none;
240 , increase{increase_}
242 , stop_iteration{
false}
252 std::pair<std::optional<Scalar>,
bool> addOrSubtractAlqIncrement(Scalar alq);
253 Scalar calcEcoGradient(Scalar oil_rate,
256 Scalar new_gas_rate);
258 bool checkAlqOutsideLimits(Scalar alq, Scalar oil_rate);
259 bool checkEcoGradient(Scalar
gradient);
260 bool checkOilRateExceedsTarget(Scalar oil_rate);
261 bool checkRatesViolated(
const LimitedRates& rates)
const;
263 void debugShowIterationInfo(Scalar alq);
265 Scalar getBhpWithLimit();
267 void warn_(
const std::string&
msg) { parent.displayWarning_(
msg); }
270 bool checkGroupALQrateExceeded(Scalar
delta_alq,
272 bool checkGroupTotalRateExceeded(Scalar
delta_alq,
275 std::pair<std::optional<Scalar>,
bool>
276 addOrSubtractAlqIncrement_(Scalar alq,
bool increase)
const;
278 Scalar calcEcoGradient_(Scalar oil_rate, Scalar new_oil_rate,
279 Scalar gas_rate, Scalar new_gas_rate,
bool increase)
const;
281 bool checkALQequal_(Scalar
alq1, Scalar
alq2)
const;
283 bool checkGroupTargetsViolated(
const BasicRates& rates,
285 bool checkInitialALQmodified_(Scalar alq, Scalar
initial_alq)
const;
287 virtual bool checkThpControl_()
const = 0;
288 virtual std::optional<Scalar > computeBhpAtThpLimit_(Scalar alq,
291 std::pair<std::optional<Scalar>,Scalar>
292 computeConvergedBhpAtThpLimitByMaybeIncreasingALQ_()
const;
294 std::pair<std::optional<BasicRates>,Scalar>
295 computeInitialWellRates_()
const;
297 std::optional<LimitedRates>
298 computeLimitedWellRatesWithALQ_(Scalar alq)
const;
300 virtual BasicRates computeWellRates_(Scalar bhp,
304 std::optional<BasicRates> computeWellRatesWithALQ_(Scalar alq)
const;
306 void debugCheckNegativeGradient_(Scalar grad, Scalar alq, Scalar
new_alq,
307 Scalar oil_rate, Scalar new_oil_rate,
308 Scalar gas_rate, Scalar new_gas_rate,
309 bool increase)
const;
311 void debugPrintWellStateRates()
const;
312 void debugShowAlqIncreaseDecreaseCounts_();
313 void debugShowBhpAlqTable_();
314 void debugShowLimitingTargets_(
const LimitedRates& rates)
const;
315 void debugShowProducerControlMode()
const;
316 void debugShowStartIteration_(Scalar alq,
bool increase, Scalar oil_rate);
317 void debugShowTargets_();
318 void displayDebugMessage_(
const std::string&
msg)
const override;
319 void displayWarning_(
const std::string& warning);
321 std::pair<Scalar, bool> getBhpWithLimit_(Scalar bhp)
const;
322 std::pair<Scalar, bool> getGasRateWithLimit_(
const BasicRates& rates)
const;
323 std::pair<Scalar, bool> getGasRateWithGroupLimit_(Scalar new_gas_rate,
327 std::pair<std::optional<LimitedRates>,Scalar >
328 getInitialRatesWithLimit_()
const;
332 std::tuple<Scalar,Scalar,bool,bool>
333 getLiquidRateWithGroupLimit_(
const Scalar new_oil_rate,
334 const Scalar oil_rate,
335 const Scalar new_water_rate,
336 const Scalar water_rate,
339 std::pair<Scalar, bool>
340 getOilRateWithGroupLimit_(Scalar new_oil_rate,
344 std::pair<Scalar, bool> getOilRateWithLimit_(
const BasicRates& rates)
const;
346 std::pair<Scalar, std::optional<Rate>>
347 getOilRateWithLimit2_(
const BasicRates& rates)
const;
349 Scalar getProductionTarget_(Rate
rate)
const;
352 std::pair<Scalar, std::optional<Rate>>
355 std::tuple<Scalar, const std::string*, Scalar>
361 std::pair<Scalar, bool>
362 getWaterRateWithGroupLimit_(Scalar new_water_rate,
366 std::pair<Scalar, bool> getWaterRateWithLimit_(
const BasicRates& rates)
const;
368 std::pair<Scalar, std::optional<Rate>>
369 getWaterRateWithLimit2_(
const BasicRates& rates)
const;
372 bool hasProductionControl_(Rate
rate)
const;
374 std::pair<LimitedRates, Scalar>
375 increaseALQtoPositiveOilRate_(Scalar alq,
378 std::pair<LimitedRates, Scalar>
379 increaseALQtoMinALQ_(Scalar alq,
382 void logSuccess_(Scalar alq,
385 std::pair<LimitedRates, Scalar>
386 maybeAdjustALQbeforeOptimizeLoop_(
const LimitedRates& rates,
388 bool increase)
const;
390 std::pair<LimitedRates, Scalar>
391 reduceALQtoGroupAlqLimits_(Scalar alq,
394 std::pair<LimitedRates, Scalar>
395 reduceALQtoGroupTarget(Scalar alq,
398 std::pair<LimitedRates, Scalar>
399 reduceALQtoWellTarget_(Scalar alq,
402 std::unique_ptr<GasLiftWellState<Scalar>> runOptimize1_();
403 std::unique_ptr<GasLiftWellState<Scalar>> runOptimize2_();
404 std::unique_ptr<GasLiftWellState<Scalar>> runOptimizeLoop_(
bool increase);
407 std::unique_ptr<GasLiftWellState<Scalar>> tryIncreaseLiftGas_();
408 std::unique_ptr<GasLiftWellState<Scalar>> tryDecreaseLiftGas_();
415 updateRatesToGroupLimits_(
const BasicRates& rates,
417 const std::string&
gr_name =
"")
const;
419 void updateWellStateAlqFixedValue_(
const GasLiftWell& well);
422 void debugInfoGroupRatesExceedTarget(Rate
rate_type,
426 void warnMaxIterationsExceeded_();
428 const Well& ecl_well_;
432 GLiftSyncGroups& sync_groups_;
450 std::string well_name_;
455 bool debug_limit_increase_decrease_;
456 bool debug_abort_if_decrease_and_oil_is_limited_ =
false;
457 bool debug_abort_if_increase_and_gas_is_limited_ =
false;