Teuchos Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
cxx_main_band.cpp
Go to the documentation of this file.
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Teuchos: Common Tools Package
5 // Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
46 #include "Teuchos_Version.hpp"
47 
48 #define OTYPE int
49 #define STYPE std::complex<double>
50 
51 template<typename TYPE>
52 int PrintTestResults(std::string, TYPE, TYPE, bool);
53 
54 int ReturnCodeCheck(std::string, int, int, bool);
55 
59 
60 int main(int argc, char* argv[])
61 {
62 
63  int i;
64  bool verbose = 0;
65  if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true;
66 
67  if (verbose)
68  std::cout << Teuchos::Teuchos_Version() << std::endl << std::endl;
69 
70  int numberFailedTests = 0;
71  int returnCode = 0;
72  std::string testName = "";
73 
74  if (verbose) std::cout<<std::endl<<"********** CHECKING TEUCHOS SERIAL BANDED DENSE MATRIX **********"<<std::endl<<std::endl;
75 
76  // default constructor test
77  BDMatrix DefConTest;
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;
81  numberFailedTests++;
82  } else {
83  if (verbose) std::cout << "successful."<<std::endl;
84  }
85 
86  // constructor 1 (matrix w/ dimension but empty)
87 
88  BDMatrix Con1Test( 4, 4, 1, 1 );
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;
92  numberFailedTests++;
93  } else {
94  if (verbose) std::cout << "successful."<<std::endl;
95  }
96 
97  // constructor 2 (from array) tests
98 
99  STYPE a[25];
100  a[4] = 5; a[8] = 11; a[12] = 17; a[16] = 23;
101  a[1] = 0; a[5] = 6; a[9] = 12; a[13] = 18; a[17] = 24;
102  a[2] = 1; a[6] = 7; a[10] = 13; a[14] = 19;
103  a[3] = 2; a[7] = 8; a[11] = 14;
104 
105  BDMatrix C2T1ER;
106  C2T1ER.shape(5, 5, 2, 1);
107  C2T1ER(0, 0) = 0; C2T1ER(0, 1) = 5;
108  C2T1ER(1, 0) = 1; C2T1ER(1, 1) = 6; C2T1ER(1, 2) = 11;
109  C2T1ER(2, 0) = 2; C2T1ER(2, 1) = 7; C2T1ER(2, 2) = 12; C2T1ER(2, 3) = 17;
110  C2T1ER(3, 1) = 8; C2T1ER(3, 2) = 13; C2T1ER(3, 3) = 18; C2T1ER(3, 4) = 23;
111  C2T1ER(4, 2) = 14; C2T1ER(4, 3) = 19; C2T1ER(4, 4) = 24;
112 
113  // Create another lower triangular matrix with a view of 'a'.
114  BDMatrix Con2Test1(Teuchos::Copy, a, 4, 5, 5, 2, 1);
115  numberFailedTests += PrintTestResults("constructor 2 -- construct matrix from array subrange", Con2Test1, C2T1ER, verbose);
116 
117  // constructor 3 (copy constructor)
118 
119  BDMatrix Con3TestCopy( C2T1ER );
120  if(verbose) std::cout <<"constructor 3 -- copy constructor ";
121  if ( Con3TestCopy != C2T1ER ) {
122  if (verbose) std::cout << "unsuccessful."<<std::endl;
123  numberFailedTests++;
124  } else {
125  if (verbose) std::cout << "successful."<<std::endl;
126  }
127 
128  BDMatrix Con3TestCopyTrans( C2T1ER, Teuchos::TRANS );
129  if(verbose) std::cout <<"constructor 3 -- copy constructor (transposed) ";
130  if ( Con3TestCopyTrans(0, 2) != C2T1ER(2, 0) ) {
131  if (verbose) std::cout << "unsuccessful."<<std::endl;
132  numberFailedTests++;
133  } else {
134  if (verbose) std::cout << "successful."<<std::endl;
135  }
136 
137  // constructor 4 (submatrix)
138 
139  BDMatrix Con4TestOrig(Teuchos::Copy, a, 4, 5, 5, 2, 1);
140  BDMatrix C4TS;
141  C4TS.shape( 3, 3, 2, 1 );
142  C4TS(0, 0) = 12; C4TS(0, 1) = 17;
143  C4TS(1, 0) = 13; C4TS(1, 1) = 18; C4TS(1, 2) = 23;
144  C4TS(2, 0) = 14; C4TS(2, 1) = 19; C4TS(2, 2) = 24;
145 
146  BDMatrix Con4TestCopy1(Teuchos::Copy, Con4TestOrig, 3, 3, 2);
147  numberFailedTests += PrintTestResults("constructor 4 -- submatrix copy", Con4TestCopy1, C4TS, verbose);
148  BDMatrix Con4TestCopy2(Teuchos::Copy, Con4TestOrig, 5, 5, 0);
149  numberFailedTests += PrintTestResults("constructor 4 -- full matrix copy", Con4TestCopy2, Con4TestOrig, verbose);
150  BDMatrix Con4TestView1(Teuchos::View, Con4TestOrig, 5, 5, 0);
151  numberFailedTests += PrintTestResults("constructor 4 -- full matrix view", Con4TestView1, Con4TestOrig, verbose);
152  BDMatrix Con4TestView2(Teuchos::View, Con4TestOrig, 3, 3, 2);
153  numberFailedTests += PrintTestResults("constructor 4 -- submatrix view", Con4TestView2, C4TS, verbose);
154 
155  // Norm Tests
156 
157  BDMatrix AAA;
158  AAA.shape( 5, 5, 2, 1 );
159  AAA(0, 0) = 0; AAA(0, 1) = 5;
160  AAA(1, 0) = 1; AAA(1, 1) = 6; AAA(1, 2) = 11;
161  AAA(2, 0) = 2; AAA(2, 1) = 7; AAA(2, 2) = 12; AAA(2, 3) = 17;
162  AAA(3, 1) = 8; AAA(3, 2) = 13; AAA(3, 3) = 18; AAA(3, 4) = 23;
163  AAA(4, 2) = 14; AAA(4, 3) = 19; AAA(4, 4) = 24;
164 
165  BDMatrix BBB;
166  numberFailedTests += PrintTestResults("normOne of a 5x5", AAA.normOne(), 54.0, verbose);
167  numberFailedTests += PrintTestResults("normInf of a 5x5", AAA.normInf(), 62.0, verbose);
169  numberFailedTests += PrintTestResults("normFrobenius of a 5x5", AAA.normFrobenius(), 4.0, verbose);
170  numberFailedTests += PrintTestResults("normOne of a 0x0", BBB.normOne(), 0.0, verbose);
171  numberFailedTests += PrintTestResults("normInf of a 0x0", BBB.normInf(), 0.0, verbose);
172  numberFailedTests += PrintTestResults("normFrobenius of a 0x0", BBB.normFrobenius(), 0.0, verbose);
173 
174  // Set Method Tests.
175 
176  BDMatrix CCC( 5, 5, 2, 1 );
177  // Randomize the entries in CCC.
178  testName = "random() -- enter random entries into matrix";
179  returnCode = CCC.random();
180  numberFailedTests += ReturnCodeCheck(testName, returnCode, 0, verbose);
181  // Set the entries of CCC to 1.0.
182  testName = "putScalar() -- set every entry of this matrix to 1.0";
183  returnCode = CCC.putScalar(Teuchos::ScalarTraits<STYPE>::one());
184  numberFailedTests += ReturnCodeCheck(testName, returnCode, 0, verbose);
185  // Check assignment operator.
186  BDMatrix CCC2( 5, 5, 2, 1 );
187  CCC2.assign( CCC );
188  if (verbose) std::cout << "assign() -- copy the values of an input matrix ";
189  if ( CCC( 3, 4 ) == Teuchos::ScalarTraits<STYPE>::one() ) {
190  if (verbose) std::cout<< "successful" <<std::endl;
191  } else {
192  if (verbose) std::cout<< "unsuccessful" <<std::endl;
193  numberFailedTests++;
194  }
195  // Create a view into a submatrix of CCC
196  BDMatrix CCCview( Teuchos::View, CCC, 3, 3 );
197  BDMatrix CCCtest1( 3, 3, 2, 1 );
198  CCCtest1 = CCCview;
199  if (verbose) std::cout << "operator= -- small(empty) = large(view) ";
200  if (CCCtest1.numRows()==3 && CCCtest1.values()==CCC.values()) {
201  if (verbose) std::cout<< "successful" <<std::endl;
202  } else {
203  if (verbose) std::cout<< "unsuccessful" <<std::endl;
204  numberFailedTests++;
205  }
206  CCCtest1 = CCC;
207  if (verbose) std::cout << "operator= -- small(view) = large(copy) ";
208  if (CCCtest1.numRows()==5 && CCCtest1.values()!=CCC.values()) {
209  if (verbose) std::cout<< "successful"<<std::endl;
210  } else {
211  if (verbose) std::cout<< "unsuccessful"<<std::endl;
212  numberFailedTests++;
213  }
214  BDMatrix CCCtest2( 3, 3, 2, 1 );
216  CCCtest1 = CCCtest2;
217  if (verbose) std::cout << "operator= -- large(copy) = small(copy) ";
218  if (CCCtest1.numRows()==3 ) {
219  if (verbose) std::cout<< "successful"<<std::endl;
220  } else {
221  if (verbose) std::cout<< "unsuccessful"<<std::endl;
222  numberFailedTests++;
223  }
224  CCCtest1 = CCCview;
225  if (verbose) std::cout << "operator= -- large(copy) = small(view) ";
226  if (CCCtest1.numRows()==3 && CCCtest1.stride()==4) {
227  if(verbose) std::cout<<"successful" <<std::endl;
228  } else {
229  if (verbose) std::cout<<"unsuccessful"<<std::endl;
230  numberFailedTests++;
231  }
232  BDMatrix CCCtest3( CCCview );
233  CCCtest1 += CCCtest3;
234  if (verbose) std::cout << "operator+= -- add two matrices of the same size, but different leading dimension ";
235  if (CCCtest1(1,1)==2.0) {
236  if(verbose) std::cout<<"successful" <<std::endl;
237  } else {
238  if (verbose) std::cout<<"unsuccessful"<<std::endl;
239  numberFailedTests++;
240  }
241  if (verbose) std::cout << "operator+= -- add two matrices of different size (nothing should change) ";
242  CCCtest1 += CCC;
243  if (CCCtest1(1,1)==2.0) {
244  if(verbose) std::cout<<"successful" <<std::endl;
245  } else {
246  if (verbose) std::cout<<"unsuccessful"<<std::endl;
247  numberFailedTests++;
248  }
249 
250  // Scale Tests.
251 
252  BDMatrix ScalTest( 8, 8, 2, 3 );
254  // Scale the entries by 8, it should be 8.
255  // The matrix is lower triangular, by default, so check a lower triangular entry.
256  if (verbose) std::cout << "operator*= -- scale matrix by some number ";
257  ScalTest *= 8.0;
258  if (ScalTest(5, 7) == 8.0) {
259  if (verbose) std::cout<< "successful." <<std::endl;
260  } else {
261  if (verbose) std::cout<< "unsuccessful." <<std::endl;
262  numberFailedTests++;
263  }
264 
265 
266  //
267  // If a test failed output the number of failed tests.
268  //
269  if(numberFailedTests > 0)
270  {
271  if (verbose) {
272  std::cout << "Number of failed tests: " << numberFailedTests << std::endl;
273  std::cout << "End Result: TEST FAILED" << std::endl;
274  return -1;
275  }
276  }
277  if(numberFailedTests == 0)
278  std::cout << "End Result: TEST PASSED" << std::endl;
279 
280  return 0;
281 }
282 
283 template<typename TYPE>
284 int PrintTestResults(std::string testName, TYPE calculatedResult, TYPE expectedResult, bool verbose)
285 {
286  int result;
287  if(calculatedResult == expectedResult)
288  {
289  if(verbose) std::cout << testName << " successful." << std::endl;
290  result = 0;
291  }
292  else
293  {
294  if(verbose) std::cout << testName << " unsuccessful." << std::endl;
295  result = 1;
296  }
297  return result;
298 }
299 
300 int ReturnCodeCheck(std::string testName, int returnCode, int expectedResult, bool verbose)
301 {
302  int result;
303  if(expectedResult == 0)
304  {
305  if(returnCode == 0)
306  {
307  if(verbose) std::cout << testName << " test successful." << std::endl;
308  result = 0;
309  }
310  else
311  {
312  if(verbose) std::cout << testName << " test unsuccessful. Return code was " << returnCode << "." << std::endl;
313  result = 1;
314  }
315  }
316  else
317  {
318  if(returnCode != 0)
319  {
320  if(verbose) std::cout << testName << " test successful -- failed as expected." << std::endl;
321  result = 0;
322  }
323  else
324  {
325  if(verbose) std::cout << testName << " test unsuccessful -- did not fail as expected. Return code was " << returnCode << "." << std::endl;
326  result = 1;
327  }
328  }
329  return result;
330 }
bool empty() const
Returns whether this matrix is empty.
OrdinalType numRows() const
Returns the row dimension of this matrix.
int PrintTestResults(std::string, TYPE, TYPE, bool)
Non-member helper functions on the templated serial, dense matrix/vector classes. ...
Templated serial dense matrix class.
int shape(OrdinalType numRows, OrdinalType numCols, OrdinalType kl, OrdinalType ku)
Shape method for changing the size of a SerialBandDenseMatrix, initializing entries to zero...
ScalarTraits< ScalarType >::magnitudeType normInf() const
Returns the Infinity-norm of the matrix.
Teuchos::SerialDenseVector< int, std::complex< Real > > DVector
ScalarTraits< ScalarType >::magnitudeType normOne() const
Returns the 1-norm of the matrix.
#define STYPE
SerialBandDenseMatrix< OrdinalType, ScalarType > & assign(const SerialBandDenseMatrix< OrdinalType, ScalarType > &Source)
Copies values from one matrix to another.
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.
OrdinalType stride() const
Returns the stride between the columns of this matrix in memory.
ScalarType * values() const
Data array access method.
Templated serial dense matrix class.
ScalarTraits< ScalarType >::magnitudeType normFrobenius() const
Returns the Frobenius-norm of the matrix.
This class creates and provides basic support for banded dense matrices of templated type...
Teuchos::SerialDenseMatrix< int, std::complex< Real > > DMatrix
std::string Teuchos_Version()
int ReturnCodeCheck(std::string, int, int, bool)
int main(int argc, char *argv[])
Teuchos::SerialBandDenseMatrix< OTYPE, STYPE > BDMatrix
Templated serial dense vector class.
OrdinalType numCols() const
Returns the column dimension of this matrix.
static T one()
Returns representation of one for this scalar type.
This class creates and provides basic support for dense rectangular matrix of templated type...