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 = 1e-8;
59 using GLiftSyncGroups = std::set<int>;
60 using Rate =
typename GasLiftGroupInfo<Scalar>::Rate;
61 using MessageType =
typename GasLiftCommon<Scalar>::MessageType;
71 Scalar new_water_rate_,
72 bool water_is_limited_,
76 , new_oil_rate{new_oil_rate_}
77 , oil_is_limited{oil_is_limited_}
78 , new_gas_rate{new_gas_rate_}
79 , gas_is_limited{gas_is_limited_}
80 , new_water_rate{new_water_rate_}
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,
105 const std::string& gr_name_dont_limit,
107 bool debug_output =
true)
const;
109 std::unique_ptr<GasLiftWellState<Scalar>> runOptimize(
const int iteration_idx);
117 const Well& ecl_well,
118 const SummaryState& summary_state,
121 const Schedule& schedule,
122 const int report_step_idx,
123 GLiftSyncGroups& sync_groups,
124 const Parallel::Communication& comm,
134 bhp_is_limited{rates.bhp_is_limited}
140 bool bhp_is_limited_)
144 , bhp_is_limited{bhp_is_limited_}
152 bhp_is_limited = rates.bhp_is_limited;
161 Scalar operator[](Rate rate_type)
const
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_,
190 bool bhp_is_limited_,
191 std::optional<Rate> oil_limiting_target_,
192 std ::optional<Rate> water_limiting_target_)
193 :
BasicRates(oil_, gas_, water_, bhp_is_limited_)
194 , oil_is_limited{oil_is_limited_}
195 , gas_is_limited{gas_is_limited_}
196 , water_is_limited{water_is_limited_}
197 , oil_limiting_target{oil_limiting_target_}
198 , water_limiting_target{water_limiting_target_}
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,
271 const std::string& gr_name_dont_limit =
"")
const;
272 bool checkGroupTotalRateExceeded(Scalar delta_alq,
273 Scalar delta_gas_rate)
const;
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,
289 bool debug_output =
true)
const = 0;
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,
302 bool debug_output =
true)
const = 0;
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,
325 const std::string& gr_name_dont_limit)
const;
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,
337 const std::string& gr_name_dont_limit)
const;
339 std::pair<Scalar, bool>
340 getOilRateWithGroupLimit_(Scalar new_oil_rate,
342 const std::string& gr_name_dont_limit)
const;
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;
350 Scalar getRate_(Rate rate_type,
const BasicRates& rates)
const;
352 std::pair<Scalar, std::optional<Rate>>
353 getRateWithLimit_(Rate rate_type,
const BasicRates& rates)
const;
355 std::tuple<Scalar, const std::string*, Scalar>
356 getRateWithGroupLimit_(Rate rate_type,
357 const Scalar new_rate,
358 const Scalar old_rate,
359 const std::string& gr_name_dont_limit)
const;
361 std::pair<Scalar, bool>
362 getWaterRateWithGroupLimit_(Scalar new_water_rate,
364 const std::string& gr_name_dont_limit)
const;
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,
383 const int iteration_idx);
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);
406 void setAlqMinRate_(
const GasLiftWell& well);
407 std::unique_ptr<GasLiftWellState<Scalar>> tryIncreaseLiftGas_();
408 std::unique_ptr<GasLiftWellState<Scalar>> tryDecreaseLiftGas_();
412 Scalar delta_alq)
const;
415 updateRatesToGroupLimits_(
const BasicRates& rates,
417 const std::string& gr_name =
"")
const;
419 void updateWellStateAlqFixedValue_(
const GasLiftWell& well);
420 bool useFixedAlq_(
const GasLiftWell& well);
422 void debugInfoGroupRatesExceedTarget(Rate rate_type,
423 const std::string& gr_name,
425 Scalar target)
const;
426 void warnMaxIterationsExceeded_();
428 const Well& ecl_well_;
429 const SummaryState& summary_state_;
432 GLiftSyncGroups& sync_groups_;
433 const WellProductionControls controls_;
450 std::string well_name_;
452 const GasLiftWell* gl_well_;
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;