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>
30#include <opm/simulators/utils/BlackoilPhases.hpp>
40 GroupState() =
default;
41 explicit GroupState(std::size_t num_phases);
43 static GroupState serializationTestObject();
45 bool operator==(
const GroupState& other)
const;
47 bool has_production_rates(
const std::string& gname)
const;
48 void update_production_rates(
const std::string& gname,
49 const std::vector<Scalar>& rates);
50 const std::vector<Scalar>& production_rates(
const std::string& gname)
const;
52 void update_well_group_thp(
const std::string& gname,
const double& thp);
53 Scalar well_group_thp(
const std::string& gname)
const;
55 bool has_production_reduction_rates(
const std::string& gname)
const;
56 void update_production_reduction_rates(
const std::string& gname,
57 const std::vector<Scalar>& rates);
58 const std::vector<Scalar>& production_reduction_rates(
const std::string& gname)
const;
60 bool has_injection_reduction_rates(
const std::string& gname)
const;
61 void update_injection_reduction_rates(
const std::string& gname,
62 const std::vector<Scalar>& rates);
63 const std::vector<Scalar>& injection_reduction_rates(
const std::string& gname)
const;
65 bool has_injection_reservoir_rates(
const std::string& gname)
const;
66 void update_injection_reservoir_rates(
const std::string& gname,
67 const std::vector<Scalar>& rates);
68 const std::vector<Scalar>& injection_reservoir_rates(
const std::string& gname)
const;
70 bool has_injection_surface_rates(
const std::string& gname)
const;
71 void update_injection_surface_rates(
const std::string& gname,
72 const std::vector<Scalar>& rates);
73 const std::vector<Scalar>& injection_surface_rates(
const std::string& gname)
const;
75 void update_injection_rein_rates(
const std::string& gname,
76 const std::vector<Scalar>& rates);
77 const std::vector<Scalar>& injection_rein_rates(
const std::string& gname)
const;
79 void update_injection_vrep_rate(
const std::string& gname, Scalar rate);
80 Scalar injection_vrep_rate(
const std::string& gname)
const;
82 void update_grat_sales_target(
const std::string& gname, Scalar target);
83 Scalar grat_sales_target(
const std::string& gname)
const;
84 bool has_grat_sales_target(
const std::string& gname)
const;
86 void update_gpmaint_target(
const std::string& gname, Scalar target);
87 Scalar gpmaint_target(
const std::string& gname)
const;
88 bool has_gpmaint_target(
const std::string& gname)
const;
90 bool has_production_control(
const std::string& gname)
const;
91 void production_control(
const std::string& gname, Group::ProductionCMode cmode);
92 Group::ProductionCMode production_control(
const std::string& gname)
const;
94 bool has_injection_control(
const std::string& gname, Phase phase)
const;
95 void injection_control(
const std::string& gname, Phase phase, Group::InjectionCMode cmode);
96 Group::InjectionCMode injection_control(
const std::string& gname, Phase phase)
const;
98 std::size_t data_size()
const;
99 std::size_t collect(Scalar* data)
const;
100 std::size_t distribute(
const Scalar* data);
102 GPMaint::State& gpmaint(
const std::string& gname);
105 void communicate_rates(
const Comm& comm)
114 auto iterateContainer = [](
auto& container,
auto& func) {
115 for (
auto& x : container) {
121 auto forAllGroupData = [&](
auto& func) {
122 iterateContainer(m_production_rates, func);
123 iterateContainer(prod_red_rates, func);
124 iterateContainer(inj_red_rates, func);
125 iterateContainer(inj_resv_rates, func);
126 iterateContainer(inj_rein_rates, func);
127 iterateContainer(inj_surface_rates, func);
132 auto computeSize = [&sz](
const auto& v) {
135 forAllGroupData(computeSize);
136 sz += this->inj_vrep_rate.size();
139 std::vector<Scalar> data(sz);
144 auto collect = [&data, &pos](
auto& v) {
150 forAllGroupData(collect);
151 for (
const auto& x : this->inj_vrep_rate) {
152 data[pos++] = x.second;
155 throw std::logic_error(
"Internal size mismatch when collecting groupData");
158 comm.sum(data.data(), data.size());
162 auto distribute = [&data, &pos](
auto& v) {
167 forAllGroupData(distribute);
168 for (
auto& x : this->inj_vrep_rate) {
169 x.second = data[pos++];
172 throw std::logic_error(
"Internal size mismatch when distributing groupData");
175 template<
class Serializer>
176 void serializeOp(Serializer& serializer)
178 serializer(num_phases);
179 serializer(m_production_rates);
180 serializer(production_controls);
181 serializer(group_thp);
182 serializer(prod_red_rates);
183 serializer(inj_red_rates);
184 serializer(inj_surface_rates);
185 serializer(inj_resv_rates);
186 serializer(inj_rein_rates);
187 serializer(inj_vrep_rate);
188 serializer(m_grat_sales_target);
189 serializer(m_gpmaint_target);
190 serializer(injection_controls);
191 serializer(gpmaint_state);
195 std::size_t num_phases{};
196 std::map<std::string, std::vector<Scalar>> m_production_rates;
197 std::map<std::string, Group::ProductionCMode> production_controls;
198 std::map<std::string, std::vector<Scalar>> prod_red_rates;
199 std::map<std::string, std::vector<Scalar>> inj_red_rates;
200 std::map<std::string, std::vector<Scalar>> inj_surface_rates;
201 std::map<std::string, std::vector<Scalar>> inj_resv_rates;
202 std::map<std::string, std::vector<Scalar>> inj_rein_rates;
203 std::map<std::string, Scalar> inj_vrep_rate;
204 std::map<std::string, Scalar> m_grat_sales_target;
205 std::map<std::string, Scalar> m_gpmaint_target;
206 std::map<std::string, Scalar> group_thp;
208 std::map<std::pair<Phase, std::string>, Group::InjectionCMode> injection_controls;
209 WellContainer<GPMaint::State> gpmaint_state;
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilboundaryratevector.hh:37