From e6fc39ca5d653a174791dd36d65ec6f8be477779 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov Date: Mon, 17 Jul 2023 13:55:59 +0200 Subject: [PATCH 1/2] [T/CT] Test the getBoundingSeedPoints --- .../ComponentTransport/TestLookupTable.cpp | 75 ++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/Tests/ProcessLib/ComponentTransport/TestLookupTable.cpp b/Tests/ProcessLib/ComponentTransport/TestLookupTable.cpp index fe27260b08f..7bf67a1fd99 100644 --- a/Tests/ProcessLib/ComponentTransport/TestLookupTable.cpp +++ b/Tests/ProcessLib/ComponentTransport/TestLookupTable.cpp @@ -10,8 +10,9 @@ #include #include -#include +#include #include +#include #include "BaseLib/ConfigTree.h" #include "BaseLib/FileTools.h" @@ -153,3 +154,75 @@ TEST(ComponentTransport, checkLookupTable) ASSERT_EQ(1.e-12, tabular_data.at("Ra_prev")[0]); ASSERT_EQ(9.977098263915e-13, tabular_data.at("Ra_new")[0]); } + +class ComponentTransport_FieldGetBoundingSeedPointsTests + : public ::testing::Test +{ +protected: + ProcessLib::ComponentTransport::Field createField( + std::vector seed_points) + { + return ProcessLib::ComponentTransport::Field{{}, seed_points, "", 0}; + } +}; + +TEST_F(ComponentTransport_FieldGetBoundingSeedPointsTests, + TestLowerBoundWarning) +{ + auto const field = createField({1.0, 2.0, 3.0, 4.0, 5.0}); + double const value = 0.5; + auto const pair = field.getBoundingSeedPoints(value); + EXPECT_DOUBLE_EQ(pair.first, 1.0); + EXPECT_DOUBLE_EQ(pair.second, 2.0); +} + +TEST_F(ComponentTransport_FieldGetBoundingSeedPointsTests, + TestUpperBoundWarning) +{ + auto const field = createField({1.0, 2.0, 3.0, 4.0, 5.0}); + double const value = 5.5; + auto pair = field.getBoundingSeedPoints(value); + EXPECT_DOUBLE_EQ(pair.first, 4.0); + EXPECT_DOUBLE_EQ(pair.second, 5.0); +} + +TEST_F(ComponentTransport_FieldGetBoundingSeedPointsTests, TestMiddleValue) +{ + auto const field = createField({1.0, 2.0, 3.0, 4.0, 5.0}); + double const value = 3.5; + auto pair = field.getBoundingSeedPoints(value); + EXPECT_DOUBLE_EQ(pair.first, 3.0); + EXPECT_DOUBLE_EQ(pair.second, 4.0); +} + +TEST_F(ComponentTransport_FieldGetBoundingSeedPointsTests, TestExactValue) +{ + auto const field = createField({1.0, 2.0, 3.0, 4.0, 5.0}); + double const value = 3.0; + auto pair = field.getBoundingSeedPoints(value); + EXPECT_DOUBLE_EQ(pair.first, 2.0); + EXPECT_DOUBLE_EQ(pair.second, 3.0); +} + +TEST_F(ComponentTransport_FieldGetBoundingSeedPointsTests, TestTwoElementVector) +{ + auto const field = createField({2.0, 3.0}); + double const value = 3.0; + auto pair = field.getBoundingSeedPoints(value); + EXPECT_DOUBLE_EQ(pair.first, 2.0); + EXPECT_DOUBLE_EQ(pair.second, 3.0); +} + +TEST_F(ComponentTransport_FieldGetBoundingSeedPointsTests, TestOneElementVector) +{ + auto const field = createField({3.0}); + double const value = 3.0; + ASSERT_DEATH(field.getBoundingSeedPoints(value), ""); +} + +TEST_F(ComponentTransport_FieldGetBoundingSeedPointsTests, TestEmptyVector) +{ + auto const field = createField({}); + double const value = 3.0; + ASSERT_DEATH(field.getBoundingSeedPoints(value), ""); +} From bc8c3ea61e1dd11ca2911571cbf4bc8f468bcc28 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov Date: Mon, 17 Jul 2023 13:57:44 +0200 Subject: [PATCH 2/2] [PL/CT] Rewrite search. Test for size, renames less iterator arithmetics because we have random access vector. Also update the test do catch the OGS_FATAL. --- ProcessLib/ComponentTransport/LookupTable.cpp | 22 ++++++++++++------- .../ComponentTransport/TestLookupTable.cpp | 4 ++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ProcessLib/ComponentTransport/LookupTable.cpp b/ProcessLib/ComponentTransport/LookupTable.cpp index 9a53dec8ad6..23c1c120568 100644 --- a/ProcessLib/ComponentTransport/LookupTable.cpp +++ b/ProcessLib/ComponentTransport/LookupTable.cpp @@ -35,21 +35,27 @@ static void intersection(std::vector& vec1, std::pair Field::getBoundingSeedPoints(double const value) const { - auto it = std::lower_bound(seed_points.cbegin(), seed_points.cend(), value); - if (it == seed_points.begin()) + if (seed_points.size() < 2) + { + OGS_FATAL("The lookup table for seed_points has less then two values."); + } + + auto lower = + std::lower_bound(seed_points.cbegin(), seed_points.cend(), value); + if (lower == seed_points.begin()) { WARN("The interpolation point is below the lower bound."); - auto const nx = std::next(it); - return std::make_pair(*it, *nx); + return std::make_pair(seed_points[0], seed_points[1]); } - if (it == seed_points.end()) + if (lower == seed_points.end()) { WARN("The interpolation point is above the upper bound."); - std::advance(it, -1); + return std::make_pair(seed_points[seed_points.size() - 2], + seed_points[seed_points.size() - 1]); } - auto const pv = std::prev(it); - return std::make_pair(*pv, *it); + auto const upper = lower--; + return std::make_pair(*lower, *upper); } void LookupTable::lookup(std::vector const& x, diff --git a/Tests/ProcessLib/ComponentTransport/TestLookupTable.cpp b/Tests/ProcessLib/ComponentTransport/TestLookupTable.cpp index 7bf67a1fd99..a8e62acb92e 100644 --- a/Tests/ProcessLib/ComponentTransport/TestLookupTable.cpp +++ b/Tests/ProcessLib/ComponentTransport/TestLookupTable.cpp @@ -217,12 +217,12 @@ TEST_F(ComponentTransport_FieldGetBoundingSeedPointsTests, TestOneElementVector) { auto const field = createField({3.0}); double const value = 3.0; - ASSERT_DEATH(field.getBoundingSeedPoints(value), ""); + ASSERT_THROW(field.getBoundingSeedPoints(value), std::runtime_error); } TEST_F(ComponentTransport_FieldGetBoundingSeedPointsTests, TestEmptyVector) { auto const field = createField({}); double const value = 3.0; - ASSERT_DEATH(field.getBoundingSeedPoints(value), ""); + ASSERT_THROW(field.getBoundingSeedPoints(value), std::runtime_error); }