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_field_or_none_control(
const std::string& gname)
const;
98 bool has_field_or_none_control(
const std::string& gname, Phase injection_phase)
const;
99 bool has_production_control(
const std::string& gname)
const;
100 void production_control(
const std::string& gname, Group::ProductionCMode cmode);
101 Group::ProductionCMode production_control(
const std::string& gname)
const;
102 const std::map<std::string, Group::ProductionCMode>& get_production_controls()
const;
104 bool has_injection_control(
const std::string& gname, Phase phase)
const;
105 void injection_control(
const std::string& gname, Phase phase, Group::InjectionCMode cmode);
106 Group::InjectionCMode injection_control(
const std::string& gname, Phase phase)
const;
108 void update_number_of_wells_under_group_control(
const std::string& gname,
int number);
109 int number_of_wells_under_group_control(
const std::string& gname)
const;
111 void update_number_of_wells_under_inj_group_control(
const std::string& gname, Phase phase,
int number);
112 int number_of_wells_under_inj_group_control(
const std::string& gname, Phase phase)
const;
115 void update_gconsump(
const Schedule& schedule,
const int report_step,
const SummaryState& summary_state);
116 const std::pair<Scalar, Scalar>& gconsump_rates(
const std::string& gname)
const;
118 struct GroupPotential {
123 GroupPotential(Scalar oil = 0.0, Scalar gas = 0.0, Scalar water = 0.0)
124 : oil_rate(oil), gas_rate(gas), water_rate(water) {}
126 bool has_production_group_potential(
const std::string& gname)
const;
127 void update_group_production_potential(
128 const std::string& gname, Scalar oil_rate, Scalar gas_rate, Scalar water_rate
130 const GroupPotential& get_production_group_potential(
const std::string& gname)
const;
132 std::size_t data_size()
const;
133 std::size_t collect(Scalar* data)
const;
134 std::size_t distribute(
const Scalar* data);
136 GPMaint::State& gpmaint(
const std::string& gname);
139 void communicate_rates(
const Comm& comm)
148 auto iterateContainer = [](
auto& container,
const auto& func) {
149 for (
auto& x : container) {
155 auto forAllGroupData = [&](
auto& func) {
156 iterateContainer(m_production_rates, func);
157 iterateContainer(m_network_leaf_node_production_rates, func);
158 iterateContainer(prod_red_rates, func);
159 iterateContainer(inj_red_rates, func);
160 iterateContainer(inj_resv_rates, func);
161 iterateContainer(inj_rein_rates, func);
162 iterateContainer(inj_surface_rates, func);
167 auto computeSize = [&sz](
const auto& v) {
170 forAllGroupData(computeSize);
171 sz += this->inj_vrep_rate.size();
174 std::vector<Scalar> data(sz);
179 auto doCollect = [&data, &pos](
auto& v) {
185 forAllGroupData(doCollect);
186 for (
const auto& x : this->inj_vrep_rate) {
187 data[pos++] = x.second;
190 throw std::logic_error(
"Internal size mismatch when collecting groupData");
193 comm.sum(data.data(), data.size());
197 auto doDistribute = [&data, &pos](
auto& v) {
198 std::copy_n(data.begin() + pos, v.size(), v.begin());
201 forAllGroupData(doDistribute);
202 for (
auto& x : this->inj_vrep_rate) {
203 x.second = data[pos++];
206 throw std::logic_error(
"Internal size mismatch when distributing groupData");
209 template<
class Serializer>
210 void serializeOp(Serializer& serializer)
212 serializer(num_phases);
213 serializer(m_production_rates);
214 serializer(m_network_leaf_node_production_rates);
215 serializer(production_controls);
216 serializer(group_thp);
217 serializer(prod_red_rates);
218 serializer(inj_red_rates);
219 serializer(inj_surface_rates);
220 serializer(inj_resv_rates);
221 serializer(inj_rein_rates);
222 serializer(inj_vrep_rate);
223 serializer(m_grat_sales_target);
224 serializer(m_gpmaint_target);
225 serializer(injection_controls);
226 serializer(gpmaint_state);
227 serializer(m_gconsump_rates);
228 serializer(m_number_of_wells_under_group_control);
229 serializer(m_number_of_wells_under_inj_group_control);
233 std::size_t num_phases{};
234 std::map<std::string, std::vector<Scalar>> m_production_rates;
235 std::map<std::string, std::vector<Scalar>> m_network_leaf_node_production_rates;
236 std::map<std::string, Group::ProductionCMode> production_controls;
237 std::map<std::string, std::vector<Scalar>> prod_red_rates;
238 std::map<std::string, std::vector<Scalar>> inj_red_rates;
239 std::map<std::string, std::vector<Scalar>> inj_surface_rates;
240 std::map<std::string, std::vector<Scalar>> inj_resv_rates;
241 std::map<std::string, std::vector<Scalar>> inj_rein_rates;
242 std::map<std::string, Scalar> inj_vrep_rate;
243 std::map<std::string, Scalar> m_grat_sales_target;
244 std::map<std::string, Scalar> m_gpmaint_target;
245 std::map<std::string, Scalar> group_thp;
246 std::map<std::string, GroupPotential> production_group_potentials;
247 std::map<std::string, int> m_number_of_wells_under_group_control;
248 std::map<std::pair<Phase, std::string>,
int> m_number_of_wells_under_inj_group_control;
251 std::map<std::pair<Phase, std::string>, Group::InjectionCMode> injection_controls;
252 WellContainer<GPMaint::State> gpmaint_state;
253 std::map<std::string, std::pair<Scalar, Scalar>> m_gconsump_rates;
254 static constexpr std::pair<Scalar, Scalar> zero_pair = {0.0, 0.0};