55 std::map<std::string, std::vector<std::pair<std::string,Scalar>>>;
57 std::map<std::string, GroupRates>;
58 using GroupIdxMap = std::map<std::string, int>;
59 using Communication = Dune::Communication<Dune::MPIHelper::MPICommunicator>;
63 static const int Water = BlackoilPhases::Aqua;
64 static const int Oil = BlackoilPhases::Liquid;
65 static const int Gas = BlackoilPhases::Vapour;
68 enum class Rate {oil, gas, water, liquid};
70 using GLiftEclWells = std::map<std::string,std::pair<const Well *,int>>;
80 const Parallel::Communication& comm,
83 std::vector<std::pair<std::string,Scalar>>&
84 getWellGroups(
const std::string& well_name);
87 Scalar gasRate(
const std::string&
group_name)
const;
88 Scalar gasPotential(
const std::string&
group_name)
const;
89 Scalar waterPotential(
const std::string&
group_name)
const;
90 Scalar oilPotential(
const std::string&
group_name)
const;
91 int getGroupIdx(
const std::string&
group_name);
94 std::tuple<Scalar,Scalar,Scalar,Scalar> getRates(
const int group_idx)
const;
95 std::optional<Scalar> gasTarget(
const std::string&
group_name)
const;
97 const std::string& groupIdxToName(
int group_idx)
const;
98 bool hasAnyTarget(
const std::string&
group_name)
const;
99 bool hasWell(
const std::string& well_name);
101 std::optional<Scalar> liquidTarget(
const std::string&
group_name)
const;
102 std::optional<Scalar> maxAlq(
const std::string&
group_name);
103 std::optional<Scalar> maxTotalGasRate(
const std::string&
group_name);
104 Scalar oilRate(
const std::string&
group_name)
const;
105 std::optional<Scalar> oilTarget(
const std::string&
group_name)
const;
106 static const std::string rateToString(Rate rate);
107 Scalar waterRate(
const std::string&
group_name)
const;
108 std::optional<Scalar> waterTarget(
const std::string&
group_name)
const;
109 void update(
const std::string& well_name,
114 void updateRate(
int idx,
119 const Well2GroupMap& wellGroupMap() {
return well_group_map_; }
122 bool checkDoGasLiftOptimization_(
const std::string& well_name);
123 bool checkNewtonIterationIdxOk_(
const std::string& well_name);
124 void debugDisplayWellContribution_(
const std::string&
gr_name,
125 const std::string& well_name,
135 void debugDisplayUpdatedGroupRates(
const std::string& name,
140 void debugEndInitializeGroup(
const std::string& name)
const;
141 void debugStartInitializeGroup(
const std::string& name)
const;
142 void displayDebugMessage_(
const std::string&
msg)
const override;
143 void displayDebugMessage_(
const std::string&
msg,
const std::string& well_name);
145 std::tuple<Scalar, Scalar, Scalar, Scalar, Scalar, Scalar>
146 getProducerWellRates_(
const Well* well,
const int index);
148 std::tuple<Scalar, Scalar, Scalar, Scalar, Scalar, Scalar, Scalar>
149 initializeGroupRatesRecursive_(
const Group &group);
151 void initializeWell2GroupMapRecursive_(
const Group& group,
155 void updateGroupIdxMap_(
const std::string&
group_name);
166 std::optional<Scalar> oil_target,
167 std::optional<Scalar> gas_target,
168 std::optional<Scalar> water_target,
169 std::optional<Scalar> liquid_target,
172 : oil_rate_{oil_rate}
173 , gas_rate_{gas_rate}
174 , water_rate_{water_rate}
179 , oil_target_{oil_target}
180 , gas_target_{gas_target}
181 , water_target_{water_target}
182 , liquid_target_{liquid_target}
187 Scalar alq()
const {
return alq_; }
188 void assign(Scalar oil_rate,
193 oil_rate_ = oil_rate;
194 gas_rate_ = gas_rate;
195 water_rate_ = water_rate;
198 Scalar gasRate()
const {
return gas_rate_; }
199 Scalar waterRate()
const {
return water_rate_; }
200 std::optional<Scalar> gasTarget()
const {
return gas_target_; }
201 std::optional<Scalar> waterTarget()
const {
return water_target_; }
202 std::optional<Scalar> maxAlq()
const {
return max_alq_; }
203 std::optional<Scalar > maxTotalGasRate()
const {
return total_gas_; }
204 Scalar oilRate()
const {
return oil_rate_; }
205 std::optional<Scalar> oilTarget()
const {
return oil_target_; }
206 std::optional<Scalar> liquidTarget()
const {
return liquid_target_; }
207 Scalar oilPotential()
const {
return oil_potential_; }
208 Scalar gasPotential()
const {
return gas_potential_; }
209 Scalar waterPotential()
const {
return water_potential_; }
229 Scalar oil_potential_;
230 Scalar gas_potential_;
231 Scalar water_potential_;
232 std::optional<Scalar> oil_target_;
233 std::optional<Scalar> gas_target_;
234 std::optional<Scalar> water_target_;
235 std::optional<Scalar> liquid_target_;
236 std::optional<Scalar> total_gas_;
237 std::optional<Scalar> max_alq_;
240 GLiftEclWells& ecl_wells_;
243 const int report_step_idx_;
244 const int iteration_idx_;
247 GroupRateMap group_rate_map_;
248 Well2GroupMap well_group_map_;
249 GroupIdxMap group_idx_;
250 int next_group_idx_ = 0;
252 bool optimize_only_thp_wells_ =
false;