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