1 #include "TMV.h"
2 #include "TMV_Small.h"
3 #include "TMV_Test.h"
4 #include "TMV_Test_3.h"
5 #define NONSQUARE
6 #include "TMV_TestMatrixArith.h"
7
8 template <class T, int N>
DoTestSmallMatrixArith_B2b()9 static void DoTestSmallMatrixArith_B2b()
10 {
11 tmv::SmallMatrix<T,N,N,tmv::RowMajor> a1;
12 for(int i=0;i<N;++i) for(int j=0;j<N;++j) {
13 a1(i,j) = T(3+4*i-5*j);
14 }
15 a1(0,0) = 14;
16 if (N > 1) a1(1,0) = -2;
17 if (N > 2) a1(2,0) = 7;
18 if (N > 3) a1(3,0) = -10;
19 if (N > 2) a1(2,2) = 30;
20
21 tmv::SmallMatrix<std::complex<T>,N,N,tmv::RowMajor> ca1 =
22 std::complex<T>(3,2)*a1;
23 if (N > 3) ca1(2,3) += std::complex<T>(2,4);
24 if (N > 1) ca1(1,0) *= std::complex<T>(1,3);
25 if (N > 1) ca1.col(1) *= std::complex<T>(-1,4);
26 if (N > 3) ca1.row(3) +=
27 tmv::SmallVector<std::complex<T>,N>(std::complex<T>(2,9));
28
29 tmv::SmallMatrix<T,7,N,tmv::RowMajor> a3;
30 for(int i=0;i<7;++i) for(int j=0;j<N;++j) a3(i,j) = T(1-3*i+2*j);
31 a3.subMatrix(2,N+2,0,N) += a1;
32 tmv::SmallMatrix<std::complex<T>,7,N,tmv::RowMajor> ca3 =
33 a3*std::complex<T>(1,2);
34 ca3.subMatrix(2,N+2,0,N) += ca1;
35 if (N > 1) ca3.col(1) *= std::complex<T>(2,1);
36 ca3.row(6).addToAll(std::complex<T>(-7,2));
37
38 tmv::SmallMatrix<T,N,7,tmv::RowMajor> a5 = a3.transpose();
39 a5.subMatrix(0,N,1,N+1) -= a1;
40 tmv::SmallMatrix<std::complex<T>,N,7,tmv::RowMajor> ca5 = ca3.adjoint();
41 ca5.subMatrix(0,N,1,N+1) -= ca1;
42 ca5.col(3) *= std::complex<T>(-1,3);
43 ca5.row(0).addToAll(std::complex<T>(1,9));
44
45 tmv::SmallVector<T,N> v1 = a1.row(0);
46 tmv::SmallVector<std::complex<T>,N> cv1 = ca1.row(0);
47 tmv::SmallVector<T,7> v2 = a3.col(0);
48 tmv::SmallVector<std::complex<T>,7> cv2 = ca3.col(0);
49
50 if (showstartdone) {
51 std::cout<<"B2b"<<std::endl;
52 }
53 TestMatrixArith2b(a3,ca3,v1,cv1,v2,cv2,"NonSquare");
54 TestMatrixArith2b(a5,ca5,v2,cv2,v1,cv1,"NonSquare");
55
56 #if (XTEST & 2)
57 tmv::SmallMatrix<T,7,N,tmv::ColMajor> a4 = a3;
58 tmv::SmallMatrix<std::complex<T>,7,N,tmv::ColMajor> ca4 = ca3;
59 tmv::SmallMatrix<T,N,7,tmv::ColMajor> a6 = a5;
60 tmv::SmallMatrix<std::complex<T>,N,7,tmv::ColMajor> ca6 = ca5;
61 TestMatrixArith2b(a4,ca4,v1,cv1,v2,cv2,"NonSquare");
62 TestMatrixArith2b(a6,ca6,v2,cv2,v1,cv1,"NonSquare");
63 #endif
64
65 #if (XTEST & 32)
66 tmv::SmallMatrix<T,7,N,tmv::RowMajor|tmv::FortranStyle> a3f = a3;
67 tmv::SmallMatrix<std::complex<T>,7,N,tmv::RowMajor|tmv::FortranStyle> ca3f = ca3;
68 tmv::SmallMatrix<T,7,N,tmv::ColMajor|tmv::FortranStyle> a4f = a4;
69 tmv::SmallMatrix<std::complex<T>,7,N,tmv::ColMajor|tmv::FortranStyle> ca4f = ca4;
70 tmv::SmallMatrix<T,N,7,tmv::RowMajor|tmv::FortranStyle> a5f = a5;
71 tmv::SmallMatrix<std::complex<T>,N,7,tmv::RowMajor|tmv::FortranStyle> ca5f = ca5;
72 tmv::SmallMatrix<T,N,7,tmv::ColMajor|tmv::FortranStyle> a6f = a6;
73 tmv::SmallMatrix<std::complex<T>,N,7,tmv::ColMajor|tmv::FortranStyle> ca6f = ca6;
74
75 tmv::SmallVector<T,N,tmv::FortranStyle> v1f = v1;
76 tmv::SmallVector<std::complex<T>,N,tmv::FortranStyle> cv1f = cv1;
77 tmv::SmallVector<T,7,tmv::FortranStyle> v2f = v2;
78 tmv::SmallVector<std::complex<T>,7,tmv::FortranStyle> cv2f = cv2;
79
80 TestMatrixArith2b(a3f,ca3f,v1,cv1,v2,cv2,"NonSquare");
81 TestMatrixArith2b(a4f,ca4f,v1,cv1,v2,cv2,"NonSquare");
82 TestMatrixArith2b(a5f,ca5f,v2,cv2,v1,cv1,"NonSquare");
83 TestMatrixArith2b(a6f,ca6f,v2,cv2,v1,cv1,"NonSquare");
84 TestMatrixArith2b(a3f,ca3f,v1f,cv1f,v2,cv2,"NonSquare");
85 TestMatrixArith2b(a3f,ca3f,v1f,cv1f,v2f,cv2f,"NonSquare");
86 TestMatrixArith2b(a5f,ca5f,v2f,cv2f,v1,cv1,"NonSquare");
87 TestMatrixArith2b(a5f,ca5f,v2f,cv2f,v1f,cv1f,"NonSquare");
88 #endif
89 }
90
91 template <class T>
TestSmallMatrixArith_B2b()92 void TestSmallMatrixArith_B2b()
93 {
94 DoTestSmallMatrixArith_B2b<T,2>();
95 DoTestSmallMatrixArith_B2b<T,5>();
96 #if (XTEST & 2)
97 DoTestSmallMatrixArith_B2b<T,1>();
98 DoTestSmallMatrixArith_B2b<T,3>();
99 DoTestSmallMatrixArith_B2b<T,4>();
100 #endif
101 }
102
103 #ifdef TEST_DOUBLE
104 template void TestSmallMatrixArith_B2b<double>();
105 #endif
106 #ifdef TEST_FLOAT
107 template void TestSmallMatrixArith_B2b<float>();
108 #endif
109 #ifdef TEST_LONGDOUBLE
110 template void TestSmallMatrixArith_B2b<long double>();
111 #endif
112 #ifdef TEST_INT
113 template void TestSmallMatrixArith_B2b<int>();
114 #endif
115