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