46class GasLiftGroupInfo :
public GasLiftCommon<Scalar, IndexTraits>
56 std::map<std::string, std::vector<std::pair<std::string, Scalar>>>;
58 std::map<std::string, GroupRates>;
59 using GroupIdxMap = std::map<std::string, int>;
60 using Communication = Dune::Communication<Dune::MPIHelper::MPICommunicator>;
63 enum class Rate {oil, gas, water, liquid};
65 using GLiftEclWells = std::map<std::string,std::pair<const Well *,int>>;
66 GasLiftGroupInfo(GLiftEclWells& ecl_wells,
67 const Schedule& schedule,
68 const SummaryState& summary_state,
69 const int report_step_idx,
74 const Parallel::Communication& comm,
77 std::vector<std::pair<std::string,Scalar>>&
78 getWellGroups(
const std::string& well_name);
80 Scalar alqRate(
const std::string& group_name);
81 Scalar gasRate(
const std::string& group_name)
const;
82 Scalar gasPotential(
const std::string& group_name)
const;
83 Scalar waterPotential(
const std::string& group_name)
const;
84 Scalar oilPotential(
const std::string& group_name)
const;
85 int getGroupIdx(
const std::string& group_name);
86 Scalar getRate(Rate rate_type,
const std::string& group_name)
const;
87 Scalar getPotential(Rate rate_type,
const std::string& group_name)
const;
88 std::tuple<Scalar,Scalar,Scalar,Scalar> getRates(
const int group_idx)
const;
89 std::optional<Scalar> gasTarget(
const std::string& group_name)
const;
90 std::optional<Scalar> getTarget(Rate rate_type,
const std::string& group_name)
const;
91 const std::string& groupIdxToName(
int group_idx)
const;
92 bool hasAnyTarget(
const std::string& group_name)
const;
93 bool hasWell(
const std::string& well_name);
95 std::optional<Scalar> liquidTarget(
const std::string& group_name)
const;
96 std::optional<Scalar> maxAlq(
const std::string& group_name);
97 std::optional<Scalar> maxTotalGasRate(
const std::string& group_name);
98 Scalar oilRate(
const std::string& group_name)
const;
99 std::optional<Scalar> oilTarget(
const std::string& group_name)
const;
100 static const std::string rateToString(Rate rate);
101 Scalar waterRate(
const std::string& group_name)
const;
102 std::optional<Scalar> waterTarget(
const std::string& group_name)
const;
103 void update(
const std::string& well_name,
108 void updateRate(
int idx,
113 const Well2GroupMap& wellGroupMap() {
return well_group_map_; }
116 bool checkDoGasLiftOptimization_(
const std::string& well_name);
117 bool checkNewtonIterationIdxOk_(
const std::string& well_name);
118 void debugDisplayWellContribution_(
const std::string& gr_name,
119 const std::string& well_name,
121 Scalar well_oil_rate,
122 Scalar well_gas_rate,
123 Scalar well_water_rate,
129 void debugDisplayUpdatedGroupRates(
const std::string& name,
134 void debugEndInitializeGroup(
const std::string& name)
const;
135 void debugStartInitializeGroup(
const std::string& name)
const;
136 void displayDebugMessage_(
const std::string& msg)
const override;
137 void displayDebugMessage_(
const std::string& msg,
const std::string& well_name);
139 std::tuple<Scalar, Scalar, Scalar, Scalar, Scalar, Scalar>
140 getProducerWellRates_(
const Well* well,
const int index);
142 std::tuple<Scalar, Scalar, Scalar, Scalar, Scalar, Scalar, Scalar>
143 initializeGroupRatesRecursive_(
const Group &group);
145 void initializeWell2GroupMapRecursive_(
const Group& group,
146 std::vector<std::string>& group_names,
147 std::vector<Scalar>& group_efficiency,
148 Scalar cur_efficiency);
149 void updateGroupIdxMap_(
const std::string& group_name);
153 GroupRates(Scalar oil_rate,
157 Scalar oil_potential,
158 Scalar gas_potential,
159 Scalar water_potential,
160 std::optional<Scalar> oil_target,
161 std::optional<Scalar> gas_target,
162 std::optional<Scalar> water_target,
163 std::optional<Scalar> liquid_target,
164 std::optional<Scalar> total_gas,
165 std::optional<Scalar> max_alq)
166 : oil_rate_{oil_rate}
167 , gas_rate_{gas_rate}
168 , water_rate_{water_rate}
170 , oil_potential_{oil_potential}
171 , gas_potential_{gas_potential}
172 , water_potential_{water_potential}
173 , oil_target_{oil_target}
174 , gas_target_{gas_target}
175 , water_target_{water_target}
176 , liquid_target_{liquid_target}
177 , total_gas_{total_gas}
181 Scalar alq()
const {
return alq_; }
182 void assign(Scalar oil_rate,
187 oil_rate_ = oil_rate;
188 gas_rate_ = gas_rate;
189 water_rate_ = water_rate;
192 Scalar gasRate()
const {
return gas_rate_; }
193 Scalar waterRate()
const {
return water_rate_; }
194 std::optional<Scalar> gasTarget()
const {
return gas_target_; }
195 std::optional<Scalar> waterTarget()
const {
return water_target_; }
196 std::optional<Scalar> maxAlq()
const {
return max_alq_; }
197 std::optional<Scalar > maxTotalGasRate()
const {
return total_gas_; }
198 Scalar oilRate()
const {
return oil_rate_; }
199 std::optional<Scalar> oilTarget()
const {
return oil_target_; }
200 std::optional<Scalar> liquidTarget()
const {
return liquid_target_; }
201 Scalar oilPotential()
const {
return oil_potential_; }
202 Scalar gasPotential()
const {
return gas_potential_; }
203 Scalar waterPotential()
const {
return water_potential_; }
205 void update(Scalar delta_oil,
210 oil_rate_ += delta_oil;
211 gas_rate_ += delta_gas;
212 water_rate_ += delta_water;
223 Scalar oil_potential_;
224 Scalar gas_potential_;
225 Scalar water_potential_;
226 std::optional<Scalar> oil_target_;
227 std::optional<Scalar> gas_target_;
228 std::optional<Scalar> water_target_;
229 std::optional<Scalar> liquid_target_;
230 std::optional<Scalar> total_gas_;
231 std::optional<Scalar> max_alq_;
234 GLiftEclWells& ecl_wells_;
235 const Schedule& schedule_;
236 const SummaryState& summary_state_;
237 const int report_step_idx_;
240 const GasLiftOpt& glo_;
241 GroupRateMap group_rate_map_;
242 Well2GroupMap well_group_map_;
243 GroupIdxMap group_idx_;
244 int next_group_idx_ = 0;
246 bool optimize_only_thp_wells_ =
false;
Context for iteration-dependent decisions in the Newton solver.
Definition NewtonIterationContext.hpp:43