My Project
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;
38
39} // namespace Opm
40
41namespace Opm {
42
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
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
134 double get(const std::string& well, const WellGuideRateTarget target, const RateVector& rates) const;
135 double get(const std::string& group, const Group::GuideRateProdTarget target, const RateVector& rates) const;
136 double get(const std::string& name, const GuideRateModel::Target model_target, const RateVector& rates) const;
137 double get(const std::string& group, const Phase& phase) const;
138
139 double getSI(const std::string& well, const WellGuideRateTarget target, const RateVector& rates) const;
140 double getSI(const std::string& group, const Group::GuideRateProdTarget target, const RateVector& rates) const;
141 double getSI(const std::string& wgname, const GuideRateModel::Target target, const RateVector& rates) const;
142 double getSI(const std::string& group, const Phase& phase) const;
143
144 void init_grvalue(const std::size_t report_step, const std::string& wgname, GuideRateValue value);
145 void init_grvalue_SI(const std::size_t report_step, const std::string& wgname, GuideRateValue value);
146
147 void updateGuideRateExpiration(const double sim_time,
148 const std::size_t report_step);
149
150 template<class Serializer>
151 void serializeOp(Serializer& serializer)
152 {
153 serializer(values);
154 serializer(injection_group_values);
155 serializer(potentials);
156 serializer(guide_rates_expired);
157 }
158
159private:
160 struct GRValState
161 {
162 GuideRateValue curr{};
163 GuideRateValue prev{};
164
165 static GRValState serializationTestObject()
166 {
167 return GRValState{GuideRateValue::serializationTestObject(),
168 GuideRateValue::serializationTestObject()};
169 }
170
171 template<class Serializer>
172 void serializeOp(Serializer& serializer)
173 {
174 serializer(curr);
175 serializer(prev);
176 }
177 };
178
179 struct pair_hash
180 {
181 template <class T1, class T2>
182 std::size_t operator()(const std::pair<T1, T2>& pair) const
183 {
184 return std::hash<T1>()(pair.first) ^ std::hash<T2>()(pair.second);
185 }
186 };
187
188 using GRValPtr = std::unique_ptr<GRValState>;
189 using pair = std::pair<Phase, std::string>;
190
191 void well_compute(const std::string& wgname,
192 const std::size_t report_step,
193 const double sim_time,
194 const double oil_pot,
195 const double gas_pot,
196 const double wat_pot);
197
198 void group_compute(const std::string& wgname,
199 const std::size_t report_step,
200 const double sim_time,
201 const double oil_pot,
202 const double gas_pot,
203 const double wat_pot);
204
205 double eval_form(const GuideRateModel& model,
206 const double oil_pot,
207 const double gas_pot,
208 const double wat_pot) const;
209 double eval_group_pot() const;
210 double eval_group_resvinj() const;
211
212 void assign_grvalue(const std::string& wgname,
213 const GuideRateModel& model,
214 GuideRateValue&& value);
215 double get_grvalue_result(const GRValState& gr) const;
216
217 const Schedule& schedule;
218
219 std::unordered_map<std::string, GRValPtr> values{};
220 std::unordered_map<pair, double, pair_hash> injection_group_values{};
221 std::unordered_map<std::string, RateVector> potentials{};
222 bool guide_rates_expired {false};
223};
224
225} // namespace Opm
226
227#endif
Definition GuideRate.hpp:44
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