diff --git a/unit_test/tstBatchedLinearAlgebra.hpp b/unit_test/tstBatchedLinearAlgebra.hpp index ca1a5c2..0446957 100644 --- a/unit_test/tstBatchedLinearAlgebra.hpp +++ b/unit_test/tstBatchedLinearAlgebra.hpp @@ -16,6 +16,8 @@ #include +#include +#include #include using namespace Picasso; @@ -711,7 +713,6 @@ void kernelTest() } //---------------------------------------------------------------------------// -/* void eigendecompositionTest() { LinearAlgebra::Matrix A = { @@ -822,7 +823,43 @@ void eigendecompositionTest() for ( int j = 0; j < 4; ++j ) EXPECT_FLOAT_EQ( A( i, j ), l_op_ident( i, j ) ); } -*/ + +//---------------------------------------------------------------------------// +// Test a matrix for which the KokkosKernels eigendecomposition gives the wrong +// answer. +//---------------------------------------------------------------------------// +void eigendecompositionTestBad() +{ + LinearAlgebra::Matrix A = { { 0.5, 0.0, 2.5, 0.0, 0.0 }, + { 0.0, 0.5, 0.0, 0.0, 0.0 }, + { 0.0, 0.0, 0.5, 0.0, 0.4 }, + { 0.0, 0.0, 0.0, 0.5, 0.0 }, + { 0.0, 0.0, 1.05, 0.0, 0.5 } }; + + LinearAlgebra::Vector e_real; + LinearAlgebra::Vector e_imag; + LinearAlgebra::Matrix u_left; + LinearAlgebra::Matrix u_right; + + LinearAlgebra::eigendecomposition( A, e_real, e_imag, u_left, u_right ); + + // All eigenvalues should be real + for ( int i = 0; i < 5; ++i ) + EXPECT_EQ( 0.0, e_imag( i ) ) << "i = " << i; + + // Sort eigenvalues + std::array sorted_e_real; + for ( int i = 0; i < 5; ++i ) + sorted_e_real[i] = e_real( i ); + std::sort( sorted_e_real.begin(), sorted_e_real.end() ); + + // Test sorted eigenvalues + EXPECT_DOUBLE_EQ( -0.14807406984078597, sorted_e_real[0] ); + EXPECT_DOUBLE_EQ( 0.5, sorted_e_real[1] ); + EXPECT_DOUBLE_EQ( 0.5, sorted_e_real[2] ); + EXPECT_DOUBLE_EQ( 0.5, sorted_e_real[3] ); + EXPECT_DOUBLE_EQ( 1.148074069840786, sorted_e_real[4] ); +} //---------------------------------------------------------------------------// // RUN TESTS @@ -867,8 +904,12 @@ TEST( TEST_CATEGORY, kernelTest ) kernelTest<20>(); } -// FIXME_KOKKOSKERNELS -// TEST( TEST_CATEGORY, eigendecomposition_test ) { eigendecompositionTest(); } +TEST( TEST_CATEGORY, eigendecomposition_test ) { eigendecompositionTest(); } + +TEST( TEST_CATEGORY, eigendecomposition_test_bad ) +{ + eigendecompositionTestBad(); +} //---------------------------------------------------------------------------//