Fix Consistency Check for Maximum Gas Saturation

The earlier condition

    0 <= SGU < 1

was not appropriate and would, for instance, fail the NORNE_ATW2013
test case in which SGU = 1 in the unscaled table for saturation
region 1.  Revise the condition to be more in line with that of SWU,
i.e., as

    0 < SGU <= 1

Pointy Hat: [at]bska
This commit is contained in:
Bård Skaflestad 2024-09-10 15:32:24 +02:00
parent 15c111f942
commit ba1419b31f
3 changed files with 10 additions and 8 deletions

View File

@ -55,6 +55,8 @@ template <typename Scalar>
void Opm::Satfunc::PhaseChecks::Gas::SGmax<Scalar>:: void Opm::Satfunc::PhaseChecks::Gas::SGmax<Scalar>::
testImpl(const EclEpsScalingPointsInfo<Scalar>& endPoints) testImpl(const EclEpsScalingPointsInfo<Scalar>& endPoints)
{ {
// 0 < SGU <= 1
this->sgu_ = endPoints.Sgu; this->sgu_ = endPoints.Sgu;
if (! std::isfinite(this->sgu_)) { if (! std::isfinite(this->sgu_)) {
@ -64,8 +66,8 @@ testImpl(const EclEpsScalingPointsInfo<Scalar>& endPoints)
return; return;
} }
const auto low = this->sgu_ < Scalar{0}; const auto low = ! (this->sgu_ > Scalar{0});
const auto high = ! (this->sgu_ < Scalar{1}); const auto high = this->sgu_ > Scalar{1};
if (low || high) { if (low || high) {
this->setViolated(); this->setViolated();

View File

@ -104,13 +104,13 @@ namespace Opm::Satfunc::PhaseChecks::Gas {
/// Descriptive textual summary of this check. /// Descriptive textual summary of this check.
std::string description() const override std::string description() const override
{ {
return { "Non-negative maximum gas saturation strictly less than one" }; return { "Positive maximum gas saturation must not exceed one" };
} }
/// Textual representation of the consistency condition. /// Textual representation of the consistency condition.
std::string condition() const override std::string condition() const override
{ {
return { "0 <= SGU < 1" }; return { "0 < SGU <= 1" };
} }
/// Retrieve names of the exported check values. /// Retrieve names of the exported check values.

View File

@ -192,7 +192,7 @@ BOOST_AUTO_TEST_CASE(All_Good)
{ {
auto endPoints = Opm::EclEpsScalingPointsInfo<float>{}; auto endPoints = Opm::EclEpsScalingPointsInfo<float>{};
endPoints.Sgu = 0.125f; // >= 0 && < 1 endPoints.Sgu = 0.125f; // > 0 && <= 1
check.test(endPoints); check.test(endPoints);
} }
@ -266,7 +266,7 @@ BOOST_AUTO_TEST_CASE(Is_One)
{ {
auto check = Checks::SGmax<double>{}; auto check = Checks::SGmax<double>{};
auto endPoints = Opm::EclEpsScalingPointsInfo<double>{}; auto endPoints = Opm::EclEpsScalingPointsInfo<double>{};
endPoints.Sgu = 1.0; // >= 1 endPoints.Sgu = 1.0; // <= 1
check.test(endPoints); check.test(endPoints);
@ -277,8 +277,8 @@ BOOST_AUTO_TEST_CASE(Is_One)
BOOST_CHECK_CLOSE(value, 1.0, 1.0e-8); BOOST_CHECK_CLOSE(value, 1.0, 1.0e-8);
} }
BOOST_CHECK_MESSAGE(check.isViolated(), "Test must be violated"); BOOST_CHECK_MESSAGE(! check.isViolated(), "Test must not be violated");
BOOST_CHECK_MESSAGE(check.isCritical(), "Test must be violated at critical level"); BOOST_CHECK_MESSAGE(! check.isCritical(), "Test must not be violated at critical level");
} }
BOOST_AUTO_TEST_CASE(Exceeds_One) BOOST_AUTO_TEST_CASE(Exceeds_One)