43 GroupState() =
default;
44 explicit GroupState(std::size_t num_phases);
46 static GroupState serializationTestObject();
48 bool operator==(
const GroupState& other)
const;
50 bool has_production_rates(
const std::string& gname)
const;
51 void update_production_rates(
const std::string& gname,
52 const std::vector<Scalar>& rates);
53 void update_network_leaf_node_production_rates(
const std::string& gname,
54 const std::vector<Scalar>& rates);
55 const std::vector<Scalar>& production_rates(
const std::string& gname)
const;
56 const std::vector<Scalar>& network_leaf_node_production_rates(
const std::string& gname)
const;
58 void update_well_group_thp(
const std::string& gname,
const double& thp);
59 Scalar well_group_thp(
const std::string& gname)
const;
60 bool is_autochoke_group(
const std::string& gname)
const;
62 bool has_production_reduction_rates(
const std::string& gname)
const;
63 void update_production_reduction_rates(
const std::string& gname,
64 const std::vector<Scalar>& rates);
65 const std::vector<Scalar>& production_reduction_rates(
const std::string& gname)
const;
67 bool has_injection_reduction_rates(
const std::string& gname)
const;
68 void update_injection_reduction_rates(
const std::string& gname,
69 const std::vector<Scalar>& rates);
70 const std::vector<Scalar>& injection_reduction_rates(
const std::string& gname)
const;
72 bool has_injection_reservoir_rates(
const std::string& gname)
const;
73 void update_injection_reservoir_rates(
const std::string& gname,
74 const std::vector<Scalar>& rates);
75 const std::vector<Scalar>& injection_reservoir_rates(
const std::string& gname)
const;
77 bool has_injection_surface_rates(
const std::string& gname)
const;
78 void update_injection_surface_rates(
const std::string& gname,
79 const std::vector<Scalar>& rates);
80 const std::vector<Scalar>& injection_surface_rates(
const std::string& gname)
const;
82 void update_injection_rein_rates(
const std::string& gname,
83 const std::vector<Scalar>& rates);
84 const std::vector<Scalar>& injection_rein_rates(
const std::string& gname)
const;
86 void update_injection_vrep_rate(
const std::string& gname, Scalar rate);
87 Scalar injection_vrep_rate(
const std::string& gname)
const;
89 void update_grat_sales_target(
const std::string& gname, Scalar target);
90 Scalar grat_sales_target(
const std::string& gname)
const;
91 bool has_grat_sales_target(
const std::string& gname)
const;
93 void update_gpmaint_target(
const std::string& gname, Scalar target);
94 Scalar gpmaint_target(
const std::string& gname)
const;
95 bool has_gpmaint_target(
const std::string& gname)
const;
97 bool has_production_control(
const std::string& gname)
const;
98 void production_control(
const std::string& gname, Group::ProductionCMode cmode);
99 Group::ProductionCMode production_control(
const std::string& gname)
const;
101 bool has_injection_control(
const std::string& gname, Phase phase)
const;
102 void injection_control(
const std::string& gname, Phase phase, Group::InjectionCMode cmode);
103 Group::InjectionCMode injection_control(
const std::string& gname, Phase phase)
const;
105 void update_number_of_wells_under_group_control(
const std::string& gname,
int number);
106 int number_of_wells_under_group_control(
const std::string& gname)
const;
108 void update_number_of_wells_under_inj_group_control(
const std::string& gname, Phase phase,
int number);
109 int number_of_wells_under_inj_group_control(
const std::string& gname, Phase phase)
const;
112 void update_gconsump(
const Schedule& schedule,
const int report_step,
const SummaryState& summary_state);
113 const std::pair<Scalar, Scalar>& gconsump_rates(
const std::string& gname)
const;
115 struct GroupPotential {
120 GroupPotential(Scalar oil = 0.0, Scalar gas = 0.0, Scalar water = 0.0)
121 : oil_rate(oil), gas_rate(gas), water_rate(water) {}
124 void update_group_production_potential(
125 const std::string& gname, Scalar oil_rate, Scalar gas_rate, Scalar water_rate
127 const GroupPotential& get_production_group_potential(
const std::string& gname)
const;
129 std::size_t data_size()
const;
130 std::size_t collect(Scalar* data)
const;
131 std::size_t distribute(
const Scalar* data);
133 GPMaint::State& gpmaint(
const std::string& gname);
136 void communicate_rates(
const Comm& comm)
145 auto iterateContainer = [](
auto& container,
const auto& func) {
146 for (
auto& x : container) {
152 auto forAllGroupData = [&](
auto& func) {
153 iterateContainer(m_production_rates, func);
154 iterateContainer(m_network_leaf_node_production_rates, func);
155 iterateContainer(prod_red_rates, func);
156 iterateContainer(inj_red_rates, func);
157 iterateContainer(inj_resv_rates, func);
158 iterateContainer(inj_rein_rates, func);
159 iterateContainer(inj_surface_rates, func);
164 auto computeSize = [&sz](
const auto& v) {
167 forAllGroupData(computeSize);
168 sz += this->inj_vrep_rate.size();
171 std::vector<Scalar> data(sz);
176 auto doCollect = [&data, &pos](
auto& v) {
182 forAllGroupData(doCollect);
183 for (
const auto& x : this->inj_vrep_rate) {
184 data[pos++] = x.second;
187 throw std::logic_error(
"Internal size mismatch when collecting groupData");
190 comm.sum(data.data(), data.size());
194 auto doDistribute = [&data, &pos](
auto& v) {
195 std::copy_n(data.begin() + pos, v.size(), v.begin());
198 forAllGroupData(doDistribute);
199 for (
auto& x : this->inj_vrep_rate) {
200 x.second = data[pos++];
203 throw std::logic_error(
"Internal size mismatch when distributing groupData");
206 template<
class Serializer>
207 void serializeOp(Serializer& serializer)
209 serializer(num_phases);
210 serializer(m_production_rates);
211 serializer(m_network_leaf_node_production_rates);
212 serializer(production_controls);
213 serializer(group_thp);
214 serializer(prod_red_rates);
215 serializer(inj_red_rates);
216 serializer(inj_surface_rates);
217 serializer(inj_resv_rates);
218 serializer(inj_rein_rates);
219 serializer(inj_vrep_rate);
220 serializer(m_grat_sales_target);
221 serializer(m_gpmaint_target);
222 serializer(injection_controls);
223 serializer(gpmaint_state);
224 serializer(m_gconsump_rates);
225 serializer(m_number_of_wells_under_group_control);
226 serializer(m_number_of_wells_under_inj_group_control);
230 std::size_t num_phases{};
231 std::map<std::string, std::vector<Scalar>> m_production_rates;
232 std::map<std::string, std::vector<Scalar>> m_network_leaf_node_production_rates;
233 std::map<std::string, Group::ProductionCMode> production_controls;
234 std::map<std::string, std::vector<Scalar>> prod_red_rates;
235 std::map<std::string, std::vector<Scalar>> inj_red_rates;
236 std::map<std::string, std::vector<Scalar>> inj_surface_rates;
237 std::map<std::string, std::vector<Scalar>> inj_resv_rates;
238 std::map<std::string, std::vector<Scalar>> inj_rein_rates;
239 std::map<std::string, Scalar> inj_vrep_rate;
240 std::map<std::string, Scalar> m_grat_sales_target;
241 std::map<std::string, Scalar> m_gpmaint_target;
242 std::map<std::string, Scalar> group_thp;
243 std::map<std::string, GroupPotential> production_group_potentials;
244 std::map<std::string, int> m_number_of_wells_under_group_control;
245 std::map<std::pair<Phase, std::string>,
int> m_number_of_wells_under_inj_group_control;
248 std::map<std::pair<Phase, std::string>, Group::InjectionCMode> injection_controls;
249 WellContainer<GPMaint::State> gpmaint_state;
250 std::map<std::string, std::pair<Scalar, Scalar>> m_gconsump_rates;
251 static constexpr std::pair<Scalar, Scalar> zero_pair = {0.0, 0.0};