20 #ifndef OPM_GASLIFT_STAGE2_HEADER_INCLUDED
21 #define OPM_GASLIFT_STAGE2_HEADER_INCLUDED
23 #include <opm/core/props/BlackoilPhases.hpp>
24 #include <opm/simulators/wells/GasLiftSingleWellGeneric.hpp>
26 #include <dune/common/version.hh>
27 #include <dune/common/parallel/mpihelper.hh>
42 class GasLiftWellState;
45 class WellInterfaceGeneric;
50 using GLiftOptWells = std::map<std::string,std::unique_ptr<GasLiftSingleWell>>;
51 using GLiftProdWells = std::map<std::string,const WellInterfaceGeneric*>;
52 using GLiftWellStateMap = std::map<std::string,std::unique_ptr<GasLiftWellState>>;
53 using GradPair = std::pair<std::string, double>;
54 using GradPairItr = std::vector<GradPair>::iterator;
56 using GradMap = std::map<std::string, GradInfo>;
57 using MPIComm =
typename Dune::MPIHelper::MPICommunicator;
58 static const int Water = BlackoilPhases::Aqua;
59 static const int Oil = BlackoilPhases::Liquid;
60 static const int Gas = BlackoilPhases::Vapour;
63 const int report_step_idx,
64 const Parallel::Communication& comm,
65 const Schedule& schedule,
66 const SummaryState& summary_state,
69 GLiftProdWells& prod_wells,
70 GLiftOptWells& glift_wells,
71 GLiftWellStateMap& state_map
75 void addOrRemoveALQincrement_(
76 GradMap& grad_map,
const std::string& well_name,
bool add);
77 std::optional<GradInfo> calcIncOrDecGrad_(
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);
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> getCurrentGroupRates_(
90 std::array<double,3> getCurrentGroupRatesRecursive_(
92 std::tuple<double, double, double> getCurrentWellRates_(
93 const std::string& well_name,
const std::string& group_name);
94 std::vector<GasLiftSingleWell *> getGroupGliftWells_(
96 void getGroupGliftWellsRecursive_(
97 const Group& group, std::vector<GasLiftSingleWell *>& wells);
99 void optimizeGroup_(
const Group& group);
100 void optimizeGroupsRecursive_(
const Group& group);
101 void recalculateGradientAndUpdateData_(
102 GradPairItr& grad_itr,
bool increase,
103 std::vector<GradPair>& grads, std::vector<GradPair>& other_grads);
104 void redistributeALQ_(
105 std::vector<GasLiftSingleWell *>& wells,
const Group& group,
106 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads);
107 void removeSurplusALQ_(
109 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads);
110 void saveGrad_(GradMap& map,
const std::string& name, GradInfo& grad);
111 void saveDecGrad_(
const std::string& name, GradInfo& grad);
112 void saveIncGrad_(
const std::string& name, GradInfo& grad);
113 void sortGradients_(std::vector<GradPair>& grads);
114 std::optional<GradInfo> updateGrad_(
115 const std::string& name, GradInfo& grad,
bool increase);
116 void updateGradVector_(
117 const std::string& name, std::vector<GradPair>& grads,
double grad);
118 void mpiSyncGlobalGradVector_(std::vector<GradPair>& grads_global)
const;
119 void mpiSyncLocalToGlobalGradVector_(
120 const std::vector<GradPair>& grads_local,
121 std::vector<GradPair>& grads_global)
const;
126 GLiftProdWells& prod_wells_;
127 GLiftOptWells& stage1_wells_;
128 GLiftWellStateMap& well_state_map_;
130 int report_step_idx_;
131 const SummaryState& summary_state_;
132 const Schedule& schedule_;
133 const GasLiftOpt& glo_;
134 const Parallel::Communication& comm_;
138 int max_iterations_ = 1000;
141 struct OptimizeState {
142 OptimizeState(
GasLiftStage2& parent_,
const Group& group_ ) :
151 using GradInfo =
typename GasLiftStage2::GradInfo;
152 using GradPair =
typename GasLiftStage2::GradPair;
153 using GradPairItr =
typename GasLiftStage2::GradPairItr;
154 using GradMap =
typename GasLiftStage2::GradMap;
155 void calculateEcoGradients(std::vector<GasLiftSingleWell *>& wells,
156 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads);
157 bool checkAtLeastTwoWells(std::vector<GasLiftSingleWell *>& wells);
158 void debugShowIterationInfo();
159 std::pair<std::optional<GradPairItr>,std::optional<GradPairItr>>
161 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads);
162 void recalculateGradients(
163 std::vector<GradPair>& inc_grads, std::vector<GradPair>& dec_grads,
164 GradPairItr& min_dec_grad_itr, GradPairItr &max_inc_grad_itr);
165 void redistributeALQ( GradPairItr& min_dec_grad, GradPairItr& max_inc_grad);
168 void displayDebugMessage_(
const std::string& msg);
169 void displayWarning_(
const std::string& msg);
173 struct SurplusState {
175 double oil_rate_,
double gas_rate_,
double alq_,
double min_eco_grad_,
176 double oil_target_,
double gas_target_,
177 std::optional<double> max_glift_) :
183 min_eco_grad{min_eco_grad_},
184 oil_target{oil_target_},
185 gas_target{gas_target_},
186 max_glift{max_glift_},
194 const double min_eco_grad;
195 const double oil_target;
196 const double gas_target;
197 std::optional<double> max_glift;
200 void addOrRemoveALQincrement(
201 GradMap &grad_map,
const std::string& well_name,
bool add);
202 bool checkALQlimit();
203 bool checkEcoGradient(
const std::string& well_name,
double eco_grad);
204 bool checkGasTarget();
205 bool checkOilTarget();
206 void updateRates(
const std::string& name);
Definition: DeferredLogger.hpp:57
Definition: GasLiftSingleWellGeneric.hpp:51
Definition: GasLiftStage2.hpp:48
Definition: GasLiftWellState.hpp:29
Definition: WellInterfaceGeneric.hpp:51
The state of a set of wells, tailored for use by the fully implicit blackoil simulator.
Definition: WellState.hpp:56
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: BlackoilPhases.hpp:26
Definition: GasLiftSingleWellGeneric.hpp:61