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