21#ifndef OPM_CONVERGENCEREPORT_HEADER_INCLUDED
22#define OPM_CONVERGENCEREPORT_HEADER_INCLUDED
43 enum Status { AllGood = 0,
44 ReservoirFailed = 1 << 0,
45 WellFailed = 1 << 1 };
46 enum struct Severity { None = 0,
53 enum struct Type { Invalid, MassBalance, Cnv };
55 : type_(t), severity_(s), phase_(phase)
58 Type type()
const {
return type_; }
59 Severity severity()
const {
return severity_; }
60 int phase()
const {
return phase_; }
70 : type_(t), phase_(phase), value_(value)
73 ReservoirFailure::Type type()
const {
return type_; }
74 int phase()
const {
return phase_; }
75 double value()
const {
return value_; }
77 ReservoirFailure::Type type_;
84 enum struct Type { Invalid, MassBalance, Pressure, ControlBHP, ControlTHP, ControlRate, Unsolvable, WrongFlowDirection };
85 WellFailure(Type t, Severity s,
int phase,
const std::string& well_name)
86 : type_(t), severity_(s), phase_(phase), well_name_(well_name)
89 Type type()
const {
return type_; }
90 Severity severity()
const {
return severity_; }
91 int phase()
const {
return phase_; }
92 const std::string& wellName()
const {
return well_name_; }
97 std::string well_name_;
108 : reportTime_{reportTime}
112 , wellGroupTargetsViolated_(false)
119 res_failures_.clear();
120 well_failures_.clear();
121 wellGroupTargetsViolated_ =
false;
124 void setReservoirFailed(
const ReservoirFailure& rf)
126 status_ =
static_cast<Status
>(status_ | ReservoirFailed);
127 res_failures_.push_back(rf);
130 void setWellFailed(
const WellFailure& wf)
132 status_ =
static_cast<Status
>(status_ | WellFailed);
133 well_failures_.push_back(wf);
136 template <
typename... Args>
137 void setReservoirConvergenceMetric(Args&&... args)
139 this->res_convergence_.emplace_back(std::forward<Args>(args)...);
142 void setWellGroupTargetsViolated(
const bool wellGroupTargetsViolated)
144 wellGroupTargetsViolated_ = wellGroupTargetsViolated;
147 ConvergenceReport& operator+=(
const ConvergenceReport& other)
149 reportTime_ = std::max(reportTime_, other.reportTime_);
150 status_ =
static_cast<Status
>(status_ | other.status_);
151 res_failures_.insert(res_failures_.end(), other.res_failures_.begin(), other.res_failures_.end());
152 well_failures_.insert(well_failures_.end(), other.well_failures_.begin(), other.well_failures_.end());
153 res_convergence_.insert(res_convergence_.end(), other.res_convergence_.begin(), other.res_convergence_.end());
154 assert(reservoirFailed() != res_failures_.empty());
155 assert(wellFailed() != well_failures_.empty());
156 wellGroupTargetsViolated_ = (wellGroupTargetsViolated_ || other.wellGroupTargetsViolated_);
162 double reportTime()
const
167 bool converged()
const
169 return (status_ == AllGood) && !wellGroupTargetsViolated_;
172 bool reservoirFailed()
const
174 return status_ & ReservoirFailed;
177 bool wellFailed()
const
179 return status_ & WellFailed;
182 const std::vector<ReservoirFailure>& reservoirFailures()
const
184 return res_failures_;
187 const std::vector<ReservoirConvergenceMetric>& reservoirConvergence()
const
189 return res_convergence_;
192 const std::vector<WellFailure>& wellFailures()
const
194 return well_failures_;
197 Severity severityOfWorstFailure()
const
200 auto smax = [](Severity s1, Severity s2) {
201 return s1 < s2 ? s2 : s1;
203 auto s = Severity::None;
204 for (
const auto& f : res_failures_) {
205 s = smax(s, f.severity());
207 for (
const auto& f : well_failures_) {
208 s = smax(s, f.severity());
218 std::vector<ReservoirFailure> res_failures_;
219 std::vector<WellFailure> well_failures_;
220 std::vector<ReservoirConvergenceMetric> res_convergence_;
221 bool wellGroupTargetsViolated_;
228 std::vector<ConvergenceReport> report;
Definition: ConvergenceReport.hpp:67
Definition: ConvergenceReport.hpp:51
Definition: ConvergenceReport.hpp:82
Represents the convergence status of the whole simulator, to make it possible to query and store the ...
Definition: ConvergenceReport.hpp:38
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: BlackoilPhases.hpp:27
Definition: ConvergenceReport.hpp:225