17 #define STYPE std::complex<double>
19 template<
typename TYPE>
28 int main(
int argc,
char* argv[])
33 if (argc>1)
if (argv[1][0]==
'-' && argv[1][1]==
'v') verbose =
true;
38 int numberFailedTests = 0;
40 std::string testName =
"";
42 if (verbose) std::cout<<std::endl<<
"********** CHECKING TEUCHOS SERIAL SYMMETRIC DENSE MATRIX **********"<<std::endl<<std::endl;
46 if (verbose) std::cout <<
"default constructor -- construct empty matrix ";
48 if (verbose) std::cout <<
"unsuccessful."<<std::endl;
51 if (verbose) std::cout <<
"successful."<<std::endl;
57 if (verbose) std::cout <<
"constructor 1 -- empty matrix with given dimensions ";
58 if ( Con1Test.
numRows()!=4 || Con1Test.
numCols()!=4 || Con1Test( 1, 2 )!=0.0 ) {
59 if (verbose) std::cout <<
"unsuccessful."<<std::endl;
62 if (verbose) std::cout <<
"successful."<<std::endl;
68 for(i = 0; i < 9; i++)
73 Con2Test1ExpRes.
shape(3);
74 Con2Test1ExpRes(0, 0) = 0;
75 Con2Test1ExpRes(1, 0) = 1; Con2Test1ExpRes(1, 1) = 4;
76 Con2Test1ExpRes(2, 0) = 2; Con2Test1ExpRes(2, 1) = 5; Con2Test1ExpRes(2, 2) = 8;
80 numberFailedTests +=
PrintTestResults(
"constructor 2 -- construct matrix from array subrange", Con2Test1, Con2Test1ExpRes, verbose);
85 SDMatrix Con3TestCopy( Con2Test1ExpRes );
86 if(verbose) std::cout <<
"constructor 3 -- copy constructor ";
87 if ( Con3TestCopy != Con2Test1ExpRes ) {
88 if (verbose) std::cout <<
"unsuccessful."<<std::endl;
91 if (verbose) std::cout <<
"successful."<<std::endl;
94 SDMatrix Con3TestCopyTrans( Con2Test1ExpRes );
96 if(verbose) std::cout <<
"constructor 3 -- copy constructor (upper active storage) ";
97 if ( Con3TestCopyTrans(2, 0) != Con2Test1ExpRes(2, 0) ) {
98 if (verbose) std::cout <<
"unsuccessful."<<std::endl;
101 if (verbose) std::cout <<
"successful."<<std::endl;
108 Con4TestSubmatrix.
shape( 2 );
109 Con4TestSubmatrix(0, 0) = 4;
110 Con4TestSubmatrix(1, 0) = 5; Con4TestSubmatrix(1, 1) = 8;
112 numberFailedTests +=
PrintTestResults(
"constructor 4 -- submatrix copy", Con4TestCopy1, Con4TestSubmatrix, verbose);
114 numberFailedTests +=
PrintTestResults(
"constructor 4 -- full matrix copy", Con4TestCopy2, Con4TestOrig, verbose);
116 numberFailedTests +=
PrintTestResults(
"constructor 4 -- full matrix view", Con4TestView1, Con4TestSubmatrix, verbose);
118 numberFailedTests +=
PrintTestResults(
"constructor 4 -- submatrix view", Con4TestView2, Con4TestOrig, verbose);
125 AAA(1, 0) = 1; AAA(1, 1) = 8;
126 AAA(2, 0) = 2; AAA(2, 1) = 3; AAA(2, 2) = 8;
131 numberFailedTests +=
PrintTestResults(
"normFrobenius of a 3x3", AAA.normFrobenius(), 3.0, verbose);
140 AAA(1, 0) = 1; AAA(1, 1) = 8;
141 AAA(2, 0) = 2; AAA(2, 1) = 3; AAA(2, 2) = 8;
143 DMatrix My_Prod( 4, 3 ), My_GenMatrix( 4, 3 );
148 numberFailedTests +=
PrintTestResults(
"multiply() -- general times symmetric matrix (storage = lower tri)", My_Prod.normOne(), 52.0, verbose);
152 numberFailedTests +=
PrintTestResults(
"multiply() -- general times symmetric matrix (storage = upper tri)", My_Prod.normOne(), 44.0, verbose);
158 testName =
"random() -- enter random entries into matrix";
159 returnCode = CCC.random();
160 numberFailedTests +=
ReturnCodeCheck(testName, returnCode, 0, verbose);
162 testName =
"putScalar() -- set every entry of this matrix to 1.0";
164 numberFailedTests +=
ReturnCodeCheck(testName, returnCode, 0, verbose);
168 if (verbose) std::cout <<
"assign() -- copy the values of an input matrix ";
170 if (verbose) std::cout<<
"successful" <<std::endl;
172 if (verbose) std::cout<<
"unsuccessful" <<std::endl;
180 if (verbose) std::cout <<
"swap() -- swap the values and attributes of two symmetric matrices -- ";
182 bool op_result = ( (CCC2swap == copyCCC2) && (CCC2 == copyCCC2swap) );
184 std::cout << (op_result ?
"successful" :
"failed" )<<std::endl;
194 if (verbose) std::cout <<
"operator= -- small(empty) = large(view) ";
195 if (CCCtest1.
numRows()==3 && CCCtest1.
values()==CCC.values()) {
196 if (verbose) std::cout<<
"successful" <<std::endl;
198 if (verbose) std::cout<<
"unsuccessful" <<std::endl;
202 if (verbose) std::cout <<
"operator= -- small(view) = large(copy) ";
203 if (CCCtest1.
numRows()==5 && CCCtest1.
values()!=CCC.values()) {
204 if (verbose) std::cout<<
"successful"<<std::endl;
206 if (verbose) std::cout<<
"unsuccessful"<<std::endl;
212 if (verbose) std::cout <<
"operator= -- large(copy) = small(copy) ";
214 if (verbose) std::cout<<
"successful"<<std::endl;
216 if (verbose) std::cout<<
"unsuccessful"<<std::endl;
220 if (verbose) std::cout <<
"operator= -- large(copy) = small(view) ";
222 if(verbose) std::cout<<
"successful" <<std::endl;
224 if (verbose) std::cout<<
"unsuccessful"<<std::endl;
229 CCCtest1 += CCCtest3;
230 if (verbose) std::cout <<
"operator+= -- add two matrices of the same size, but different leading dimension ";
231 if (CCCtest1(1,1)==2.0) {
232 if(verbose) std::cout<<
"successful" <<std::endl;
234 if (verbose) std::cout<<
"unsuccessful"<<std::endl;
237 if (verbose) std::cout <<
"operator+= -- add two matrices of different size (nothing should change) ";
239 if (CCCtest1(1,1)==2.0) {
240 if(verbose) std::cout<<
"successful" <<std::endl;
242 if (verbose) std::cout<<
"unsuccessful"<<std::endl;
252 if (verbose) std::cout <<
"operator*= -- scale matrix by some number ";
254 if (ScalTest(7, 1) == 8.0) {
255 if (verbose) std::cout<<
"successful." <<std::endl;
257 if (verbose) std::cout<<
"unsuccessful." <<std::endl;
266 A1(0,0) = 1.0, A1(1,1) = 2.0;
267 A2(0,0) = 1.0, A2(1,1) = 2.0, A2(2,2) = 3.00;
270 SDMatrix C1upper(3), C1lower(3), C2upper(2), C2lower(2);
271 C1upper.setUpper(); C2upper.setUpper();
272 C1lower.setLower(); C2lower.
setLower();
278 Teuchos::symMatTripleProduct<OTYPE,STYPE>(
Teuchos::NO_TRANS, alpha, A1, W, C1upper );
279 Teuchos::symMatTripleProduct<OTYPE,STYPE>(
Teuchos::NO_TRANS, alpha, A1, W, C1lower );
283 Teuchos::symMatTripleProduct<OTYPE,STYPE>(
Teuchos::TRANS, alpha, A2, W, C2upper );
284 Teuchos::symMatTripleProduct<OTYPE,STYPE>(
Teuchos::TRANS, alpha, A2, W, C2lower );
286 if (verbose) std::cout <<
"triple product -- compute C = W'*A*W or C = W*A*W' ";
287 if (C1upper(2,1)==C1result && C1lower(1,2)==C1result && C2upper(1,0)==C2result && C2lower(0,1)==C2result) {
288 if (verbose) std::cout<<
"successful." <<std::endl;
290 if (verbose) std::cout<<
"unsuccessful." <<std::endl;
299 if(numberFailedTests > 0)
302 std::cout <<
"Number of failed tests: " << numberFailedTests << std::endl;
303 std::cout <<
"End Result: TEST FAILED" << std::endl;
307 if(numberFailedTests == 0)
308 std::cout <<
"End Result: TEST PASSED" << std::endl;
313 template<
typename TYPE>
314 int PrintTestResults(std::string testName, TYPE calculatedResult, TYPE expectedResult,
bool verbose)
317 if(calculatedResult == expectedResult)
319 if(verbose) std::cout << testName <<
" successful." << std::endl;
324 if(verbose) std::cout << testName <<
" unsuccessful." << std::endl;
330 int ReturnCodeCheck(std::string testName,
int returnCode,
int expectedResult,
bool verbose)
333 if(expectedResult == 0)
337 if(verbose) std::cout << testName <<
" test successful." << std::endl;
342 if(verbose) std::cout << testName <<
" test unsuccessful. Return code was " << returnCode <<
"." << std::endl;
350 if(verbose) std::cout << testName <<
" test successful -- failed as expected." << std::endl;
355 if(verbose) std::cout << testName <<
" test unsuccessful -- did not fail as expected. Return code was " << returnCode <<
"." << std::endl;
SerialSymDenseMatrix< OTYPE, STYPE > SDMatrix
int PrintTestResults(std::string, TYPE, TYPE, bool)
Non-member helper functions on the templated serial, dense matrix/vector classes. ...
Templated serial dense matrix class.
Teuchos::SerialDenseVector< int, std::complex< Real > > DVector
ScalarType * values() const
Returns the pointer to the ScalarType data array contained in the object.
void swap(SerialSymDenseMatrix< OrdinalType, ScalarType > &B)
Swap values between this matrix and incoming matrix.
int shape(OrdinalType numRowsCols)
Set dimensions of a Teuchos::SerialSymDenseMatrix object; init values to zero.
This class creates and provides basic support for symmetric, positive-definite dense matrices of temp...
OrdinalType numRows() const
Returns the row dimension of this matrix.
ScalarTraits< ScalarType >::magnitudeType normInf() const
Returns the Infinity-norm of the matrix.
This class creates and provides basic support for dense vectors of templated type as a specialization...
This structure defines some basic traits for a scalar field type.
void setLower()
Specify that the lower triangle of the this matrix should be used.
void setUpper()
Specify that the upper triangle of the this matrix should be used.
ScalarTraits< ScalarType >::magnitudeType normOne() const
Returns the 1-norm of the matrix.
Teuchos::SerialDenseMatrix< int, std::complex< Real > > DMatrix
int random(const ScalarType bias=0.1 *Teuchos::ScalarTraits< ScalarType >::one())
Set all values in the active area (upper/lower triangle) of this matrix to be random numbers...
std::string Teuchos_Version()
int ReturnCodeCheck(std::string, int, int, bool)
Templated serial, dense, symmetric matrix class.
int main(int argc, char *argv[])
Templated serial dense vector class.
OrdinalType stride() const
Returns the stride between the columns of this matrix in memory.
OrdinalType numCols() const
Returns the column dimension of this matrix.
ScalarTraits< ScalarType >::magnitudeType normFrobenius() const
Returns the Frobenius-norm of the matrix.
SerialSymDenseMatrix< OrdinalType, ScalarType > & assign(const SerialSymDenseMatrix< OrdinalType, ScalarType > &Source)
Copies values from one matrix to another.
static T one()
Returns representation of one for this scalar type.
bool empty() const
Returns whether this matrix is empty.
This class creates and provides basic support for dense rectangular matrix of templated type...