GasLiftStage2.hpp
Go to the documentation of this file.
1/*
2 Copyright 2021 Equinor ASA.
3
4 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#ifndef OPM_GASLIFT_STAGE2_HEADER_INCLUDED
21#define OPM_GASLIFT_STAGE2_HEADER_INCLUDED
22
25
26#include <map>
27#include <memory>
28#include <optional>
29#include <string>
30#include <tuple>
31#include <vector>
32
33namespace Opm {
34
35class DeferredLogger;
36class GasLiftOpt;
37template<class Scalar> class GasLiftWellState;
38class Group;
39template<class Scalar> class GroupState;
40class Schedule;
41template<class Scalar> class WellInterfaceGeneric;
42template<class Scalar> class WellState;
43
44template<class Scalar>
45class GasLiftStage2 : public GasLiftCommon<Scalar>
46{
48 using GLiftOptWells = std::map<std::string,std::unique_ptr<GasLiftSingleWell>>;
49 using GLiftProdWells = std::map<std::string,const WellInterfaceGeneric<Scalar>*>;
50 using GLiftWellStateMap = std::map<std::string,std::unique_ptr<GasLiftWellState<Scalar>>>;
51 using GradPair = std::pair<std::string, Scalar>;
52 using GradPairItr = typename std::vector<GradPair>::iterator;
53 using GradInfo = typename GasLiftSingleWellGeneric<Scalar>::GradInfo;
54 using GradMap = std::map<std::string, GradInfo>;
56
57 static const int Water = BlackoilPhases::Aqua;
58 static const int Oil = BlackoilPhases::Liquid;
59 static const int Gas = BlackoilPhases::Vapour;
60
61public:
62 GasLiftStage2(const int report_step_idx,
63 const Parallel::Communication& comm,
64 const Schedule& schedule,
65 const SummaryState& summary_state,
66 DeferredLogger& deferred_logger,
67 WellState<Scalar>& well_state,
68 const GroupState<Scalar>& group_state,
69 GLiftProdWells& prod_wells,
70 GLiftOptWells& glift_wells,
71 GasLiftGroupInfo<Scalar>& group_info,
72 GLiftWellStateMap& state_map,
73 bool glift_debug);
74
76
77protected:
78 void addOrRemoveALQincrement_(GradMap& grad_map,
79 const std::string& well_name,
80 bool add);
81
82 std::optional<GradInfo> calcIncOrDecGrad_(const std::string name,
83 const GasLiftSingleWell& gs_well,
84 const std::string& gr_name_dont_limit,
85 bool increase);
86
87 bool checkRateAlreadyLimited_(const std::string& well_name,
89 bool increase);
90
91 GradInfo deleteDecGradItem_(const std::string& name);
92 GradInfo deleteIncGradItem_(const std::string& name);
93 GradInfo deleteGrad_(const std::string& name, bool increase);
94
95 void displayDebugMessage_(const std::string& msg) const override;
96 void displayDebugMessage2B_(const std::string& msg);
97 void displayDebugMessage_(const std::string& msg,
98 const std::string& group_name);
99 void displayWarning_(const std::string& msg,
100 const std::string& group_name);
101 void displayWarning_(const std::string& msg);
102
103 std::tuple<Scalar, Scalar, Scalar, Scalar>
104 getCurrentGroupRates_(const Group& group);
105
106 std::optional<Scalar> getGroupMaxALQ_(const Group& group);
107 std::optional<Scalar> getGroupMaxTotalGas_(const Group& group);
108
109 std::vector<GasLiftSingleWell*> getGroupGliftWells_(const Group& group);
110
111 void getGroupGliftWellsRecursive_(const Group& group,
112 std::vector<GasLiftSingleWell*>& wells);
113
114 void optimizeGroup_(const Group& group);
115 void optimizeGroupsRecursive_(const Group& group);
116
117 void recalculateGradientAndUpdateData_(GradPairItr& grad_itr,
118 const std::string& gr_name_dont_limit,
119 bool increase,
120 std::vector<GradPair>& grads,
121 std::vector<GradPair>& other_grads);
122
123 void redistributeALQ_(std::vector<GasLiftSingleWell*>& wells,
124 const Group& group,
125 std::vector<GradPair>& inc_grads,
126 std::vector<GradPair>& dec_grads);
127
128 void removeSurplusALQ_(const Group& group,
129 std::vector<GradPair>& inc_grads,
130 std::vector<GradPair>& dec_grads);
131
132 void saveGrad_(GradMap& map, const std::string& name, GradInfo& grad);
133 void saveDecGrad_(const std::string& name, GradInfo& grad);
134 void saveIncGrad_(const std::string& name, GradInfo& grad);
135 void sortGradients_(std::vector<GradPair>& grads);
136
137 std::optional<GradInfo> updateGrad_(const std::string& name,
138 GradInfo& grad, bool increase);
139
140 void updateGradVector_(const std::string& name,
141 std::vector<GradPair>& grads,
142 Scalar grad);
143
144 void mpiSyncGlobalGradVector_(std::vector<GradPair>& grads_global) const;
145 void mpiSyncLocalToGlobalGradVector_(const std::vector<GradPair>& grads_local,
146 std::vector<GradPair>& grads_global) const;
147
148 GLiftProdWells& prod_wells_;
149 GLiftOptWells& stage1_wells_;
151 GLiftWellStateMap& well_state_map_;
152
154 const SummaryState& summary_state_;
155 const Schedule& schedule_;
156 const GasLiftOpt& glo_;
157 GradMap inc_grads_;
158 GradMap dec_grads_;
159 int max_iterations_ = 1000;
160 //int time_step_idx_;
161
163 {
164 OptimizeState(GasLiftStage2& parent_, const Group& group_)
165 : parent{parent_}
166 , group{group_}
167 , it{0}
168 {}
169
171 const Group& group;
172 int it;
173
174 using GradInfo = typename GasLiftStage2::GradInfo;
175 using GradPair = typename GasLiftStage2::GradPair;
176 using GradPairItr = typename GasLiftStage2::GradPairItr;
177 using GradMap = typename GasLiftStage2::GradMap;
178
179 void calculateEcoGradients(std::vector<GasLiftSingleWell*>& wells,
180 std::vector<GradPair>& inc_grads,
181 std::vector<GradPair>& dec_grads);
182
183 bool checkAtLeastTwoWells(std::vector<GasLiftSingleWell*>& wells);
184
186
187 std::pair<std::optional<GradPairItr>,std::optional<GradPairItr>>
188 getEcoGradients(std::vector<GradPair>& inc_grads,
189 std::vector<GradPair>& dec_grads);
190
191 void recalculateGradients(std::vector<GradPair>& inc_grads,
192 std::vector<GradPair>& dec_grads,
193 GradPairItr& min_dec_grad_itr,
194 GradPairItr &max_inc_grad_itr);
195
196 void redistributeALQ( GradPairItr& min_dec_grad,
197 GradPairItr& max_inc_grad);
198
199 private:
200 void displayDebugMessage_(const std::string& msg);
201 void displayWarning_(const std::string& msg);
202 };
203
205 {
207 const Group& group_,
208 Scalar oil_rate_,
209 Scalar gas_rate_,
210 Scalar water_rate_,
211 Scalar alq_,
212 Scalar min_eco_grad_,
213 Scalar oil_target_,
214 Scalar gas_target_,
215 Scalar water_target_,
216 Scalar liquid_target_,
217 std::optional<Scalar> max_glift_,
218 std::optional<Scalar> max_total_gas_)
219 : parent{parent_}
220 , group{group_}
221 , oil_rate{oil_rate_}
222 , gas_rate{gas_rate_}
223 , water_rate{water_rate_}
224 , alq{alq_}
225 , min_eco_grad{min_eco_grad_}
226 , oil_target{oil_target_}
227 , gas_target{gas_target_}
228 , water_target(water_target_)
229 , liquid_target{liquid_target_}
230 , max_glift{max_glift_}
231 , max_total_gas{max_total_gas_}
232 , it{0}
233 {}
234
236 const Group &group;
237 Scalar oil_rate;
238 Scalar gas_rate;
240 Scalar alq;
241 const Scalar min_eco_grad;
242 const Scalar oil_target;
243 const Scalar gas_target;
244 const Scalar water_target;
245 const Scalar liquid_target;
246 std::optional<Scalar> max_glift;
247 std::optional<Scalar> max_total_gas;
248 int it;
249
250 void addOrRemoveALQincrement(GradMap &grad_map,
251 const std::string& well_name,
252 bool add);
253
255 bool checkEcoGradient(const std::string& well_name, Scalar eco_grad);
256 bool checkGasTarget(Scalar delta_gas);
257 bool checkLiquidTarget(Scalar delta_liquid);
258 bool checkOilTarget(Scalar delta_oil);
259 bool checkWaterTarget(Scalar delta_water);
260 std::array<Scalar, 4> computeDelta(const std::string& name);
261 void updateRates(const std::array<Scalar, 4>& delta);
262 };
263};
264
265} // namespace Opm
266
267#endif // OPM_GASLIFT_STAGE2_HEADER_INCLUDED
@ Liquid
Definition: BlackoilPhases.hpp:42
@ Aqua
Definition: BlackoilPhases.hpp:42
@ Vapour
Definition: BlackoilPhases.hpp:42
Definition: DeferredLogger.hpp:57
Definition: GasLiftCommon.hpp:35
MessageType
Definition: GasLiftCommon.hpp:46
Definition: GasLiftGroupInfo.hpp:45
Definition: GasLiftSingleWellGeneric.hpp:49
Definition: GasLiftStage2.hpp:46
void saveIncGrad_(const std::string &name, GradInfo &grad)
void optimizeGroupsRecursive_(const Group &group)
void displayDebugMessage_(const std::string &msg) const override
void displayDebugMessage_(const std::string &msg, const std::string &group_name)
void optimizeGroup_(const Group &group)
std::tuple< Scalar, Scalar, Scalar, Scalar > getCurrentGroupRates_(const Group &group)
std::optional< Scalar > getGroupMaxTotalGas_(const Group &group)
void recalculateGradientAndUpdateData_(GradPairItr &grad_itr, const std::string &gr_name_dont_limit, bool increase, std::vector< GradPair > &grads, std::vector< GradPair > &other_grads)
GasLiftStage2(const int report_step_idx, const Parallel::Communication &comm, const Schedule &schedule, const SummaryState &summary_state, DeferredLogger &deferred_logger, WellState< Scalar > &well_state, const GroupState< Scalar > &group_state, GLiftProdWells &prod_wells, GLiftOptWells &glift_wells, GasLiftGroupInfo< Scalar > &group_info, GLiftWellStateMap &state_map, bool glift_debug)
GasLiftGroupInfo< Scalar > & group_info_
Definition: GasLiftStage2.hpp:150
const SummaryState & summary_state_
Definition: GasLiftStage2.hpp:154
void displayWarning_(const std::string &msg)
GradMap inc_grads_
Definition: GasLiftStage2.hpp:157
GradInfo deleteGrad_(const std::string &name, bool increase)
GLiftProdWells & prod_wells_
Definition: GasLiftStage2.hpp:148
const Schedule & schedule_
Definition: GasLiftStage2.hpp:155
std::optional< Scalar > getGroupMaxALQ_(const Group &group)
std::optional< GradInfo > calcIncOrDecGrad_(const std::string name, const GasLiftSingleWell &gs_well, const std::string &gr_name_dont_limit, bool increase)
GLiftOptWells & stage1_wells_
Definition: GasLiftStage2.hpp:149
std::optional< GradInfo > updateGrad_(const std::string &name, GradInfo &grad, bool increase)
void getGroupGliftWellsRecursive_(const Group &group, std::vector< GasLiftSingleWell * > &wells)
void saveDecGrad_(const std::string &name, GradInfo &grad)
void updateGradVector_(const std::string &name, std::vector< GradPair > &grads, Scalar grad)
bool checkRateAlreadyLimited_(const std::string &well_name, GasLiftWellState< Scalar > &state, bool increase)
void removeSurplusALQ_(const Group &group, std::vector< GradPair > &inc_grads, std::vector< GradPair > &dec_grads)
void sortGradients_(std::vector< GradPair > &grads)
void displayWarning_(const std::string &msg, const std::string &group_name)
void mpiSyncGlobalGradVector_(std::vector< GradPair > &grads_global) const
GradMap dec_grads_
Definition: GasLiftStage2.hpp:158
GradInfo deleteIncGradItem_(const std::string &name)
int max_iterations_
Definition: GasLiftStage2.hpp:159
void addOrRemoveALQincrement_(GradMap &grad_map, const std::string &well_name, bool add)
int report_step_idx_
Definition: GasLiftStage2.hpp:153
std::vector< GasLiftSingleWell * > getGroupGliftWells_(const Group &group)
GLiftWellStateMap & well_state_map_
Definition: GasLiftStage2.hpp:151
void saveGrad_(GradMap &map, const std::string &name, GradInfo &grad)
void displayDebugMessage2B_(const std::string &msg)
GradInfo deleteDecGradItem_(const std::string &name)
const GasLiftOpt & glo_
Definition: GasLiftStage2.hpp:156
void redistributeALQ_(std::vector< GasLiftSingleWell * > &wells, const Group &group, std::vector< GradPair > &inc_grads, std::vector< GradPair > &dec_grads)
void mpiSyncLocalToGlobalGradVector_(const std::vector< GradPair > &grads_local, std::vector< GradPair > &grads_global) const
Definition: GasLiftWellState.hpp:30
Definition: GroupState.hpp:35
Definition: WellState.hpp:62
Dune::Communication< MPIComm > Communication
Definition: ParallelCommunication.hpp:30
Definition: BlackoilPhases.hpp:27
Definition: GasLiftSingleWellGeneric.hpp:63
Definition: GasLiftStage2.hpp:163
int it
Definition: GasLiftStage2.hpp:172
bool checkAtLeastTwoWells(std::vector< GasLiftSingleWell * > &wells)
GasLiftStage2 & parent
Definition: GasLiftStage2.hpp:170
const Group & group
Definition: GasLiftStage2.hpp:171
OptimizeState(GasLiftStage2 &parent_, const Group &group_)
Definition: GasLiftStage2.hpp:164
typename GasLiftStage2::GradInfo GradInfo
Definition: GasLiftStage2.hpp:174
std::pair< std::optional< GradPairItr >, std::optional< GradPairItr > > getEcoGradients(std::vector< GradPair > &inc_grads, std::vector< GradPair > &dec_grads)
void redistributeALQ(GradPairItr &min_dec_grad, GradPairItr &max_inc_grad)
void calculateEcoGradients(std::vector< GasLiftSingleWell * > &wells, std::vector< GradPair > &inc_grads, std::vector< GradPair > &dec_grads)
typename GasLiftStage2::GradPair GradPair
Definition: GasLiftStage2.hpp:175
typename GasLiftStage2::GradMap GradMap
Definition: GasLiftStage2.hpp:177
typename GasLiftStage2::GradPairItr GradPairItr
Definition: GasLiftStage2.hpp:176
void recalculateGradients(std::vector< GradPair > &inc_grads, std::vector< GradPair > &dec_grads, GradPairItr &min_dec_grad_itr, GradPairItr &max_inc_grad_itr)
Definition: GasLiftStage2.hpp:205
Scalar gas_rate
Definition: GasLiftStage2.hpp:238
bool checkGasTarget(Scalar delta_gas)
Scalar alq
Definition: GasLiftStage2.hpp:240
int it
Definition: GasLiftStage2.hpp:248
std::optional< Scalar > max_glift
Definition: GasLiftStage2.hpp:246
SurplusState(GasLiftStage2 &parent_, const Group &group_, Scalar oil_rate_, Scalar gas_rate_, Scalar water_rate_, Scalar alq_, Scalar min_eco_grad_, Scalar oil_target_, Scalar gas_target_, Scalar water_target_, Scalar liquid_target_, std::optional< Scalar > max_glift_, std::optional< Scalar > max_total_gas_)
Definition: GasLiftStage2.hpp:206
std::optional< Scalar > max_total_gas
Definition: GasLiftStage2.hpp:247
bool checkLiquidTarget(Scalar delta_liquid)
void updateRates(const std::array< Scalar, 4 > &delta)
GasLiftStage2 & parent
Definition: GasLiftStage2.hpp:235
bool checkOilTarget(Scalar delta_oil)
Scalar oil_rate
Definition: GasLiftStage2.hpp:237
std::array< Scalar, 4 > computeDelta(const std::string &name)
const Group & group
Definition: GasLiftStage2.hpp:236
const Scalar liquid_target
Definition: GasLiftStage2.hpp:245
const Scalar gas_target
Definition: GasLiftStage2.hpp:243
Scalar water_rate
Definition: GasLiftStage2.hpp:239
bool checkEcoGradient(const std::string &well_name, Scalar eco_grad)
const Scalar min_eco_grad
Definition: GasLiftStage2.hpp:241
void addOrRemoveALQincrement(GradMap &grad_map, const std::string &well_name, bool add)
const Scalar water_target
Definition: GasLiftStage2.hpp:244
bool checkWaterTarget(Scalar delta_water)
const Scalar oil_target
Definition: GasLiftStage2.hpp:242