diff --git a/test/general/test_matrices.cpp b/test/general/test_matrices.cpp new file mode 100644 index 0000000000..292ff74230 --- /dev/null +++ b/test/general/test_matrices.cpp @@ -0,0 +1,105 @@ +#include "gtest/gtest.h" +#include "cantera/numerics/BandMatrix.h" + +using namespace Cantera; + +class BandMatrixTest : public testing::Test +{ +public: + BandMatrixTest() + : x{1,2,3,4,5,6} + , b1{-8, -8, 6, 40, 149, 81} + , b2{1, 8, 30, 72, 140, 65} + , v1{3, 13, 28, 55, 100, 92} + , v2{0, 5, 16, 39, 115, 116} + { + A1.resize(6, 1, 2); // one lower, two upper + A2.resize(6, 2, 1); // two lower, one upper + // main diagonal + for (size_t i = 0; i < 6; i++) { + A1(i, i) = i + 1; + A2(i, i) = i + 1; + } + + // first subdiagonal and superdiagonal + for (size_t i = 0; i < 5; i++) { + A1(i+1, i) = 2 * i + 1; + A1(i, i+1) = i * i; + A2(i+1, i) = 2 * i + 1; + A2(i, i+1) = i * i; + } + + // second subdiagonal and superdiagonal + for (size_t i = 0; i < 4; i++) { + A1(i, i+2) = - static_cast(i + 3); + A2(i+2, i) = - static_cast(i + 1); + } + } + + BandMatrix A1, A2; + vector_fp x; + vector_fp b1, b2; + vector_fp v1, v2; +}; + +TEST_F(BandMatrixTest, matrix_times_vector) +{ + vector_fp c(6, 0.0); + A1.mult(x.data(), c.data()); + for (size_t i = 0; i < 6; i++) { + EXPECT_DOUBLE_EQ(b1[i], c[i]); + } + A2.mult(x.data(), c.data()); + for (size_t i = 0; i < 6; i++) { + EXPECT_DOUBLE_EQ(b2[i], c[i]); + } +} + +TEST_F(BandMatrixTest, vector_times_matrix) +{ + vector_fp c(6, 0.0); + A1.leftMult(x.data(), c.data()); + for (size_t i = 0; i < 6; i++) { + EXPECT_DOUBLE_EQ(v1[i], c[i]); + } + A2.leftMult(x.data(), c.data()); + for (size_t i = 0; i < 6; i++) { + EXPECT_DOUBLE_EQ(v2[i], c[i]); + } +} + +TEST_F(BandMatrixTest, solve_linear_system) +{ + vector_fp c(6, 0.0); + A1.solve(b1.data(), c.data()); + for (size_t i = 0; i < 6; i++) { + EXPECT_NEAR(x[i], c[i], 1e-10); + } + A2.solve(b2.data(), c.data()); + for (size_t i = 0; i < 6; i++) { + EXPECT_NEAR(x[i], c[i], 1e-10); + } +} + +TEST_F(BandMatrixTest, oneNorm) { + + EXPECT_DOUBLE_EQ(28, A1.oneNorm()); + EXPECT_DOUBLE_EQ(23, A2.oneNorm()); +} + +TEST_F(BandMatrixTest, checkRowsColumns) { + double s; + size_t i = A1.checkRows(s); + EXPECT_EQ((size_t) 0, i); + EXPECT_DOUBLE_EQ(3, s); + i = A2.checkRows(s); + EXPECT_EQ((size_t) 0, i); + EXPECT_DOUBLE_EQ(1, s); + + i = A1.checkColumns(s); + EXPECT_EQ((size_t) 0, i); + EXPECT_DOUBLE_EQ(1, s); + i = A2.checkColumns(s); + EXPECT_EQ((size_t) 0, i); + EXPECT_DOUBLE_EQ(1, s); +}