49 using GLiftOptWells = std::map<std::string,std::unique_ptr<GasLiftSingleWell>>;
50 using GLiftProdWells = std::map<std::string,const WellInterfaceGeneric<Scalar>*>;
51 using GLiftWellStateMap = std::map<std::string,std::unique_ptr<GasLiftWellState<Scalar>>>;
52 using GradPair = std::pair<std::string, Scalar>;
53 using GradPairItr =
typename std::vector<GradPair>::iterator;
55 using GradMap = std::map<std::string, GradInfo>;
56 using MessageType =
typename GasLiftCommon<Scalar>::MessageType;
58 static const int Water = BlackoilPhases::Aqua;
59 static const int Oil = BlackoilPhases::Liquid;
60 static const int Gas = BlackoilPhases::Vapour;
64 const Parallel::Communication& comm,
65 const Schedule& schedule,
66 const SummaryState& summary_state,
70 GLiftProdWells& prod_wells,
71 GLiftOptWells& glift_wells,
73 GLiftWellStateMap& state_map,
79 void addOrRemoveALQincrement_(GradMap& grad_map,
80 const std::string& well_name,
83 std::optional<GradInfo> calcIncOrDecGrad_(
const std::string name,
85 const std::string& gr_name_dont_limit,
88 bool checkRateAlreadyLimited_(
const std::string& well_name,
92 GradInfo deleteDecGradItem_(
const std::string& name);
93 GradInfo deleteIncGradItem_(
const std::string& name);
94 GradInfo deleteGrad_(
const std::string& name,
bool increase);
96 void displayDebugMessage_(
const std::string& msg)
const override;
97 void displayDebugMessage2B_(
const std::string& msg);
98 void displayDebugMessage_(
const std::string& msg,
99 const std::string& group_name);
100 void displayWarning_(
const std::string& msg,
101 const std::string& group_name);
102 void displayWarning_(
const std::string& msg);
104 std::tuple<Scalar, Scalar, Scalar, Scalar>
105 getCurrentGroupRates_(
const Group& group);
107 std::optional<Scalar> getGroupMaxALQ_(
const Group& group);
108 std::optional<Scalar> getGroupMaxTotalGas_(
const Group& group);
110 std::vector<GasLiftSingleWell*> getGroupGliftWells_(
const Group& group);
112 void getGroupGliftWellsRecursive_(
const Group& group,
113 std::vector<GasLiftSingleWell*>& wells);
115 void optimizeGroup_(
const Group& group);
116 void optimizeGroupsRecursive_(
const Group& group);
118 void recalculateGradientAndUpdateData_(GradPairItr& grad_itr,
119 const std::string& gr_name_dont_limit,
121 std::vector<GradPair>& grads,
122 std::vector<GradPair>& other_grads);
124 void redistributeALQ_(std::vector<GasLiftSingleWell*>& wells,
126 std::vector<GradPair>& inc_grads,
127 std::vector<GradPair>& dec_grads);
129 void removeSurplusALQ_(
const Group& group,
130 std::vector<GradPair>& inc_grads,
131 std::vector<GradPair>& dec_grads);
133 void saveGrad_(GradMap& map,
const std::string& name, GradInfo& grad);
134 void saveDecGrad_(
const std::string& name, GradInfo& grad);
135 void saveIncGrad_(
const std::string& name, GradInfo& grad);
136 void sortGradients_(std::vector<GradPair>& grads);
138 std::optional<GradInfo> updateGrad_(
const std::string& name,
139 GradInfo& grad,
bool increase);
141 void updateGradVector_(
const std::string& name,
142 std::vector<GradPair>& grads,
145 void mpiSyncGlobalGradVector_(std::vector<GradPair>& grads_global)
const;
146 void mpiSyncLocalToGlobalGradVector_(
const std::vector<GradPair>& grads_local,
147 std::vector<GradPair>& grads_global)
const;
149 GLiftProdWells& prod_wells_;
150 GLiftOptWells& stage1_wells_;
152 GLiftWellStateMap& well_state_map_;
154 int report_step_idx_;
155 const SummaryState& summary_state_;
156 const Schedule& schedule_;
157 const GasLiftOpt& glo_;
160 int max_iterations_ = 1000;
175 using GradInfo =
typename GasLiftStage2::GradInfo;
176 using GradPair =
typename GasLiftStage2::GradPair;
177 using GradPairItr =
typename GasLiftStage2::GradPairItr;
178 using GradMap =
typename GasLiftStage2::GradMap;
180 void calculateEcoGradients(std::vector<GasLiftSingleWell*>& wells,
181 std::vector<GradPair>& inc_grads,
182 std::vector<GradPair>& dec_grads);
184 bool checkAtLeastTwoWells(std::vector<GasLiftSingleWell*>& wells);
186 void debugShowIterationInfo();
188 std::pair<std::optional<GradPairItr>,std::optional<GradPairItr>>
189 getEcoGradients(std::vector<GradPair>& inc_grads,
190 std::vector<GradPair>& dec_grads);
192 void recalculateGradients(std::vector<GradPair>& inc_grads,
193 std::vector<GradPair>& dec_grads,
194 GradPairItr& min_dec_grad_itr,
195 GradPairItr &max_inc_grad_itr);
197 void redistributeALQ( GradPairItr& min_dec_grad,
198 GradPairItr& max_inc_grad);
201 void displayDebugMessage_(
const std::string& msg);
202 void displayWarning_(
const std::string& msg);
213 Scalar min_eco_grad_,
216 Scalar water_target_,
217 Scalar liquid_target_,
218 std::optional<Scalar> max_glift_,
219 std::optional<Scalar> max_total_gas_)
222 , oil_rate{oil_rate_}
223 , gas_rate{gas_rate_}
224 , water_rate{water_rate_}
226 , min_eco_grad{min_eco_grad_}
227 , oil_target{oil_target_}
228 , gas_target{gas_target_}
229 , water_target(water_target_)
230 , liquid_target{liquid_target_}
231 , max_glift{max_glift_}
232 , max_total_gas{max_total_gas_}
242 const Scalar min_eco_grad;
243 const Scalar oil_target;
244 const Scalar gas_target;
245 const Scalar water_target;
246 const Scalar liquid_target;
247 std::optional<Scalar> max_glift;
248 std::optional<Scalar> max_total_gas;
251 void addOrRemoveALQincrement(GradMap &grad_map,
252 const std::string& well_name,
255 bool checkALQlimit();
256 bool checkEcoGradient(
const std::string& well_name, Scalar eco_grad);
257 bool checkGasTarget(Scalar delta_gas);
258 bool checkLiquidTarget(Scalar delta_liquid);
259 bool checkOilTarget(Scalar delta_oil);
260 bool checkWaterTarget(Scalar delta_water);
261 std::array<Scalar, 4> computeDelta(
const std::string& name);
262 void updateRates(
const std::array<Scalar, 4>& delta);