47 using GLiftOptWells = std::map<std::string,std::unique_ptr<GasLiftSingleWell>>;
48 using GLiftProdWells = std::map<std::string,const WellInterfaceGeneric*>;
49 using GLiftWellStateMap = std::map<std::string,std::unique_ptr<GasLiftWellState>>;
50 using GradPair = std::pair<std::string, double>;
51 using GradPairItr = std::vector<GradPair>::iterator;
53 using GradMap = std::map<std::string, GradInfo>;
54 using MPIComm =
typename Dune::MPIHelper::MPICommunicator;
55 static const int Water = BlackoilPhases::Aqua;
56 static const int Oil = BlackoilPhases::Liquid;
57 static const int Gas = BlackoilPhases::Vapour;
60 const int report_step_idx,
61 const Parallel::Communication& comm,
62 const Schedule& schedule,
63 const SummaryState& summary_state,
67 GLiftProdWells& prod_wells,
68 GLiftOptWells& glift_wells,
70 GLiftWellStateMap& state_map,
75 void addOrRemoveALQincrement_(
76 GradMap& grad_map,
const std::string& well_name,
bool add);
77 std::optional<GradInfo> calcIncOrDecGrad_(
78 const std::string name,
const GasLiftSingleWell& gs_well,
const std::string& gr_name_dont_limit,
bool increase);
79 bool checkRateAlreadyLimited_(
const std::string& well_name,
GasLiftWellState& state,
bool increase);
80 GradInfo deleteDecGradItem_(
const std::string& name);
81 GradInfo deleteIncGradItem_(
const std::string& name);
82 GradInfo deleteGrad_(
const std::string& name,
bool increase);
83 void displayDebugMessage_(
const std::string& msg)
const override;
84 void displayDebugMessage2B_(
const std::string& msg);
85 void displayDebugMessage_(
const std::string& msg,
const std::string& group_name);
86 void displayWarning_(
const std::string& msg,
const std::string& group_name);
87 void displayWarning_(
const std::string& msg);
88 std::tuple<double, double, double, double> getCurrentGroupRates_(
const Group& group);
89 std::optional<double> getGroupMaxALQ_(
const Group &group);
90 std::optional<double> getGroupMaxTotalGas_(
const Group &group);
91 std::vector<GasLiftSingleWell *> getGroupGliftWells_(
93 void getGroupGliftWellsRecursive_(
94 const Group& group, std::vector<GasLiftSingleWell *>& wells);
95 void optimizeGroup_(
const Group& group);
96 void optimizeGroupsRecursive_(
const Group& group);
97 void recalculateGradientAndUpdateData_(
98 GradPairItr& grad_itr,
const std::string& gr_name_dont_limit,
bool increase,
99 std::vector<GradPair>& grads, std::vector<GradPair>& other_grads);
100 void redistributeALQ_(
101 std::vector<GasLiftSingleWell *>& wells,
const Group& group,
102 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads);
103 void removeSurplusALQ_(
105 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads);
106 void saveGrad_(GradMap& map,
const std::string& name, GradInfo& grad);
107 void saveDecGrad_(
const std::string& name, GradInfo& grad);
108 void saveIncGrad_(
const std::string& name, GradInfo& grad);
109 void sortGradients_(std::vector<GradPair>& grads);
110 std::optional<GradInfo> updateGrad_(
111 const std::string& name, GradInfo& grad,
bool increase);
112 void updateGradVector_(
113 const std::string& name, std::vector<GradPair>& grads,
double grad);
114 void mpiSyncGlobalGradVector_(std::vector<GradPair>& grads_global)
const;
115 void mpiSyncLocalToGlobalGradVector_(
116 const std::vector<GradPair>& grads_local,
117 std::vector<GradPair>& grads_global)
const;
120 GLiftProdWells& prod_wells_;
121 GLiftOptWells& stage1_wells_;
123 GLiftWellStateMap& well_state_map_;
125 int report_step_idx_;
126 const SummaryState& summary_state_;
127 const Schedule& schedule_;
128 const GasLiftOpt& glo_;
131 int max_iterations_ = 1000;
144 using GradInfo =
typename GasLiftStage2::GradInfo;
145 using GradPair =
typename GasLiftStage2::GradPair;
146 using GradPairItr =
typename GasLiftStage2::GradPairItr;
147 using GradMap =
typename GasLiftStage2::GradMap;
148 void calculateEcoGradients(std::vector<GasLiftSingleWell *>& wells,
149 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads);
150 bool checkAtLeastTwoWells(std::vector<GasLiftSingleWell *>& wells);
151 void debugShowIterationInfo();
152 std::pair<std::optional<GradPairItr>,std::optional<GradPairItr>>
154 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads);
155 void recalculateGradients(
156 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads,
157 GradPairItr& min_dec_grad_itr, GradPairItr &max_inc_grad_itr);
158 void redistributeALQ( GradPairItr& min_dec_grad, GradPairItr& max_inc_grad);
161 void displayDebugMessage_(
const std::string& msg);
162 void displayWarning_(
const std::string& msg);
168 double oil_rate_,
double gas_rate_,
double water_rate_,
double alq_,
169 double min_eco_grad_,
170 double oil_target_,
double gas_target_,
double water_target_,
double liquid_target_,
171 std::optional<double> max_glift_, std::optional<double> max_total_gas_) :
176 water_rate{water_rate_},
178 min_eco_grad{min_eco_grad_},
179 oil_target{oil_target_},
180 gas_target{gas_target_},
181 water_target(water_target_),
182 liquid_target{liquid_target_},
183 max_glift{max_glift_},
184 max_total_gas{max_total_gas_},
193 const double min_eco_grad;
194 const double oil_target;
195 const double gas_target;
196 const double water_target;
197 const double liquid_target;
198 std::optional<double> max_glift;
199 std::optional<double> max_total_gas;
202 void addOrRemoveALQincrement(
203 GradMap &grad_map,
const std::string& well_name,
bool add);
204 bool checkALQlimit(
double delta_alq,
double delta_gas);
205 bool checkEcoGradient(
const std::string& well_name,
double eco_grad);
206 bool checkGasTarget(
double delta_gas);
207 bool checkLiquidTarget(
double delta_liquid);
208 bool checkOilTarget(
double delta_oil);
209 bool checkWaterTarget(
double delta_water);
210 std::array<double, 4> computeDelta(
const std::string& name);
211 void updateRates(
const std::array<double, 4>& delta);