Skip to content

Commit

Permalink
Merge branch 'ComponentTransportLookupTable' into 'master'
Browse files Browse the repository at this point in the history
[PL/CT] Test and refactor LookupTable internal function

See merge request ogs/ogs!4679
  • Loading branch information
endJunction committed Jul 20, 2023
2 parents b4dd732 + bc8c3ea commit 32b1187
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 9 deletions.
22 changes: 14 additions & 8 deletions ProcessLib/ComponentTransport/LookupTable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,21 +35,27 @@ static void intersection(std::vector<std::size_t>& vec1,

std::pair<double, double> 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<GlobalVector*> const& x,
Expand Down
75 changes: 74 additions & 1 deletion Tests/ProcessLib/ComponentTransport/TestLookupTable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
#include <gtest/gtest.h>

#include <Eigen/Core>
#include <cmath>
#include <map>
#include <memory>
#include <vector>

#include "BaseLib/ConfigTree.h"
#include "BaseLib/FileTools.h"
Expand Down Expand Up @@ -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<double> 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_THROW(field.getBoundingSeedPoints(value), std::runtime_error);
}

TEST_F(ComponentTransport_FieldGetBoundingSeedPointsTests, TestEmptyVector)
{
auto const field = createField({});
double const value = 3.0;
ASSERT_THROW(field.getBoundingSeedPoints(value), std::runtime_error);
}

0 comments on commit 32b1187

Please sign in to comment.