1 
2 #include "TMV.h"
3 #include "TMV_Small.h"
4 #include "TMV_Test.h"
5 #include "TMV_Test_3.h"
6 #define NORDIVEQ
7 #include "TMV_TestMatrixDivArith.h"
8 
9 template <class T, tmv::StorageType stor, int N>
TestSmallNonSquareDiv_B5a()10 static void TestSmallNonSquareDiv_B5a()
11 {
12     tmv::SmallMatrix<T,6,N,stor> m;
13 
14     for(int i=0;i<6;++i) for(int j=0;j<N;++j) m(i,j) = T(2+4*i-5*j);
15     m.diag() *= T(11);
16     m /= T(7);
17     if (N > 1) m(1,0) = -2;
18     if (N > 2) m(2,0) = 7;
19     if (N > 3) m(3,0) = -10;
20     if (N > 2) m(2,2) = 30;
21 
22     tmv::SmallMatrix<T,6,N,stor> a1 = m;
23     tmv::SmallMatrix<std::complex<T>,6,N,stor> c1 = a1 * std::complex<T>(1,2);
24 
25     tmv::SmallMatrix<T,7,N,stor> a4;
26     for(int i=0;i<7;++i) for(int j=0;j<N;++j) a4(i,j) = T(1-3*i+2*j);
27     a4.subMatrix(0,6,0,N) += a1;
28     tmv::SmallMatrix<std::complex<T>,7,N,stor> c4 = a4*std::complex<T>(1,2);
29     c4.subMatrix(0,6,0,N) += c1;
30     if (N > 1) c4.col(1) *= std::complex<T>(2,1);
31     c4.row(2).addToAll(std::complex<T>(-7,2));
32 
33     tmv::SmallMatrix<T,7,6,stor> a6;
34     for(int i=0;i<7;++i) for(int j=0;j<6;++j) a6(i,j) = T(5+2*i-2*j);
35     a6.subMatrix(1,7,1,1+N) += a1;
36     tmv::SmallMatrix<std::complex<T>,7,6,stor> c6 = a6*std::complex<T>(1,2);
37     c6.subMatrix(1,7,1,1+N) += c1;
38     c6.col(1) *= std::complex<T>(2,1);
39     c6.row(5).addToAll(std::complex<T>(-7,2));
40 
41     TestMatrixDivArith3c(tmv::QR,a1,a4,a6,c1,c4,c6,"NonSquare/NonSquare");
42 #if (XTEST & 32)
43     tmv::SmallMatrix<T,6,N,stor|tmv::FortranStyle> a1f = a1;
44     tmv::SmallMatrix<std::complex<T>,6,N,stor|tmv::FortranStyle> c1f = c1;
45     tmv::SmallMatrix<T,7,N,stor|tmv::FortranStyle> a4f = a4;
46     tmv::SmallMatrix<std::complex<T>,7,N,stor|tmv::FortranStyle> c4f = c4;
47     tmv::SmallMatrix<T,7,6,stor|tmv::FortranStyle> a6f = a6;
48     tmv::SmallMatrix<std::complex<T>,7,6,stor|tmv::FortranStyle> c6f = c6;
49 
50     TestMatrixDivArith3c(tmv::QR,a1f,a4,a6,c1f,c4,c6,"NonSquare/NonSquare");
51     TestMatrixDivArith3c(tmv::QR,a1f,a4f,a6,c1f,c4f,c6,"NonSquare/NonSquare");
52     TestMatrixDivArith3c(tmv::QR,a1f,a4f,a6f,c1f,c4f,c6f,"NonSquare/NonSquare");
53 
54 #endif
55 }
56 
57 template <class T>
TestSmallMatrixDiv_B5a()58 void TestSmallMatrixDiv_B5a()
59 {
60     TestSmallNonSquareDiv_B5a<T,tmv::ColMajor,2>();
61     TestSmallNonSquareDiv_B5a<T,tmv::ColMajor,5>();
62 #if (XTEST & 2)
63     TestSmallNonSquareDiv_B5a<T,tmv::ColMajor,1>();
64     TestSmallNonSquareDiv_B5a<T,tmv::ColMajor,3>();
65     TestSmallNonSquareDiv_B5a<T,tmv::ColMajor,4>();
66     TestSmallNonSquareDiv_B5a<T,tmv::RowMajor,1>();
67     TestSmallNonSquareDiv_B5a<T,tmv::RowMajor,2>();
68     TestSmallNonSquareDiv_B5a<T,tmv::RowMajor,3>();
69     TestSmallNonSquareDiv_B5a<T,tmv::RowMajor,4>();
70     TestSmallNonSquareDiv_B5a<T,tmv::RowMajor,5>();
71 #endif
72 }
73 
74 #ifdef TEST_DOUBLE
75 template void TestSmallMatrixDiv_B5a<double>();
76 #endif
77 #ifdef TEST_FLOAT
78 template void TestSmallMatrixDiv_B5a<float>();
79 #endif
80 #ifdef TEST_LONGDOUBLE
81 template void TestSmallMatrixDiv_B5a<long double>();
82 #endif
83