49#define STYPE std::complex<double>
51template<
typename TYPE>
60int main(
int argc,
char* argv[])
65 if (argc>1)
if (argv[1][0]==
'-' && argv[1][1]==
'v') verbose =
true;
70 int numberFailedTests = 0;
72 std::string testName =
"";
74 if (verbose) std::cout<<std::endl<<
"********** CHECKING TEUCHOS SERIAL SYMMETRIC DENSE MATRIX **********"<<std::endl<<std::endl;
78 if (verbose) std::cout <<
"default constructor -- construct empty matrix ";
79 if ( DefConTest.values()!=NULL || DefConTest.numCols()!=0 || DefConTest.numRows()!=0 ||DefConTest.stride()!=0 ||DefConTest.empty()!=
true ) {
80 if (verbose) std::cout <<
"unsuccessful."<<std::endl;
83 if (verbose) std::cout <<
"successful."<<std::endl;
89 if (verbose) std::cout <<
"constructor 1 -- empty matrix with given dimensions ";
90 if ( Con1Test.numRows()!=4 || Con1Test.numCols()!=4 || Con1Test( 1, 2 )!=0.0 ) {
91 if (verbose) std::cout <<
"unsuccessful."<<std::endl;
94 if (verbose) std::cout <<
"successful."<<std::endl;
100 for(i = 0; i < 9; i++)
105 Con2Test1ExpRes.shape(3);
106 Con2Test1ExpRes(0, 0) = 0;
107 Con2Test1ExpRes(1, 0) = 1; Con2Test1ExpRes(1, 1) = 4;
108 Con2Test1ExpRes(2, 0) = 2; Con2Test1ExpRes(2, 1) = 5; Con2Test1ExpRes(2, 2) = 8;
112 numberFailedTests +=
PrintTestResults(
"constructor 2 -- construct matrix from array subrange", Con2Test1, Con2Test1ExpRes, verbose);
117 SDMatrix Con3TestCopy( Con2Test1ExpRes );
118 if(verbose) std::cout <<
"constructor 3 -- copy constructor ";
119 if ( Con3TestCopy != Con2Test1ExpRes ) {
120 if (verbose) std::cout <<
"unsuccessful."<<std::endl;
123 if (verbose) std::cout <<
"successful."<<std::endl;
126 SDMatrix Con3TestCopyTrans( Con2Test1ExpRes );
127 Con3TestCopyTrans.setUpper();
128 if(verbose) std::cout <<
"constructor 3 -- copy constructor (upper active storage) ";
129 if ( Con3TestCopyTrans(2, 0) != Con2Test1ExpRes(2, 0) ) {
130 if (verbose) std::cout <<
"unsuccessful."<<std::endl;
133 if (verbose) std::cout <<
"successful."<<std::endl;
140 Con4TestSubmatrix.shape( 2 );
141 Con4TestSubmatrix(0, 0) = 4;
142 Con4TestSubmatrix(1, 0) = 5; Con4TestSubmatrix(1, 1) = 8;
144 numberFailedTests +=
PrintTestResults(
"constructor 4 -- submatrix copy", Con4TestCopy1, Con4TestSubmatrix, verbose);
146 numberFailedTests +=
PrintTestResults(
"constructor 4 -- full matrix copy", Con4TestCopy2, Con4TestOrig, verbose);
148 numberFailedTests +=
PrintTestResults(
"constructor 4 -- full matrix view", Con4TestView1, Con4TestSubmatrix, verbose);
150 numberFailedTests +=
PrintTestResults(
"constructor 4 -- submatrix view", Con4TestView2, Con4TestOrig, verbose);
157 AAA(1, 0) = 1; AAA(1, 1) = 8;
158 AAA(2, 0) = 2; AAA(2, 1) = 3; AAA(2, 2) = 8;
160 numberFailedTests +=
PrintTestResults(
"normOne of a 3x3", AAA.normOne(), 13.0, verbose);
161 numberFailedTests +=
PrintTestResults(
"normInf of a 3x3", AAA.normInf(), 13.0, verbose);
163 numberFailedTests +=
PrintTestResults(
"normFrobenius of a 3x3", AAA.normFrobenius(), 3.0, verbose);
164 numberFailedTests +=
PrintTestResults(
"normOne of a 0x0", BBB.normOne(), 0.0, verbose);
165 numberFailedTests +=
PrintTestResults(
"normInf of a 0x0", BBB.normInf(), 0.0, verbose);
166 numberFailedTests +=
PrintTestResults(
"normFrobenius of a 0x0", BBB.normFrobenius(), 0.0, verbose);
172 AAA(1, 0) = 1; AAA(1, 1) = 8;
173 AAA(2, 0) = 2; AAA(2, 1) = 3; AAA(2, 2) = 8;
175 DMatrix My_Prod( 4, 3 ), My_GenMatrix( 4, 3 );
180 numberFailedTests +=
PrintTestResults(
"multiply() -- general times symmetric matrix (storage = lower tri)", My_Prod.normOne(), 52.0, verbose);
184 numberFailedTests +=
PrintTestResults(
"multiply() -- general times symmetric matrix (storage = upper tri)", My_Prod.normOne(), 44.0, verbose);
190 testName =
"random() -- enter random entries into matrix";
191 returnCode = CCC.random();
192 numberFailedTests +=
ReturnCodeCheck(testName, returnCode, 0, verbose);
194 testName =
"putScalar() -- set every entry of this matrix to 1.0";
196 numberFailedTests +=
ReturnCodeCheck(testName, returnCode, 0, verbose);
200 if (verbose) std::cout <<
"assign() -- copy the values of an input matrix ";
202 if (verbose) std::cout<<
"successful" <<std::endl;
204 if (verbose) std::cout<<
"unsuccessful" <<std::endl;
212 if (verbose) std::cout <<
"swap() -- swap the values and attributes of two symmetric matrices -- ";
214 bool op_result = ( (CCC2swap == copyCCC2) && (CCC2 == copyCCC2swap) );
216 std::cout << (op_result ?
"successful" :
"failed" )<<std::endl;
226 if (verbose) std::cout <<
"operator= -- small(empty) = large(view) ";
227 if (CCCtest1.numRows()==3 && CCCtest1.values()==CCC.values()) {
228 if (verbose) std::cout<<
"successful" <<std::endl;
230 if (verbose) std::cout<<
"unsuccessful" <<std::endl;
234 if (verbose) std::cout <<
"operator= -- small(view) = large(copy) ";
235 if (CCCtest1.numRows()==5 && CCCtest1.values()!=CCC.values()) {
236 if (verbose) std::cout<<
"successful"<<std::endl;
238 if (verbose) std::cout<<
"unsuccessful"<<std::endl;
244 if (verbose) std::cout <<
"operator= -- large(copy) = small(copy) ";
245 if (CCCtest1.numRows()==2 ) {
246 if (verbose) std::cout<<
"successful"<<std::endl;
248 if (verbose) std::cout<<
"unsuccessful"<<std::endl;
252 if (verbose) std::cout <<
"operator= -- large(copy) = small(view) ";
253 if (CCCtest1.numRows()==3 && CCCtest1.stride()==5) {
254 if(verbose) std::cout<<
"successful" <<std::endl;
256 if (verbose) std::cout<<
"unsuccessful"<<std::endl;
261 CCCtest1 += CCCtest3;
262 if (verbose) std::cout <<
"operator+= -- add two matrices of the same size, but different leading dimension ";
263 if (CCCtest1(1,1)==2.0) {
264 if(verbose) std::cout<<
"successful" <<std::endl;
266 if (verbose) std::cout<<
"unsuccessful"<<std::endl;
269 if (verbose) std::cout <<
"operator+= -- add two matrices of different size (nothing should change) ";
271 if (CCCtest1(1,1)==2.0) {
272 if(verbose) std::cout<<
"successful" <<std::endl;
274 if (verbose) std::cout<<
"unsuccessful"<<std::endl;
284 if (verbose) std::cout <<
"operator*= -- scale matrix by some number ";
286 if (ScalTest(7, 1) == 8.0) {
287 if (verbose) std::cout<<
"successful." <<std::endl;
289 if (verbose) std::cout<<
"unsuccessful." <<std::endl;
298 A1(0,0) = 1.0, A1(1,1) = 2.0;
299 A2(0,0) = 1.0, A2(1,1) = 2.0, A2(2,2) = 3.00;
302 SDMatrix C1upper(3), C1lower(3), C2upper(2), C2lower(2);
303 C1upper.setUpper(); C2upper.setUpper();
304 C1lower.setLower(); C2lower.setLower();
310 Teuchos::symMatTripleProduct<OTYPE,STYPE>(
Teuchos::NO_TRANS, alpha, A1, W, C1upper );
311 Teuchos::symMatTripleProduct<OTYPE,STYPE>(
Teuchos::NO_TRANS, alpha, A1, W, C1lower );
315 Teuchos::symMatTripleProduct<OTYPE,STYPE>(
Teuchos::TRANS, alpha, A2, W, C2upper );
316 Teuchos::symMatTripleProduct<OTYPE,STYPE>(
Teuchos::TRANS, alpha, A2, W, C2lower );
318 if (verbose) std::cout <<
"triple product -- compute C = W'*A*W or C = W*A*W' ";
319 if (C1upper(2,1)==C1result && C1lower(1,2)==C1result && C2upper(1,0)==C2result && C2lower(0,1)==C2result) {
320 if (verbose) std::cout<<
"successful." <<std::endl;
322 if (verbose) std::cout<<
"unsuccessful." <<std::endl;
331 if(numberFailedTests > 0)
334 std::cout <<
"Number of failed tests: " << numberFailedTests << std::endl;
335 std::cout <<
"End Result: TEST FAILED" << std::endl;
339 if(numberFailedTests == 0)
340 std::cout <<
"End Result: TEST PASSED" << std::endl;
345template<
typename TYPE>
346int PrintTestResults(std::string testName, TYPE calculatedResult, TYPE expectedResult,
bool verbose)
349 if(calculatedResult == expectedResult)
351 if(verbose) std::cout << testName <<
" successful." << std::endl;
356 if(verbose) std::cout << testName <<
" unsuccessful." << std::endl;
362int ReturnCodeCheck(std::string testName,
int returnCode,
int expectedResult,
bool verbose)
365 if(expectedResult == 0)
369 if(verbose) std::cout << testName <<
" test successful." << std::endl;
374 if(verbose) std::cout << testName <<
" test unsuccessful. Return code was " << returnCode <<
"." << std::endl;
382 if(verbose) std::cout << testName <<
" test successful -- failed as expected." << std::endl;
387 if(verbose) std::cout << testName <<
" test unsuccessful -- did not fail as expected. Return code was " << returnCode <<
"." << std::endl;
Non-member helper functions on the templated serial, dense matrix/vector classes.
Templated serial dense matrix class.
Templated serial dense vector class.
Templated serial, dense, symmetric matrix class.
This class creates and provides basic support for dense rectangular matrix of templated type.
This class creates and provides basic support for dense vectors of templated type as a specialization...
This class creates and provides basic support for symmetric, positive-definite dense matrices of temp...
SerialSymDenseMatrix< OTYPE, STYPE > SDMatrix
std::string Teuchos_Version()
This structure defines some basic traits for a scalar field type.
static T one()
Returns representation of one for this scalar type.
Teuchos::SerialSymDenseMatrix< OTYPE, STYPE > SDMatrix
Teuchos::SerialDenseVector< OTYPE, STYPE > DVector
int PrintTestResults(std::string, TYPE, TYPE, bool)
Teuchos::SerialDenseMatrix< OTYPE, STYPE > DMatrix
int ReturnCodeCheck(std::string, int, int, bool)