mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Improve severity feature, add severityOfWorstFailure().
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
#define OPM_CONVERGENCESTATUS_HEADER_INCLUDED
|
||||
|
||||
#include <cassert>
|
||||
#include <numeric>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
@@ -40,7 +41,10 @@ namespace Opm
|
||||
enum Status { AllGood = 0,
|
||||
ReservoirFailed = 1 << 0,
|
||||
WellFailed = 1 << 1 };
|
||||
enum struct Severity { Normal, TooLarge, NotANumber };
|
||||
enum struct Severity { None = 0,
|
||||
Normal = 1,
|
||||
TooLarge = 2,
|
||||
NotANumber = 3 };
|
||||
struct ReservoirFailure
|
||||
{
|
||||
enum struct Type { Mb, Cnv };
|
||||
@@ -123,6 +127,22 @@ namespace Opm
|
||||
return well_failures_;
|
||||
}
|
||||
|
||||
Severity severityOfWorstFailure() const
|
||||
{
|
||||
// A function to get the worst of two severities.
|
||||
auto smax = [](Severity s1, Severity s2) {
|
||||
return s1 < s2 ? s2 : s1;
|
||||
};
|
||||
auto s = Severity::None;
|
||||
for (const auto f : res_failures_) {
|
||||
s = smax(s, f.severity);
|
||||
}
|
||||
for (const auto f : well_failures_) {
|
||||
s = smax(s, f.severity);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
// ----------- Member variables -----------
|
||||
|
@@ -24,17 +24,19 @@
|
||||
|
||||
#include <opm/simulators/timestepping/ConvergenceStatus.hpp>
|
||||
|
||||
using CS = Opm::ConvergenceStatus;
|
||||
|
||||
BOOST_AUTO_TEST_CASE(DefaultConstructor)
|
||||
{
|
||||
Opm::ConvergenceStatus s;
|
||||
BOOST_CHECK(s.converged());
|
||||
BOOST_CHECK(!s.reservoirFailed());
|
||||
BOOST_CHECK(!s.wellFailed());
|
||||
BOOST_CHECK(s.severityOfWorstFailure() == CS::Severity::None);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(Failures)
|
||||
{
|
||||
using CS = Opm::ConvergenceStatus;
|
||||
Opm::ConvergenceStatus s1;
|
||||
s1.setReservoirFailed({CS::ReservoirFailure::Type::Cnv, CS::Severity::Normal, 2, 100});
|
||||
{
|
||||
@@ -48,6 +50,7 @@ BOOST_AUTO_TEST_CASE(Failures)
|
||||
BOOST_CHECK(f.phase == 2);
|
||||
BOOST_CHECK(f.cell_index == 100);
|
||||
BOOST_CHECK(s1.wellFailures().empty());
|
||||
BOOST_CHECK(s1.severityOfWorstFailure() == CS::Severity::Normal);
|
||||
}
|
||||
|
||||
Opm::ConvergenceStatus s2;
|
||||
@@ -69,6 +72,7 @@ BOOST_AUTO_TEST_CASE(Failures)
|
||||
BOOST_CHECK(f1.severity == CS::Severity::TooLarge);
|
||||
BOOST_CHECK(f1.phase == 2);
|
||||
BOOST_CHECK(f1.well_name == "INJECTOR-XYZ");
|
||||
BOOST_CHECK(s2.severityOfWorstFailure() == CS::Severity::TooLarge);
|
||||
}
|
||||
|
||||
s1 += s2;
|
||||
@@ -93,6 +97,7 @@ BOOST_AUTO_TEST_CASE(Failures)
|
||||
BOOST_CHECK(f1.severity == CS::Severity::TooLarge);
|
||||
BOOST_CHECK(f1.phase == 2);
|
||||
BOOST_CHECK(f1.well_name == "INJECTOR-XYZ");
|
||||
BOOST_CHECK(s1.severityOfWorstFailure() == CS::Severity::TooLarge);
|
||||
}
|
||||
|
||||
s1.clear();
|
||||
@@ -100,6 +105,7 @@ BOOST_AUTO_TEST_CASE(Failures)
|
||||
BOOST_CHECK(s1.converged());
|
||||
BOOST_CHECK(!s1.reservoirFailed());
|
||||
BOOST_CHECK(!s1.wellFailed());
|
||||
BOOST_CHECK(s1.severityOfWorstFailure() == CS::Severity::None);
|
||||
}
|
||||
|
||||
s1 += s2;
|
||||
@@ -119,6 +125,7 @@ BOOST_AUTO_TEST_CASE(Failures)
|
||||
BOOST_CHECK(f1.severity == CS::Severity::TooLarge);
|
||||
BOOST_CHECK(f1.phase == 2);
|
||||
BOOST_CHECK(f1.well_name == "INJECTOR-XYZ");
|
||||
BOOST_CHECK(s1.severityOfWorstFailure() == CS::Severity::TooLarge);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user