1 #define BOOST_TEST_MODULE TestStaticMatrix
2 #include <boost/test/unit_test.hpp>
3 
4 #include <amgcl/value_type/static_matrix.hpp>
5 
6 BOOST_AUTO_TEST_SUITE( test_static_matrix )
7 
BOOST_AUTO_TEST_CASE(sum)8 BOOST_AUTO_TEST_CASE( sum ) {
9     amgcl::static_matrix<int, 2, 2> a = {{1, 2, 3, 4}};
10     amgcl::static_matrix<int, 2, 2> b = {{4, 3, 2, 1}};
11     amgcl::static_matrix<int, 2, 2> c = a + b;
12 
13     for(int i = 0; i < 2; ++i)
14         for(int j = 0; j < 2; ++j)
15             BOOST_CHECK_EQUAL(c(i,j), 5);
16 }
17 
BOOST_AUTO_TEST_CASE(minus)18 BOOST_AUTO_TEST_CASE( minus ) {
19     amgcl::static_matrix<int, 2, 2> a = {{5, 5, 5, 5}};
20     amgcl::static_matrix<int, 2, 2> b = {{4, 3, 2, 1}};
21     amgcl::static_matrix<int, 2, 2> c = a - b;
22 
23     for(int i = 0; i < 4; ++i)
24         BOOST_CHECK_EQUAL(c(i), i+1);
25 }
26 
BOOST_AUTO_TEST_CASE(product)27 BOOST_AUTO_TEST_CASE( product ) {
28     amgcl::static_matrix<int, 2, 2> a = {{2, 1, 1, 2}};
29     amgcl::static_matrix<int, 2, 2> c = a * a;
30 
31     BOOST_CHECK_EQUAL(c(0,0), 5);
32     BOOST_CHECK_EQUAL(c(0,1), 4);
33     BOOST_CHECK_EQUAL(c(1,0), 4);
34     BOOST_CHECK_EQUAL(c(1,1), 5);
35 }
36 
BOOST_AUTO_TEST_CASE(scale)37 BOOST_AUTO_TEST_CASE( scale ) {
38     amgcl::static_matrix<int, 2, 2> a = {{1, 2, 3, 4}};
39     amgcl::static_matrix<int, 2, 2> c = 2 * a;
40 
41     for(int i = 0; i < 4; ++i)
42         BOOST_CHECK_EQUAL(c(i), 2 * (i+1));
43 }
44 
BOOST_AUTO_TEST_CASE(inner_product)45 BOOST_AUTO_TEST_CASE( inner_product ) {
46     amgcl::static_matrix<int, 2, 1> a = {{1, 2}};
47     int c = amgcl::math::inner_product(a, a);
48 
49     BOOST_CHECK_EQUAL(c, 5);
50 }
51 
BOOST_AUTO_TEST_CASE(inverse)52 BOOST_AUTO_TEST_CASE( inverse ) {
53     amgcl::static_matrix<double, 2, 2> a = {{2.0, -1.0, -1.0, 2.0}};
54     amgcl::static_matrix<double, 2, 2> b = amgcl::math::inverse(a);
55     amgcl::static_matrix<double, 2, 2> c = b * a;
56 
57     for(int i = 0; i < 2; ++i)
58         for(int j = 0; j < 2; ++j)
59             BOOST_CHECK_SMALL(c(i,j) - (i == j), 1e-8);
60 }
61 
BOOST_AUTO_TEST_CASE(inverse_pivoting)62 BOOST_AUTO_TEST_CASE( inverse_pivoting ) {
63     amgcl::static_matrix<double, 4, 4> a {{
64     1, -0.1, -0.028644256, 0.25684664,
65     1, -0.1, -0.025972342, 0.25663863,
66     1, -0.095699158, -0.029327056, 0.25554974,
67     1, -0.09543351, -0.026189496, 0.25796741,
68     }};
69     amgcl::static_matrix<double, 4, 4> b = amgcl::math::inverse(a);
70     amgcl::static_matrix<double, 4, 4> c = b * a;
71 
72     for(int i = 0; i < 4; ++i)
73         for(int j = 0; j < 4; ++j)
74             BOOST_CHECK_SMALL(c(i,j) - (i == j), 1e-8);
75 }
76 
BOOST_AUTO_TEST_CASE(inverse_pivoting_2)77 BOOST_AUTO_TEST_CASE( inverse_pivoting_2 ) {
78     amgcl::static_matrix<double, 4, 4> a {{
79     0, 1, 0, 0,
80     0, 0, 1, 0,
81     1, 0, 0, 0,
82     0, 0, 0, 1,
83     }};
84     amgcl::static_matrix<double, 4, 4> b = amgcl::math::inverse(a);
85     amgcl::static_matrix<double, 4, 4> c = b * a;
86 
87     for(int i = 0; i < 4; ++i)
88         for(int j = 0; j < 4; ++j)
89             BOOST_CHECK_SMALL(c(i,j) - (i == j), 1e-8);
90 }
91 
92 BOOST_AUTO_TEST_SUITE_END()
93