59 std::map<std::string, std::vector<std::pair<std::string,double>>>;
61 std::map<std::string, GroupRates>;
62 using GroupIdxMap = std::map<std::string, int>;
63 using Communication = Dune::Communication<Dune::MPIHelper::MPICommunicator>;
67 static const int Water = BlackoilPhases::Aqua;
68 static const int Oil = BlackoilPhases::Liquid;
69 static const int Gas = BlackoilPhases::Vapour;
71 enum class Rate {oil, gas, water, liquid};
73 using GLiftEclWells = std::map<std::string,std::pair<const Well *,int>>;
84 const Parallel::Communication& comm,
87 std::vector<std::pair<std::string,double>>& getWellGroups(
88 const std::string& well_name);
91 double gasRate(
const std::string&
group_name)
const;
92 double gasPotential(
const std::string&
group_name)
const;
93 double waterPotential(
const std::string&
group_name)
const;
94 double oilPotential(
const std::string&
group_name)
const;
95 int getGroupIdx(
const std::string&
group_name);
98 std::tuple<double,double,double,double> getRates(
const int group_idx)
const;
99 std::optional<double> gasTarget(
const std::string&
group_name)
const;
100 std::optional<double> getTarget(
102 const std::string& groupIdxToName(
int group_idx)
const;
103 bool hasAnyTarget(
const std::string&
group_name)
const;
104 bool hasWell(
const std::string& well_name);
106 std::optional<double> liquidTarget(
const std::string&
group_name)
const;
107 std::optional<double> maxAlq(
const std::string&
group_name);
108 std::optional<double> maxTotalGasRate(
const std::string&
group_name);
109 double oilRate(
const std::string&
group_name)
const;
110 std::optional<double> oilTarget(
const std::string&
group_name)
const;
111 static const std::string rateToString(Rate
rate);
112 double waterRate(
const std::string&
group_name)
const;
113 std::optional<double> waterTarget(
const std::string&
group_name)
const;
114 void update(
const std::string& well_name,
116 void updateRate(
int idx,
double oil_rate,
double gas_rate,
double water_rate,
double alq);
117 const Well2GroupMap& wellGroupMap() {
return well_group_map_; }
119 bool checkDoGasLiftOptimization_(
const std::string& well_name);
120 bool checkNewtonIterationIdxOk_(
const std::string& well_name);
121 void debugDisplayWellContribution_(
122 const std::string&
gr_name,
const std::string& well_name,
126 double oil_rate,
double gas_rate,
double water_rate,
129 void debugDisplayUpdatedGroupRates(
const std::string& name,
130 double oil_rate,
double gas_rate,
double water_rate,
double alq)
const;
131 void debugEndInitializeGroup(
const std::string& name)
const;
132 void debugStartInitializeGroup(
const std::string& name)
const;
133 void displayDebugMessage_(
const std::string&
msg)
const override;
134 void displayDebugMessage_(
const std::string&
msg,
const std::string& well_name);
135 std::tuple<double, double, double, double, double, double>
136 getProducerWellRates_(
const Well* well,
const int index);
137 std::tuple<double, double, double, double, double, double, double>
138 initializeGroupRatesRecursive_(
const Group &group);
139 void initializeWell2GroupMapRecursive_(
140 const Group& group, std::vector<std::string>&
group_names,
142 void updateGroupIdxMap_(
const std::string&
group_name);
147 GroupRates(
double oil_rate,
double gas_rate,
double water_rate,
double alq,
149 std::optional<double> oil_target,
150 std::optional<double> gas_target,
151 std::optional<double> water_target,
152 std::optional<double> liquid_target,
158 water_rate_{water_rate},
163 oil_target_{oil_target},
164 gas_target_{gas_target},
165 water_target_{water_target},
166 liquid_target_{liquid_target},
170 double alq()
const {
return alq_; }
171 void assign(
double oil_rate,
double gas_rate,
double water_rate,
double alq)
173 oil_rate_ = oil_rate;
174 gas_rate_ = gas_rate;
175 water_rate_ = water_rate;
178 double gasRate()
const {
return gas_rate_; }
179 double waterRate()
const {
return water_rate_; }
180 std::optional<double> gasTarget()
const {
return gas_target_; }
181 std::optional<double> waterTarget()
const {
return water_target_; }
182 std::optional<double> maxAlq()
const {
return max_alq_; }
183 std::optional<double> maxTotalGasRate()
const {
return total_gas_; }
184 double oilRate()
const {
return oil_rate_; }
185 std::optional<double> oilTarget()
const {
return oil_target_; }
186 std::optional<double> liquidTarget()
const {
return liquid_target_; }
187 double oilPotential()
const {
return oil_potential_; }
188 double gasPotential()
const {
return gas_potential_; }
189 double waterPotential()
const {
return water_potential_; }
205 double oil_potential_;
206 double gas_potential_;
207 double water_potential_;
208 std::optional<double> oil_target_;
209 std::optional<double> gas_target_;
210 std::optional<double> water_target_;
211 std::optional<double> liquid_target_;
212 std::optional<double> total_gas_;
213 std::optional<double> max_alq_;
216 GLiftEclWells &ecl_wells_;
219 const int report_step_idx_;
220 const int iteration_idx_;
223 GroupRateMap group_rate_map_;
224 Well2GroupMap well_group_map_;
225 GroupIdxMap group_idx_;
226 int next_group_idx_ = 0;
228 bool optimize_only_thp_wells_ =
false;