GasLiftGroupInfo.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_GROUP_INFO_HEADER_INCLUDED
21#define OPM_GASLIFT_GROUP_INFO_HEADER_INCLUDED
22
25
26#include <map>
27#include <optional>
28#include <string>
29#include <tuple>
30#include <vector>
31
32namespace Opm {
33
34class DeferredLogger;
35class GasLiftOpt;
36class Group;
37template<class Scalar> class GroupState;
38class Schedule;
39class SummaryState;
40class Well;
41template<class Scalar> class WellState;
42
43template<class Scalar>
44class GasLiftGroupInfo : public GasLiftCommon<Scalar>
45{
46protected:
47 class GroupRates;
48 // NOTE: In the Well2GroupMap below, in the std::vector value we store
49 // pairs of group names and efficiency factors. The efficiency factors
50 // are the product of the wells efficiency factor and all the efficiency
51 // factors of the child groups of the group all the way down
52 // to the well group.
54 std::map<std::string, std::vector<std::pair<std::string,Scalar>>>;
56 std::map<std::string, GroupRates>;
57 using GroupIdxMap = std::map<std::string, int>;
58 using Communication = Dune::Communication<Dune::MPIHelper::MPICommunicator>;
59
60 // TODO: same definition with WellInterface, and
61 // WellState eventually they should go to a common header file.
62 static const int Water = BlackoilPhases::Aqua;
63 static const int Oil = BlackoilPhases::Liquid;
64 static const int Gas = BlackoilPhases::Vapour;
65
66public:
67 enum class Rate {oil, gas, water, liquid};
68
69 using GLiftEclWells = std::map<std::string,std::pair<const Well *,int>>;
71 const Schedule& schedule,
72 const SummaryState& summary_state,
73 const int report_step_idx,
74 const int iteration_idx,
75 const PhaseUsage& phase_usage,
76 DeferredLogger& deferred_logger,
77 WellState<Scalar>& well_state,
78 const GroupState<Scalar>& group_state,
79 const Parallel::Communication& comm,
80 bool glift_debug);
81
82 std::vector<std::pair<std::string,Scalar>>&
83 getWellGroups(const std::string& well_name);
84
85 Scalar alqRate(const std::string& group_name);
86 Scalar gasRate(const std::string& group_name) const;
87 Scalar gasPotential(const std::string& group_name) const;
88 Scalar waterPotential(const std::string& group_name) const;
89 Scalar oilPotential(const std::string& group_name) const;
90 int getGroupIdx(const std::string& group_name);
91 Scalar getRate(Rate rate_type, const std::string& group_name) const;
92 Scalar getPotential(Rate rate_type, const std::string& group_name) const;
93 std::tuple<Scalar,Scalar,Scalar,Scalar> getRates(const int group_idx) const;
94 std::optional<Scalar> gasTarget(const std::string& group_name) const;
95 std::optional<Scalar> getTarget(Rate rate_type, const std::string& group_name) const;
96 const std::string& groupIdxToName(int group_idx) const;
97 bool hasAnyTarget(const std::string& group_name) const;
98 bool hasWell(const std::string& well_name);
99 void initialize();
100 std::optional<Scalar> liquidTarget(const std::string& group_name) const;
101 std::optional<Scalar> maxAlq(const std::string& group_name);
102 std::optional<Scalar> maxTotalGasRate(const std::string& group_name);
103 Scalar oilRate(const std::string& group_name) const;
104 std::optional<Scalar> oilTarget(const std::string& group_name) const;
105 static const std::string rateToString(Rate rate);
106 Scalar waterRate(const std::string& group_name) const;
107 std::optional<Scalar> waterTarget(const std::string& group_name) const;
108 void update(const std::string& well_name,
109 Scalar delta_oil,
110 Scalar delta_gas,
111 Scalar delta_water,
112 Scalar delta_alq);
113 void updateRate(int idx,
114 Scalar oil_rate,
115 Scalar gas_rate,
116 Scalar water_rate,
117 Scalar alq);
119
120protected:
121 bool checkDoGasLiftOptimization_(const std::string& well_name);
122 bool checkNewtonIterationIdxOk_(const std::string& well_name);
123 void debugDisplayWellContribution_(const std::string& gr_name,
124 const std::string& well_name,
125 Scalar eff_factor,
126 Scalar well_oil_rate,
127 Scalar well_gas_rate,
128 Scalar well_water_rate,
129 Scalar well_alq,
130 Scalar oil_rate,
131 Scalar gas_rate,
132 Scalar water_rate,
133 Scalar alq) const;
134 void debugDisplayUpdatedGroupRates(const std::string& name,
135 Scalar oil_rate,
136 Scalar gas_rate,
137 Scalar water_rate,
138 Scalar alq) const;
139 void debugEndInitializeGroup(const std::string& name) const;
140 void debugStartInitializeGroup(const std::string& name) const;
141 void displayDebugMessage_(const std::string& msg) const override;
142 void displayDebugMessage_(const std::string& msg, const std::string& well_name);
143
144 std::tuple<Scalar, Scalar, Scalar, Scalar, Scalar, Scalar>
145 getProducerWellRates_(const Well* well, const int index);
146
147 std::tuple<Scalar, Scalar, Scalar, Scalar, Scalar, Scalar, Scalar>
149
150 void initializeWell2GroupMapRecursive_(const Group& group,
151 std::vector<std::string>& group_names,
152 std::vector<Scalar>& group_efficiency,
153 Scalar cur_efficiency);
154 void updateGroupIdxMap_(const std::string& group_name);
155
157 public:
158 GroupRates(Scalar oil_rate,
159 Scalar gas_rate,
160 Scalar water_rate,
161 Scalar alq,
162 Scalar oil_potential,
163 Scalar gas_potential,
164 Scalar water_potential,
165 std::optional<Scalar> oil_target,
166 std::optional<Scalar> gas_target,
167 std::optional<Scalar> water_target,
168 std::optional<Scalar> liquid_target,
169 std::optional<Scalar> total_gas,
170 std::optional<Scalar> max_alq)
171 : oil_rate_{oil_rate}
172 , gas_rate_{gas_rate}
173 , water_rate_{water_rate}
174 , alq_{alq}
175 , oil_potential_{oil_potential}
176 , gas_potential_{gas_potential}
177 , water_potential_{water_potential}
178 , oil_target_{oil_target}
179 , gas_target_{gas_target}
180 , water_target_{water_target}
181 , liquid_target_{liquid_target}
182 , total_gas_{total_gas}
183 , max_alq_{max_alq}
184 {}
185
186 Scalar alq() const { return alq_; }
187 void assign(Scalar oil_rate,
188 Scalar gas_rate,
189 Scalar water_rate,
190 Scalar alq)
191 {
192 oil_rate_ = oil_rate;
193 gas_rate_ = gas_rate;
194 water_rate_ = water_rate;
195 alq_ = alq;
196 }
197 Scalar gasRate() const { return gas_rate_; }
198 Scalar waterRate() const { return water_rate_; }
199 std::optional<Scalar> gasTarget() const { return gas_target_; }
200 std::optional<Scalar> waterTarget() const { return water_target_; }
201 std::optional<Scalar> maxAlq() const { return max_alq_; }
202 std::optional<Scalar > maxTotalGasRate() const { return total_gas_; }
203 Scalar oilRate() const { return oil_rate_; }
204 std::optional<Scalar> oilTarget() const { return oil_target_; }
205 std::optional<Scalar> liquidTarget() const { return liquid_target_; }
206 Scalar oilPotential() const { return oil_potential_; }
207 Scalar gasPotential() const { return gas_potential_; }
208 Scalar waterPotential() const { return water_potential_; }
209
210 void update(Scalar delta_oil,
211 Scalar delta_gas,
212 Scalar delta_water,
213 Scalar delta_alq)
214 {
215 oil_rate_ += delta_oil;
216 gas_rate_ += delta_gas;
217 water_rate_ += delta_water;
218 alq_ += delta_alq;
219 // Note. We don't updata the potentials at this point. They
220 // are only needed initially.
221 }
222
223 private:
224 Scalar oil_rate_;
225 Scalar gas_rate_;
226 Scalar water_rate_;
227 Scalar alq_;
228 Scalar oil_potential_;
229 Scalar gas_potential_;
230 Scalar water_potential_;
231 std::optional<Scalar> oil_target_;
232 std::optional<Scalar> gas_target_;
233 std::optional<Scalar> water_target_;
234 std::optional<Scalar> liquid_target_;
235 std::optional<Scalar> total_gas_;
236 std::optional<Scalar> max_alq_;
237 };
238
240 const Schedule& schedule_;
241 const SummaryState& summary_state_;
243 const int iteration_idx_;
245 const GasLiftOpt& glo_;
250 // Optimize only wells under THP control
252};
253
254} // namespace Opm
255
256#endif // OPM_GASLIFT_GROUP_INFO_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:156
std::optional< Scalar > gasTarget() const
Definition: GasLiftGroupInfo.hpp:199
Scalar gasRate() const
Definition: GasLiftGroupInfo.hpp:197
std::optional< Scalar > liquidTarget() const
Definition: GasLiftGroupInfo.hpp:205
GroupRates(Scalar oil_rate, Scalar gas_rate, Scalar water_rate, Scalar alq, Scalar oil_potential, Scalar gas_potential, Scalar water_potential, std::optional< Scalar > oil_target, std::optional< Scalar > gas_target, std::optional< Scalar > water_target, std::optional< Scalar > liquid_target, std::optional< Scalar > total_gas, std::optional< Scalar > max_alq)
Definition: GasLiftGroupInfo.hpp:158
std::optional< Scalar > oilTarget() const
Definition: GasLiftGroupInfo.hpp:204
Scalar oilRate() const
Definition: GasLiftGroupInfo.hpp:203
void assign(Scalar oil_rate, Scalar gas_rate, Scalar water_rate, Scalar alq)
Definition: GasLiftGroupInfo.hpp:187
Scalar alq() const
Definition: GasLiftGroupInfo.hpp:186
Scalar waterRate() const
Definition: GasLiftGroupInfo.hpp:198
std::optional< Scalar > maxAlq() const
Definition: GasLiftGroupInfo.hpp:201
Scalar oilPotential() const
Definition: GasLiftGroupInfo.hpp:206
Scalar gasPotential() const
Definition: GasLiftGroupInfo.hpp:207
std::optional< Scalar > waterTarget() const
Definition: GasLiftGroupInfo.hpp:200
std::optional< Scalar > maxTotalGasRate() const
Definition: GasLiftGroupInfo.hpp:202
void update(Scalar delta_oil, Scalar delta_gas, Scalar delta_water, Scalar delta_alq)
Definition: GasLiftGroupInfo.hpp:210
Scalar waterPotential() const
Definition: GasLiftGroupInfo.hpp:208
Definition: GasLiftGroupInfo.hpp:45
Scalar oilRate(const std::string &group_name) const
GroupIdxMap group_idx_
Definition: GasLiftGroupInfo.hpp:248
const GasLiftOpt & glo_
Definition: GasLiftGroupInfo.hpp:245
Scalar getRate(Rate rate_type, const std::string &group_name) const
void debugDisplayUpdatedGroupRates(const std::string &name, Scalar oil_rate, Scalar gas_rate, Scalar water_rate, Scalar alq) const
const SummaryState & summary_state_
Definition: GasLiftGroupInfo.hpp:241
std::vector< std::pair< std::string, Scalar > > & getWellGroups(const std::string &well_name)
GasLiftGroupInfo(GLiftEclWells &ecl_wells, const Schedule &schedule, const SummaryState &summary_state, const int report_step_idx, const int iteration_idx, const PhaseUsage &phase_usage, DeferredLogger &deferred_logger, WellState< Scalar > &well_state, const GroupState< Scalar > &group_state, const Parallel::Communication &comm, bool glift_debug)
static const int Gas
Definition: GasLiftGroupInfo.hpp:64
const int iteration_idx_
Definition: GasLiftGroupInfo.hpp:243
std::map< std::string, std::pair< const Well *, int > > GLiftEclWells
Definition: GasLiftGroupInfo.hpp:69
void initializeWell2GroupMapRecursive_(const Group &group, std::vector< std::string > &group_names, std::vector< Scalar > &group_efficiency, Scalar cur_efficiency)
Scalar alqRate(const std::string &group_name)
std::map< std::string, GroupRates > GroupRateMap
Definition: GasLiftGroupInfo.hpp:56
GroupRateMap group_rate_map_
Definition: GasLiftGroupInfo.hpp:246
bool checkNewtonIterationIdxOk_(const std::string &well_name)
Scalar waterPotential(const std::string &group_name) const
Rate
Definition: GasLiftGroupInfo.hpp:67
std::map< std::string, std::vector< std::pair< std::string, Scalar > > > Well2GroupMap
Definition: GasLiftGroupInfo.hpp:54
std::optional< Scalar > liquidTarget(const std::string &group_name) const
static const int Water
Definition: GasLiftGroupInfo.hpp:62
void updateGroupIdxMap_(const std::string &group_name)
void displayDebugMessage_(const std::string &msg, const std::string &well_name)
void debugDisplayWellContribution_(const std::string &gr_name, const std::string &well_name, Scalar eff_factor, Scalar well_oil_rate, Scalar well_gas_rate, Scalar well_water_rate, Scalar well_alq, Scalar oil_rate, Scalar gas_rate, Scalar water_rate, Scalar alq) const
const Schedule & schedule_
Definition: GasLiftGroupInfo.hpp:240
void displayDebugMessage_(const std::string &msg) const override
static const int Oil
Definition: GasLiftGroupInfo.hpp:63
bool optimize_only_thp_wells_
Definition: GasLiftGroupInfo.hpp:251
Scalar getPotential(Rate rate_type, const std::string &group_name) const
std::tuple< Scalar, Scalar, Scalar, Scalar, Scalar, Scalar > getProducerWellRates_(const Well *well, const int index)
const std::string & groupIdxToName(int group_idx) const
int next_group_idx_
Definition: GasLiftGroupInfo.hpp:249
std::map< std::string, int > GroupIdxMap
Definition: GasLiftGroupInfo.hpp:57
const PhaseUsage & phase_usage_
Definition: GasLiftGroupInfo.hpp:244
bool checkDoGasLiftOptimization_(const std::string &well_name)
const Well2GroupMap & wellGroupMap()
Definition: GasLiftGroupInfo.hpp:118
GLiftEclWells & ecl_wells_
Definition: GasLiftGroupInfo.hpp:239
void update(const std::string &well_name, Scalar delta_oil, Scalar delta_gas, Scalar delta_water, Scalar delta_alq)
std::tuple< Scalar, Scalar, Scalar, Scalar, Scalar, Scalar, Scalar > initializeGroupRatesRecursive_(const Group &group)
Scalar gasPotential(const std::string &group_name) const
Well2GroupMap well_group_map_
Definition: GasLiftGroupInfo.hpp:247
std::optional< Scalar > maxTotalGasRate(const std::string &group_name)
const int report_step_idx_
Definition: GasLiftGroupInfo.hpp:242
std::optional< Scalar > maxAlq(const std::string &group_name)
Dune::Communication< Dune::MPIHelper::MPICommunicator > Communication
Definition: GasLiftGroupInfo.hpp:58
Scalar gasRate(const std::string &group_name) const
std::optional< Scalar > gasTarget(const std::string &group_name) const
void debugStartInitializeGroup(const std::string &name) const
Scalar oilPotential(const std::string &group_name) const
std::tuple< Scalar, Scalar, Scalar, Scalar > getRates(const int group_idx) const
std::optional< Scalar > waterTarget(const std::string &group_name) const
bool hasWell(const std::string &well_name)
void updateRate(int idx, Scalar oil_rate, Scalar gas_rate, Scalar water_rate, Scalar alq)
int getGroupIdx(const std::string &group_name)
void debugEndInitializeGroup(const std::string &name) const
Scalar waterRate(const std::string &group_name) const
bool hasAnyTarget(const std::string &group_name) const
static const std::string rateToString(Rate rate)
std::optional< Scalar > oilTarget(const std::string &group_name) const
std::optional< Scalar > getTarget(Rate rate_type, const std::string &group_name) const
Definition: GroupState.hpp:35
Definition: WellState.hpp:62
Dune::Communication< MPIComm > Communication
Definition: ParallelCommunication.hpp:30
bool water(const PhaseUsage &pu)
Definition: RegionAttributeHelpers.hpp:308
bool oil(const PhaseUsage &pu)
Definition: RegionAttributeHelpers.hpp:321
bool gas(const PhaseUsage &pu)
Definition: RegionAttributeHelpers.hpp:334
Definition: BlackoilPhases.hpp:27
Definition: BlackoilPhases.hpp:46