20 #ifndef OPM_GROUPSTATE_HEADER_INCLUDED 21 #define OPM_GROUPSTATE_HEADER_INCLUDED 23 #include <opm/input/eclipse/EclipseState/Phase.hpp> 25 #include <opm/input/eclipse/Schedule/Group/GPMaint.hpp> 26 #include <opm/input/eclipse/Schedule/Group/Group.hpp> 28 #include <opm/simulators/wells/WellContainer.hpp> 40 template<
class Scalar>
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_injection_rates(
const std::string& gname,
54 const std::vector<Scalar>& rates);
55 void update_network_leaf_node_production_rates(
const std::string& gname,
56 const std::vector<Scalar>& rates);
57 const std::vector<Scalar>& production_rates(
const std::string& gname)
const;
58 const std::vector<Scalar>& network_leaf_node_injection_rates(
const std::string& gname)
const;
59 const std::vector<Scalar>& network_leaf_node_production_rates(
const std::string& gname)
const;
61 void update_well_group_thp(
const std::string& gname,
const double& thp);
62 Scalar well_group_thp(
const std::string& gname)
const;
63 bool is_autochoke_group(
const std::string& gname)
const;
65 bool has_production_reduction_rates(
const std::string& gname)
const;
66 void update_production_reduction_rates(
const std::string& gname,
67 const std::vector<Scalar>& rates);
68 const std::vector<Scalar>& production_reduction_rates(
const std::string& gname)
const;
70 void update_prev_production_rates(
const std::string& gname,
const std::vector<Scalar>& rates);
71 const std::vector<Scalar>& prev_production_rates(
const std::string& gname)
const;
73 bool has_injection_reduction_rates(
const std::string& gname)
const;
74 void update_injection_reduction_rates(
const std::string& gname,
75 const std::vector<Scalar>& rates);
76 const std::vector<Scalar>& injection_reduction_rates(
const std::string& gname)
const;
78 bool has_injection_reservoir_rates(
const std::string& gname)
const;
79 void update_injection_reservoir_rates(
const std::string& gname,
80 const std::vector<Scalar>& rates);
81 const std::vector<Scalar>& injection_reservoir_rates(
const std::string& gname)
const;
83 bool has_injection_surface_rates(
const std::string& gname)
const;
84 void update_injection_surface_rates(
const std::string& gname,
85 const std::vector<Scalar>& rates);
86 const std::vector<Scalar>& injection_surface_rates(
const std::string& gname)
const;
88 void update_injection_rein_rates(
const std::string& gname,
89 const std::vector<Scalar>& rates);
90 const std::vector<Scalar>& injection_rein_rates(
const std::string& gname)
const;
92 void update_injection_vrep_rate(
const std::string& gname, Scalar rate);
93 Scalar injection_vrep_rate(
const std::string& gname)
const;
95 void update_grat_sales_target(
const std::string& gname, Scalar target);
96 Scalar grat_sales_target(
const std::string& gname)
const;
97 bool has_grat_sales_target(
const std::string& gname)
const;
99 void update_gpmaint_target(
const std::string& gname, Scalar target);
100 Scalar gpmaint_target(
const std::string& gname)
const;
101 bool has_gpmaint_target(
const std::string& gname)
const;
103 bool has_field_or_none_control(
const std::string& gname)
const;
104 bool has_field_or_none_control(
const std::string& gname, Phase injection_phase)
const;
105 bool has_production_control(
const std::string& gname)
const;
106 void production_control(
const std::string& gname, Group::ProductionCMode cmode);
107 Group::ProductionCMode production_control(
const std::string& gname)
const;
108 const std::map<std::string, Group::ProductionCMode>& get_production_controls()
const;
110 bool has_injection_control(
const std::string& gname, Phase phase)
const;
111 void injection_control(
const std::string& gname, Phase phase, Group::InjectionCMode cmode);
112 Group::InjectionCMode injection_control(
const std::string& gname, Phase phase)
const;
114 void update_number_of_wells_under_group_control(
const std::string& gname,
int number);
115 int number_of_wells_under_group_control(
const std::string& gname)
const;
117 void update_number_of_wells_under_inj_group_control(
const std::string& gname, Phase phase,
int number);
118 int number_of_wells_under_inj_group_control(
const std::string& gname, Phase phase)
const;
121 void update_gconsump(
const Schedule& schedule,
const int report_step,
const SummaryState& summary_state);
122 const std::pair<Scalar, Scalar>& gconsump_rates(
const std::string& gname)
const;
129 GroupPotential(Scalar oil = 0.0, Scalar gas = 0.0, Scalar water = 0.0)
130 : oil_rate(oil), gas_rate(gas), water_rate(water) {}
132 bool has_production_group_potential(
const std::string& gname)
const;
133 void update_group_production_potential(
134 const std::string& gname, Scalar oil_rate, Scalar gas_rate, Scalar water_rate
136 const GroupPotential& get_production_group_potential(
const std::string& gname)
const;
138 std::size_t data_size()
const;
139 std::size_t collect(Scalar* data)
const;
140 std::size_t distribute(
const Scalar* data);
142 GPMaint::State& gpmaint(
const std::string& gname);
145 void communicate_rates(
const Comm& comm)
154 auto iterateContainer = [](
auto& container,
const auto& func) {
155 for (
auto& x : container) {
161 auto forAllGroupData = [&](
auto& func) {
162 iterateContainer(m_production_rates, func);
163 iterateContainer(m_network_leaf_node_injection_rates, func);
164 iterateContainer(m_network_leaf_node_production_rates, func);
165 iterateContainer(prod_red_rates, func);
166 iterateContainer(inj_red_rates, func);
167 iterateContainer(inj_resv_rates, func);
168 iterateContainer(inj_rein_rates, func);
169 iterateContainer(inj_surface_rates, func);
174 auto computeSize = [&sz](
const auto& v) {
177 forAllGroupData(computeSize);
178 sz += this->inj_vrep_rate.size();
181 std::vector<Scalar> data(sz);
186 auto doCollect = [&data, &pos](
auto& v) {
192 forAllGroupData(doCollect);
193 for (
const auto& x : this->inj_vrep_rate) {
194 data[pos++] = x.second;
197 throw std::logic_error(
"Internal size mismatch when collecting groupData");
200 comm.sum(data.data(), data.size());
204 auto doDistribute = [&data, &pos](
auto& v) {
205 std::copy_n(data.begin() + pos, v.size(), v.begin());
208 forAllGroupData(doDistribute);
209 for (
auto& x : this->inj_vrep_rate) {
210 x.second = data[pos++];
213 throw std::logic_error(
"Internal size mismatch when distributing groupData");
216 template<
class Serializer>
217 void serializeOp(Serializer& serializer)
219 serializer(num_phases);
220 serializer(m_production_rates);
221 serializer(m_network_leaf_node_injection_rates);
222 serializer(m_network_leaf_node_production_rates);
223 serializer(production_controls);
224 serializer(m_prev_production_rates);
225 serializer(group_thp);
226 serializer(prod_red_rates);
227 serializer(inj_red_rates);
228 serializer(inj_surface_rates);
229 serializer(inj_resv_rates);
230 serializer(inj_rein_rates);
231 serializer(inj_vrep_rate);
232 serializer(m_grat_sales_target);
233 serializer(m_gpmaint_target);
234 serializer(injection_controls);
235 serializer(gpmaint_state);
236 serializer(m_gconsump_rates);
237 serializer(m_number_of_wells_under_group_control);
238 serializer(m_number_of_wells_under_inj_group_control);
242 std::size_t num_phases{};
243 std::map<std::string, std::vector<Scalar>> m_production_rates;
244 std::map<std::string, std::vector<Scalar>> m_network_leaf_node_injection_rates;
245 std::map<std::string, std::vector<Scalar>> m_network_leaf_node_production_rates;
246 std::map<std::string, Group::ProductionCMode> production_controls;
247 std::map<std::string, std::vector<Scalar>> m_prev_production_rates;
248 std::map<std::string, std::vector<Scalar>> prod_red_rates;
249 std::map<std::string, std::vector<Scalar>> inj_red_rates;
250 std::map<std::string, std::vector<Scalar>> inj_surface_rates;
251 std::map<std::string, std::vector<Scalar>> inj_resv_rates;
252 std::map<std::string, std::vector<Scalar>> inj_rein_rates;
253 std::map<std::string, Scalar> inj_vrep_rate;
254 std::map<std::string, Scalar> m_grat_sales_target;
255 std::map<std::string, Scalar> m_gpmaint_target;
256 std::map<std::string, Scalar> group_thp;
257 std::map<std::string, GroupPotential> production_group_potentials;
258 std::map<std::string, int> m_number_of_wells_under_group_control;
259 std::map<std::pair<Phase, std::string>,
int> m_number_of_wells_under_inj_group_control;
262 std::map<std::pair<Phase, std::string>, Group::InjectionCMode> injection_controls;
263 WellContainer<GPMaint::State> gpmaint_state;
264 std::map<std::string, std::pair<Scalar, Scalar>> m_gconsump_rates;
265 static constexpr std::pair<Scalar, Scalar> zero_pair = {0.0, 0.0};
Structs needed for tpfalinearizer and its gpuparams struct extracted to be defined in one place that ...
Definition: blackoilbioeffectsmodules.hh:45
Definition: GroupState.hpp:124