ConvergenceReport.hpp
Go to the documentation of this file.
1/*
2 Copyright 2018 SINTEF Digital, Mathematics and Cybernetics.
3 Copyright 2018 Equinor.
4
5 This file is part of the Open Porous Media project (OPM).
6
7 OPM is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 OPM is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with OPM. If not, see <http://www.gnu.org/licenses/>.
19*/
20
21#ifndef OPM_CONVERGENCEREPORT_HEADER_INCLUDED
22#define OPM_CONVERGENCEREPORT_HEADER_INCLUDED
23
24#include <algorithm>
25#include <cassert>
26#include <numeric>
27#include <string>
28#include <utility>
29#include <vector>
30
31namespace Opm
32{
33
38 {
39 public:
40
41 // ----------- Types -----------
42
43 enum Status {
46 WellFailed = 1 << 1,
47 };
48
49 enum struct Severity {
50 None = 0,
51 Normal = 1,
52 TooLarge = 2,
53 NotANumber = 3,
54 };
55
57 {
58 public:
59 enum struct Type { Invalid, MassBalance, Cnv };
60
62 : type_(t), severity_(s), phase_(phase)
63 {}
64
65 Type type() const { return type_; }
66 Severity severity() const { return severity_; }
67 int phase() const { return phase_; }
68
69 private:
70 Type type_;
71 Severity severity_;
72 int phase_;
73 };
74
76 {
77 public:
79 : type_(t), phase_(phase), value_(value)
80 {}
81
82 ReservoirFailure::Type type() const { return type_; }
83 int phase() const { return phase_; }
84 double value() const { return value_; }
85
86 private:
88 int phase_;
89 double value_;
90 };
91
93 {
94 public:
95 enum struct Type {
96 Invalid,
97 MassBalance,
98 Pressure,
99 ControlBHP,
100 ControlTHP,
101 ControlRate,
102 Unsolvable,
103 WrongFlowDirection,
104 };
105
106 WellFailure(Type t, Severity s, int phase, const std::string& well_name)
107 : type_(t), severity_(s), phase_(phase), well_name_(well_name)
108 {}
109
110 Type type() const { return type_; }
111 Severity severity() const { return severity_; }
112 int phase() const { return phase_; }
113 const std::string& wellName() const { return well_name_; }
114
115 private:
116 Type type_;
117 Severity severity_;
118 int phase_;
119 std::string well_name_;
120 };
121
122 // ----------- Mutating member functions -----------
123
125 : ConvergenceReport{0.0}
126 {}
127
128 explicit ConvergenceReport(const double reportTime)
129 : reportTime_{reportTime}
130 , status_{AllGood}
131 , res_failures_{}
132 , well_failures_{}
133 , wellGroupTargetsViolated_(false)
134 {}
135
136 void clear()
137 {
138 status_ = AllGood;
139 res_failures_.clear();
140 well_failures_.clear();
141 wellGroupTargetsViolated_ = false;
142 }
143
145 {
146 status_ = static_cast<Status>(status_ | ReservoirFailed);
147 res_failures_.push_back(rf);
148 }
149
151 {
152 status_ = static_cast<Status>(status_ | WellFailed);
153 well_failures_.push_back(wf);
154 }
155
156 template <typename... Args>
157 void setReservoirConvergenceMetric(Args&&... args)
158 {
159 this->res_convergence_.emplace_back(std::forward<Args>(args)...);
160 }
161
162 void setWellGroupTargetsViolated(const bool wellGroupTargetsViolated)
163 {
164 wellGroupTargetsViolated_ = wellGroupTargetsViolated;
165 }
166
167 void setPoreVolCnvViolationFraction(const double cnvErrorPvFraction,
168 const double cnvErrorPvFractionDenom)
169 {
170 this->pvFracCnvViol_ = cnvErrorPvFraction;
171 this->pvFracCnvViolDenom_ = cnvErrorPvFractionDenom;
172 }
173
175 {
176 reportTime_ = std::max(reportTime_, other.reportTime_);
177 status_ = static_cast<Status>(status_ | other.status_);
178 res_failures_.insert(res_failures_.end(), other.res_failures_.begin(), other.res_failures_.end());
179 well_failures_.insert(well_failures_.end(), other.well_failures_.begin(), other.well_failures_.end());
180 res_convergence_.insert(res_convergence_.end(), other.res_convergence_.begin(), other.res_convergence_.end());
181 assert(reservoirFailed() != res_failures_.empty());
182 assert(wellFailed() != well_failures_.empty());
183 wellGroupTargetsViolated_ = (wellGroupTargetsViolated_ || other.wellGroupTargetsViolated_);
184
185 if ((this->pvFracCnvViolDenom_ > 0.0) ||
186 (other.pvFracCnvViolDenom_ > 0.0))
187 {
188 this->pvFracCnvViol_ = (this->pvFracCnvViol_ * this->pvFracCnvViolDenom_ +
189 other.pvFracCnvViol_ * other.pvFracCnvViolDenom_)
190 / (this->pvFracCnvViolDenom_ + other.pvFracCnvViolDenom_);
191
192 this->pvFracCnvViolDenom_ += other.pvFracCnvViolDenom_;
193 }
194 else {
195 this->pvFracCnvViol_ = 0.0;
196 this->pvFracCnvViolDenom_ = 0.0;
197 }
198
199 return *this;
200 }
201
202 // ----------- Const member functions (queries) -----------
203
204 double reportTime() const
205 {
206 return reportTime_;
207 }
208
210 {
211 return this->pvFracCnvViol_;
212 }
213
214 std::pair<double, double> cnvViolatedPvFractionPack() const
215 {
216 return { this->pvFracCnvViol_, this->pvFracCnvViolDenom_ };
217 }
218
219 bool converged() const
220 {
221 return (status_ == AllGood) && !wellGroupTargetsViolated_;
222 }
223
224 bool reservoirFailed() const
225 {
226 return status_ & ReservoirFailed;
227 }
228
229 bool wellFailed() const
230 {
231 return status_ & WellFailed;
232 }
233
234 const std::vector<ReservoirFailure>& reservoirFailures() const
235 {
236 return res_failures_;
237 }
238
239 const std::vector<ReservoirConvergenceMetric>& reservoirConvergence() const
240 {
241 return res_convergence_;
242 }
243
244 const std::vector<WellFailure>& wellFailures() const
245 {
246 return well_failures_;
247 }
248
250 {
251 // A function to get the worst of two severities.
252 auto smax = [](Severity s1, Severity s2) {
253 return s1 < s2 ? s2 : s1;
254 };
255 auto s = Severity::None;
256 for (const auto& f : res_failures_) {
257 s = smax(s, f.severity());
258 }
259 for (const auto& f : well_failures_) {
260 s = smax(s, f.severity());
261 }
262 return s;
263 }
264
265 private:
266 // ----------- Member variables -----------
267 double reportTime_;
268 Status status_;
269 std::vector<ReservoirFailure> res_failures_;
270 std::vector<WellFailure> well_failures_;
271 std::vector<ReservoirConvergenceMetric> res_convergence_;
272 bool wellGroupTargetsViolated_;
273 double pvFracCnvViol_{};
274 double pvFracCnvViolDenom_{};
275 };
276
278 {
281 std::vector<ConvergenceReport> report;
282 };
283
285
287
289
291
292
293} // namespace Opm
294
295#endif // OPM_CONVERGENCEREPORT_HEADER_INCLUDED
Definition: ConvergenceReport.hpp:76
int phase() const
Definition: ConvergenceReport.hpp:83
double value() const
Definition: ConvergenceReport.hpp:84
ReservoirFailure::Type type() const
Definition: ConvergenceReport.hpp:82
ReservoirConvergenceMetric(ReservoirFailure::Type t, int phase, double value)
Definition: ConvergenceReport.hpp:78
Definition: ConvergenceReport.hpp:57
int phase() const
Definition: ConvergenceReport.hpp:67
Type
Definition: ConvergenceReport.hpp:59
ReservoirFailure(Type t, Severity s, int phase)
Definition: ConvergenceReport.hpp:61
Type type() const
Definition: ConvergenceReport.hpp:65
Severity severity() const
Definition: ConvergenceReport.hpp:66
Definition: ConvergenceReport.hpp:93
const std::string & wellName() const
Definition: ConvergenceReport.hpp:113
Type
Definition: ConvergenceReport.hpp:95
int phase() const
Definition: ConvergenceReport.hpp:112
Severity severity() const
Definition: ConvergenceReport.hpp:111
WellFailure(Type t, Severity s, int phase, const std::string &well_name)
Definition: ConvergenceReport.hpp:106
Type type() const
Definition: ConvergenceReport.hpp:110
Definition: ConvergenceReport.hpp:38
ConvergenceReport()
Definition: ConvergenceReport.hpp:124
Severity severityOfWorstFailure() const
Definition: ConvergenceReport.hpp:249
const std::vector< ReservoirConvergenceMetric > & reservoirConvergence() const
Definition: ConvergenceReport.hpp:239
void setWellFailed(const WellFailure &wf)
Definition: ConvergenceReport.hpp:150
void setWellGroupTargetsViolated(const bool wellGroupTargetsViolated)
Definition: ConvergenceReport.hpp:162
bool reservoirFailed() const
Definition: ConvergenceReport.hpp:224
void setReservoirConvergenceMetric(Args &&... args)
Definition: ConvergenceReport.hpp:157
Severity
Definition: ConvergenceReport.hpp:49
double reportTime() const
Definition: ConvergenceReport.hpp:204
std::pair< double, double > cnvViolatedPvFractionPack() const
Definition: ConvergenceReport.hpp:214
void clear()
Definition: ConvergenceReport.hpp:136
double cnvViolatedPvFraction() const
Definition: ConvergenceReport.hpp:209
ConvergenceReport(const double reportTime)
Definition: ConvergenceReport.hpp:128
bool converged() const
Definition: ConvergenceReport.hpp:219
Status
Definition: ConvergenceReport.hpp:43
@ ReservoirFailed
Definition: ConvergenceReport.hpp:45
@ AllGood
Definition: ConvergenceReport.hpp:44
@ WellFailed
Definition: ConvergenceReport.hpp:46
const std::vector< ReservoirFailure > & reservoirFailures() const
Definition: ConvergenceReport.hpp:234
const std::vector< WellFailure > & wellFailures() const
Definition: ConvergenceReport.hpp:244
void setPoreVolCnvViolationFraction(const double cnvErrorPvFraction, const double cnvErrorPvFractionDenom)
Definition: ConvergenceReport.hpp:167
void setReservoirFailed(const ReservoirFailure &rf)
Definition: ConvergenceReport.hpp:144
ConvergenceReport & operator+=(const ConvergenceReport &other)
Definition: ConvergenceReport.hpp:174
bool wellFailed() const
Definition: ConvergenceReport.hpp:229
Definition: BlackoilPhases.hpp:27
std::string to_string(const ConvergenceReport::ReservoirFailure::Type t)
Definition: ConvergenceReport.hpp:278
std::vector< ConvergenceReport > report
Definition: ConvergenceReport.hpp:281
int report_step
Definition: ConvergenceReport.hpp:279
int current_step
Definition: ConvergenceReport.hpp:280