Improve severity feature, add severityOfWorstFailure().

This commit is contained in:
Atgeirr Flø Rasmussen
2018-10-23 11:28:32 +02:00
parent 34afb0b254
commit 42cb36ab9f
2 changed files with 29 additions and 2 deletions

View File

@@ -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 -----------

View File

@@ -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);
}
}