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{
35
36class DeferredLogger;
37class GasLiftOpt;
38class GasLiftWellState;
39class Group;
40template<class Scalar> class GroupState;
41class Schedule;
42class WellInterfaceGeneric;
43template<class Scalar> class WellState;
44
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;
52 using GradInfo = typename GasLiftSingleWellGeneric::GradInfo;
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;
58public:
60 const int report_step_idx,
61 const Parallel::Communication& comm,
62 const Schedule& schedule,
63 const SummaryState& summary_state,
64 DeferredLogger& deferred_logger,
65 WellState<double>& well_state,
66 const GroupState<double>& group_state,
67 GLiftProdWells& prod_wells,
68 GLiftOptWells& glift_wells,
69 GasLiftGroupInfo& group_info,
70 GLiftWellStateMap& state_map,
71 bool glift_debug
72 );
74protected:
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_(
92 const Group& group);
94 const Group& group, std::vector<GasLiftSingleWell *>& wells);
95 void optimizeGroup_(const Group& group);
96 void optimizeGroupsRecursive_(const Group& group);
98 GradPairItr& grad_itr, const std::string& gr_name_dont_limit, bool increase,
99 std::vector<GradPair>& grads, std::vector<GradPair>& other_grads);
101 std::vector<GasLiftSingleWell *>& wells, const Group& group,
102 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads);
104 const Group& group,
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);
113 const std::string& name, std::vector<GradPair>& grads, double grad);
114 void mpiSyncGlobalGradVector_(std::vector<GradPair>& grads_global) const;
116 const std::vector<GradPair>& grads_local,
117 std::vector<GradPair>& grads_global) const;
118
119
120 GLiftProdWells& prod_wells_;
121 GLiftOptWells& stage1_wells_;
123 GLiftWellStateMap& well_state_map_;
124
126 const SummaryState& summary_state_;
127 const Schedule& schedule_;
128 const GasLiftOpt& glo_;
129 GradMap inc_grads_;
130 GradMap dec_grads_;
131 int max_iterations_ = 1000;
132 //int time_step_idx_;
133
135 OptimizeState(GasLiftStage2& parent_, const Group& group_ ) :
136 parent{parent_},
137 group{group_},
138 it{0}
139 {}
141 const Group& group;
142 int it;
143
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);
152 std::pair<std::optional<GradPairItr>,std::optional<GradPairItr>>
154 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads);
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);
159
160 private:
161 void displayDebugMessage_(const std::string& msg);
162 void displayWarning_(const std::string& msg);
163
164 };
165
167 SurplusState( GasLiftStage2& parent_, const Group& group_,
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_) :
172 parent{parent_},
173 group{group_},
174 oil_rate{oil_rate_},
175 gas_rate{gas_rate_},
176 water_rate{water_rate_},
177 alq{alq_},
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_},
185 it{0}
186 {}
188 const Group &group;
189 double oil_rate;
190 double gas_rate;
192 double alq;
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;
200 int it;
201
203 GradMap &grad_map, const std::string& well_name, bool add);
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);
212 };
213};
214
215} // namespace Opm
216
217#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
Definition: GasLiftGroupInfo.hpp:45
Definition: GasLiftSingleWellGeneric.hpp:49
Definition: GasLiftStage2.hpp:45
GradMap dec_grads_
Definition: GasLiftStage2.hpp:130
void addOrRemoveALQincrement_(GradMap &grad_map, const std::string &well_name, bool add)
bool checkRateAlreadyLimited_(const std::string &well_name, GasLiftWellState &state, bool increase)
void removeSurplusALQ_(const Group &group, std::vector< GradPair > &inc_grads, std::vector< GradPair > &dec_grads)
GradInfo deleteGrad_(const std::string &name, bool increase)
void updateGradVector_(const std::string &name, std::vector< GradPair > &grads, double grad)
GLiftWellStateMap & well_state_map_
Definition: GasLiftStage2.hpp:123
void displayWarning_(const std::string &msg, const std::string &group_name)
GradMap inc_grads_
Definition: GasLiftStage2.hpp:129
void saveGrad_(GradMap &map, const std::string &name, GradInfo &grad)
GradInfo deleteIncGradItem_(const std::string &name)
void getGroupGliftWellsRecursive_(const Group &group, std::vector< GasLiftSingleWell * > &wells)
std::optional< double > getGroupMaxTotalGas_(const Group &group)
void optimizeGroupsRecursive_(const Group &group)
void sortGradients_(std::vector< GradPair > &grads)
void displayWarning_(const std::string &msg)
GasLiftStage2(const int report_step_idx, const Parallel::Communication &comm, const Schedule &schedule, const SummaryState &summary_state, DeferredLogger &deferred_logger, WellState< double > &well_state, const GroupState< double > &group_state, GLiftProdWells &prod_wells, GLiftOptWells &glift_wells, GasLiftGroupInfo &group_info, GLiftWellStateMap &state_map, bool glift_debug)
GLiftProdWells & prod_wells_
Definition: GasLiftStage2.hpp:120
void mpiSyncLocalToGlobalGradVector_(const std::vector< GradPair > &grads_local, std::vector< GradPair > &grads_global) const
std::optional< double > getGroupMaxALQ_(const Group &group)
void displayDebugMessage2B_(const std::string &msg)
const SummaryState & summary_state_
Definition: GasLiftStage2.hpp:126
void saveDecGrad_(const std::string &name, GradInfo &grad)
std::tuple< double, double, double, double > getCurrentGroupRates_(const Group &group)
void displayDebugMessage_(const std::string &msg, const std::string &group_name)
std::optional< GradInfo > updateGrad_(const std::string &name, GradInfo &grad, bool increase)
void saveIncGrad_(const std::string &name, GradInfo &grad)
void displayDebugMessage_(const std::string &msg) const override
const GasLiftOpt & glo_
Definition: GasLiftStage2.hpp:128
void optimizeGroup_(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)
GradInfo deleteDecGradItem_(const std::string &name)
GLiftOptWells & stage1_wells_
Definition: GasLiftStage2.hpp:121
std::vector< GasLiftSingleWell * > getGroupGliftWells_(const Group &group)
GasLiftGroupInfo & group_info_
Definition: GasLiftStage2.hpp:122
int report_step_idx_
Definition: GasLiftStage2.hpp:125
std::optional< GradInfo > calcIncOrDecGrad_(const std::string name, const GasLiftSingleWell &gs_well, const std::string &gr_name_dont_limit, bool increase)
const Schedule & schedule_
Definition: GasLiftStage2.hpp:127
void redistributeALQ_(std::vector< GasLiftSingleWell * > &wells, const Group &group, std::vector< GradPair > &inc_grads, std::vector< GradPair > &dec_grads)
void mpiSyncGlobalGradVector_(std::vector< GradPair > &grads_global) const
int max_iterations_
Definition: GasLiftStage2.hpp:131
Definition: GasLiftWellState.hpp:29
Dune::Communication< MPIComm > Communication
Definition: ParallelCommunication.hpp:30
Definition: BlackoilPhases.hpp:27
Definition: GasLiftSingleWellGeneric.hpp:61
Definition: GasLiftStage2.hpp:134
void recalculateGradients(std::vector< GradPair > &inc_grads, std::vector< GradPair > &dec_grads, GradPairItr &min_dec_grad_itr, GradPairItr &max_inc_grad_itr)
void calculateEcoGradients(std::vector< GasLiftSingleWell * > &wells, std::vector< GradPair > &inc_grads, std::vector< GradPair > &dec_grads)
GasLiftStage2 & parent
Definition: GasLiftStage2.hpp:140
typename GasLiftStage2::GradInfo GradInfo
Definition: GasLiftStage2.hpp:144
int it
Definition: GasLiftStage2.hpp:142
void redistributeALQ(GradPairItr &min_dec_grad, GradPairItr &max_inc_grad)
typename GasLiftStage2::GradMap GradMap
Definition: GasLiftStage2.hpp:147
std::pair< std::optional< GradPairItr >, std::optional< GradPairItr > > getEcoGradients(std::vector< GradPair > &inc_grads, std::vector< GradPair > &dec_grads)
const Group & group
Definition: GasLiftStage2.hpp:141
typename GasLiftStage2::GradPairItr GradPairItr
Definition: GasLiftStage2.hpp:146
bool checkAtLeastTwoWells(std::vector< GasLiftSingleWell * > &wells)
OptimizeState(GasLiftStage2 &parent_, const Group &group_)
Definition: GasLiftStage2.hpp:135
typename GasLiftStage2::GradPair GradPair
Definition: GasLiftStage2.hpp:145
Definition: GasLiftStage2.hpp:166
const Group & group
Definition: GasLiftStage2.hpp:188
std::array< double, 4 > computeDelta(const std::string &name)
double oil_rate
Definition: GasLiftStage2.hpp:189
int it
Definition: GasLiftStage2.hpp:200
SurplusState(GasLiftStage2 &parent_, const Group &group_, double oil_rate_, double gas_rate_, double water_rate_, double alq_, double min_eco_grad_, double oil_target_, double gas_target_, double water_target_, double liquid_target_, std::optional< double > max_glift_, std::optional< double > max_total_gas_)
Definition: GasLiftStage2.hpp:167
bool checkOilTarget(double delta_oil)
std::optional< double > max_glift
Definition: GasLiftStage2.hpp:198
const double gas_target
Definition: GasLiftStage2.hpp:195
void updateRates(const std::array< double, 4 > &delta)
bool checkEcoGradient(const std::string &well_name, double eco_grad)
bool checkGasTarget(double delta_gas)
const double water_target
Definition: GasLiftStage2.hpp:196
const double oil_target
Definition: GasLiftStage2.hpp:194
double gas_rate
Definition: GasLiftStage2.hpp:190
const double min_eco_grad
Definition: GasLiftStage2.hpp:193
void addOrRemoveALQincrement(GradMap &grad_map, const std::string &well_name, bool add)
bool checkWaterTarget(double delta_water)
bool checkLiquidTarget(double delta_liquid)
std::optional< double > max_total_gas
Definition: GasLiftStage2.hpp:199
double alq
Definition: GasLiftStage2.hpp:192
double water_rate
Definition: GasLiftStage2.hpp:191
const double liquid_target
Definition: GasLiftStage2.hpp:197
GasLiftStage2 & parent
Definition: GasLiftStage2.hpp:187