opm-common
Loading...
Searching...
No Matches
GuideRate.hpp
1/*
2 Copyright 2019, 2020 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 GUIDE_RATE_HPP
21#define GUIDE_RATE_HPP
22
23#include <opm/input/eclipse/Schedule/Group/Group.hpp>
24#include <opm/input/eclipse/Schedule/Group/GuideRateModel.hpp>
25
26#include <cstddef>
27#include <ctime>
28#include <limits>
29#include <memory>
30#include <string>
31#include <unordered_map>
32#include <utility>
33
34namespace Opm {
35
36class Schedule;
37enum class WellGuideRateTarget : std::uint8_t;
38
39} // namespace Opm
40
41namespace Opm {
42
43class GuideRate
44{
45public:
46 // used for potentials and well rates
47 struct RateVector {
48 RateVector() = default;
49 RateVector(const double orat, const double grat, const double wrat)
50 : oil_rat(orat)
51 , gas_rat(grat)
52 , wat_rat(wrat)
53 {}
54
55 static RateVector serializationTestObject()
56 {
57 return RateVector{1.0, 2.0, 3.0};
58 }
59
60 double eval(const WellGuideRateTarget target) const;
61 double eval(const Group::GuideRateProdTarget target) const;
62 double eval(const GuideRateModel::Target target) const;
63
64 template<class Serializer>
65 void serializeOp(Serializer& serializer)
66 {
67 serializer(oil_rat);
68 serializer(gas_rat);
69 serializer(wat_rat);
70 }
71
72 double oil_rat{0.0};
73 double gas_rat{0.0};
74 double wat_rat{0.0};
75 };
76
77 struct GuideRateValue {
78 GuideRateValue() = default;
79 GuideRateValue(const double t, const double v, const GuideRateModel::Target tg)
80 : sim_time(t)
81 , value (v)
82 , target (tg)
83 {}
84
85 static GuideRateValue serializationTestObject()
86 {
87 return GuideRateValue{1.0, 2.0, GuideRateModel::Target::LIQ};
88 }
89
90 bool operator==(const GuideRateValue& other) const
91 {
92 return (this->sim_time == other.sim_time)
93 && (this->value == other.value);
94 }
95
96 bool operator!=(const GuideRateValue& other) const
97 {
98 return !(*this == other);
99 }
100
101 template<class Serializer>
102 void serializeOp(Serializer& serializer)
103 {
104 serializer(sim_time);
105 serializer(value);
106 serializer(target);
107 }
108
109 double sim_time { std::numeric_limits<double>::lowest() };
110 double value { std::numeric_limits<double>::lowest() };
111 GuideRateModel::Target target { GuideRateModel::Target::NONE };
112 };
113
114 explicit GuideRate(const Schedule& schedule);
115
116 void setSerializationTestData();
117
118 void compute(const std::string& wgname,
119 const std::size_t report_step,
120 const double sim_time,
121 const double oil_pot,
122 const double gas_pot,
123 const double wat_pot);
124
125 void compute(const std::string& wgname,
126 const Phase& phase,
127 const std::size_t report_step,
128 const std::optional<double> guide_rate);
129
130 bool has(const std::string& name) const;
131 bool hasPotentials(const std::string& name) const;
132 bool has(const std::string& name, const Phase& phase) const;
133
140 void erase(const std::string& name);
141
142 double get(const std::string& well, const WellGuideRateTarget target, const RateVector& rates) const;
143 double get(const std::string& group, const Group::GuideRateProdTarget target, const RateVector& rates) const;
144 double get(const std::string& name, const GuideRateModel::Target model_target, const RateVector& rates) const;
145 double get(const std::string& group, const Phase& phase) const;
146
147 double getSI(const std::string& well, const WellGuideRateTarget target, const RateVector& rates) const;
148 double getSI(const std::string& group, const Group::GuideRateProdTarget target, const RateVector& rates) const;
149 double getSI(const std::string& wgname, const GuideRateModel::Target target, const RateVector& rates) const;
150 double getSI(const std::string& group, const Phase& phase) const;
151
152 void init_grvalue(const std::size_t report_step, const std::string& wgname, GuideRateValue value);
153 void init_grvalue_SI(const std::size_t report_step, const std::string& wgname, GuideRateValue value);
154
155 void updateGuideRateExpiration(const double sim_time,
156 const std::size_t report_step);
157
158 template<class Serializer>
159 void serializeOp(Serializer& serializer)
160 {
161 serializer(values);
162 serializer(injection_group_values);
163 serializer(potentials);
164 serializer(guide_rates_expired);
165 }
166
167private:
168 struct GRValState
169 {
170 GuideRateValue curr{};
171 GuideRateValue prev{};
172
173 static GRValState serializationTestObject()
174 {
175 return GRValState{GuideRateValue::serializationTestObject(),
176 GuideRateValue::serializationTestObject()};
177 }
178
179 template<class Serializer>
180 void serializeOp(Serializer& serializer)
181 {
182 serializer(curr);
183 serializer(prev);
184 }
185 };
186
187 struct pair_hash
188 {
189 template <class T1, class T2>
190 std::size_t operator()(const std::pair<T1, T2>& pair) const
191 {
192 return std::hash<T1>()(pair.first) ^ std::hash<T2>()(pair.second);
193 }
194 };
195
196 using GRValPtr = std::unique_ptr<GRValState>;
197 using pair = std::pair<Phase, std::string>;
198
199 void well_compute(const std::string& wgname,
200 const std::size_t report_step,
201 const double sim_time,
202 const double oil_pot,
203 const double gas_pot,
204 const double wat_pot);
205
206 void group_compute(const std::string& wgname,
207 const std::size_t report_step,
208 const double sim_time,
209 const double oil_pot,
210 const double gas_pot,
211 const double wat_pot);
212
213 double eval_form(const GuideRateModel& model,
214 const std::string& wgId,
215 const double oil_pot,
216 const double gas_pot,
217 const double wat_pot) const;
218
219 void assign_grvalue(const std::string& wgname,
220 const GuideRateModel& model,
221 GuideRateValue&& value);
222 double get_grvalue_result(const GRValState& gr) const;
223
224 const Schedule& schedule;
225
226 std::unordered_map<std::string, GRValPtr> values{};
227 std::unordered_map<pair, double, pair_hash> injection_group_values{};
228 std::unordered_map<std::string, RateVector> potentials{};
229 bool guide_rates_expired {false};
230};
231
232} // namespace Opm
233
234#endif
void erase(const std::string &name)
Erase the guide rate for a well or group.
Definition GuideRate.cpp:218
Definition Schedule.hpp:101
Class for (de-)serializing.
Definition Serializer.hpp:94
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30
Definition GuideRate.hpp:77
Definition GuideRate.hpp:47