lib_ex_pour_HZpp/Partie_2/algebre_lineaire/sparselib++/sp1_5c/testing/tsl.cc

1 line
No EOL
12 KiB
C++
Executable file
Raw Blame History

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* ******** *** SparseLib++ */
/* ******* ** *** *** *** v. 1.5c */
/* ***** *** ******** ******** */
/* ***** *** ******** ******** R. Pozo */
/* ** ******* *** ** *** *** K. Remington */
/* ******** ******** A. Lumsdaine */
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* */
/* */
/* SparseLib++ : Sparse Matrix Library */
/* */
/* National Institute of Standards and Technology */
/* University of Notre Dame */
/* Authors: R. Pozo, K. Remington, A. Lumsdaine */
/* */
/* NOTICE */
/* */
/* Permission to use, copy, modify, and distribute this software and */
/* its documentation for any purpose and without fee is hereby granted */
/* provided that the above notice appear in all copies and supporting */
/* documentation. */
/* */
/* Neither the Institutions (National Institute of Standards and Technology, */
/* University of Notre Dame) nor the Authors make any representations about */
/* the suitability of this software for any purpose. This software is */
/* provided ``as is'' without expressed or implied warranty. */
/* */
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
#include <stdlib.h>
#include "compcol_double.h"
#include "comprow_double.h"
#include "coord_double.h"
#include "iohb_double.h"
#include <console.h> // sp<73>cific mac : GR
#include <SIOUX.h> // sp<73>cific mac : GR
int main(int argc, char * argv[])
{ argc = ccommand( &argv ); // sp<73>cific mac : GR
if (argc < 2)
{
cerr << "Usage: " << argv[0] << " HBfile [-v]" << endl;
exit(-1);
}
int verbose = 0;
if (argc > 2 )
{
if (argv[2][1] == 'v') verbose = 1;
else
{
cerr << "Usage: " << argv[0] << " HBfile [-v]" << endl;
exit(-1);
}
}
/******************************************************************/
// Testing readHB functions... //
/******************************************************************/
if (verbose) cout << "Testing readHB functions:" << endl << endl;
CompCol_Mat_double A1;
int M, N, nonzeros, nrhs;
readHB_info(argv[1], &M, &N, &nonzeros, &nrhs);
if (verbose)
{
cout << "Return values from readHB_info:" << endl;
cout << "M = " << M << " N = " << N ;
cout << " Nonzeros = " << nonzeros << " Nrhs = " << nrhs << endl;
cout << "Output from readHB_info in verbose mode: " << endl;
cout << "......................................................"<<endl;
readHB_info(argv[1], &M, &N, &nonzeros, &nrhs);
cout << "......................................................"<<endl
<< endl;
cout << "Reading the matrix from " << argv[1] << "..." << endl;
}
readHB_mat(argv[1], &A1);
if ( nrhs > 0)
{
if (verbose)
cout << "Reading a rhs from " << argv[1] << "..." << endl << endl;
VECTOR_double b(N);
readHB_rhs(argv[1], &b);
}
/******************************************************************/
// Generate small test matrix for testing conversions... //
// //
// [ 1 2 0 0 3 ] //
// //
// | 4 5 6 0 0 | //
// //
// | 0 7 8 0 9 | //
// //
// | 0 0 0 10 0 | //
// //
// [ 11 0 0 0 12 ] //
// //
/******************************************************************/
double val[12] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0,
7.0, 8.0, 9.0, 10.0, 11.0, 12.0};
int colind[12] = {0, 1, 4, 0, 1, 2, 1, 2, 4, 3, 0, 4};
int rowptr[6] = { 0, 3, 6, 9,10, 12};
double rowsum[5] = {6.0, 15.0, 24.0, 10.0, 23.0};
double colsum[5] = {16.0, 14.0, 14.0, 10.0, 24.0};
CompRow_Mat_double R(5,5,12,val,rowptr,colind);
if (verbose)
{
cout << "Generated row-oriented matrix from data." << endl;
cout << "Converting: Row to Column... " << endl;
}
CompCol_Mat_double C(R);
if (verbose) cout << " Column to Coord... " << endl;
Coord_Mat_double CO1(C);
if (verbose) cout << " Coord to Row... " << endl;
CompRow_Mat_double R2(CO1);
double err = 0.0;
int i,j;
for (i=0;i<5;i++)
for (j=0;j<5;j++)
if ( (R2(i,j) - R(i,j)) < 0) err -= R2(i,j) - R(i,j);
else err += R2(i,j) - R(i,j);
if ( err > 1.e-8 )
{
cout << "Error in conversions too high. Halting execution. " << endl;
exit(1);
}
if (verbose)
{
cout << "Accumulated error = " << err << " success. " << endl;
cout << "Reverse direction..." << endl;
cout << "Converting: Row to Coord... " << endl;
}
Coord_Mat_double CO2(R);
if (verbose) cout << " Coord to Column... " << endl;
CompCol_Mat_double C2(CO2);
if (verbose) cout << " Column to Row... " << endl;
CompRow_Mat_double R3(C2);
err = 0.0;
for (i=0;i<5;i++)
for (j=0;j<5;j++)
if ( (R3(i,j) - R(i,j)) < 0) err -= (R3(i,j) - R(i,j));
else err += (R3(i,j) - R(i,j));
if ( err > 1.e-8 )
{
cout << "Error in conversions too high. Halting execution. " << endl;
exit(1);
}
if (verbose)
{
cout << "Accumulated error = " << err << " success. " << endl;
cout << endl;
cout << "Testing sparse matrix - dense vector multiplies... " << endl;
cout << "Small test matrix: " << endl;
}
VECTOR_double x(5,0.0);
VECTOR_double v(5,1.0);
if (verbose) cout << "Mat-vec (CompCol)... ";
x = C*v;
for (i=0;i<5;i++)
if (x(i) != rowsum[i])
{
cout << "Mat-vec (Compcol) error." <<endl;
exit(1);
}
if (verbose) cout << "success." << endl;
x = 0.0;
if (verbose) cout << "Mat-trans_mult-vec (CompCol)...";
x = C.trans_mult(v);
for (i=0;i<5;i++)
if (x(i) != colsum[i])
{
cout << "Mat-trans_mult-vec (CompCol) error." <<endl;
exit(1);
}
if (verbose) cout << "success." << endl;
x = 0.0;
if (verbose) cout << "Mat-vec (CompRow)... ";
x = R*v;
for (i=0;i<5;i++)
if (x(i) != rowsum[i])
{
cout << "Mat-vec (CompRow) error." <<endl;
exit(1);
}
if (verbose) cout << "success." << endl;
x = 0.0;
if (verbose) cout << "Mat-trans_mult-vec (CompRow)...";
x = R.trans_mult(v);
for (i=0;i<5;i++)
if (x(i) != colsum[i])
{
cout << "Mat-trans_mult-vec (CompRow) error." <<endl;
exit(1);
}
if (verbose) cout << "success." << endl;
x = 0.0;
if (verbose) cout << "Mat-vec (Coord)... ";
x = CO1*v;
for (i=0;i<5;i++)
if (x(i) != rowsum[i])
{
cout << "Mat-vec (Coord) error." <<endl;
exit(1);
}
if (verbose) cout << "success." << endl;
x = 0.0;
if (verbose) cout << "Mat-trans_mult-vec (Coord)... ";
x = CO1.trans_mult(v);
for (i=0;i<5;i++)
if (x(i) != colsum[i])
{
cout << "Mat-trans_mult-vec (Coord) error." <<endl;
exit(1);
}
if (verbose)
{
cout << "success." << endl;
cout << endl;
cout << "Testing sparse matrix - dense vector multiplies... " << endl;
cout << "Matrix from Harwell-Boeing file: " << endl;
}
VECTOR_double x1(M,0.0);
VECTOR_double v1(N,1.0);
if (verbose) cout << "Mat-vec (CompCol)... "<< endl;
x1= A1*v1;
VECTOR_double x2(M,0.0);
CompRow_Mat_double A2(A1);
if (verbose) cout << "Mat-vec (CompRow)... "<< endl;
x2 = A2*v1;
VECTOR_double x3(M,0.0);
Coord_Mat_double A3(A2);
if (verbose) cout << "Mat-vec (Coord)... "<< endl;
x3 = A3*v1;
if (verbose) cout << "Comparing results... ";
err = 0.0;
for (i=0;i<M;i++)
{
if ( (x1(i) - x2(i)) < 0 ) err -= (x1(i) - x2(i));
else err += (x1(i) - x2(i));
}
if ( err > 1.e-5 )
{
cout << endl << "Error in Matvecs on HB generated matrix. " << endl;
exit(1);
}
err = 0.0;
for (i=0;i<M;i++)
{
if ( (x2(i) - x3(i)) < 0 ) err -= (x2(i) - x3(i));
else err += (x2(i) - x3(i));
}
if ( err > 1.e-5 )
{
cout << endl << "Error in Matvecs on HB generated matrix. " << endl;
exit(1);
}
if (verbose) cout << "success. " << endl;
v1 = 0.0;
x1 = 1.0;
if (verbose) cout << "Mat-trans-vec (CompCol)... "<< endl;
v1 = A1.trans_mult(x1);
VECTOR_double v2(N,0.0);
if (verbose) cout << "Mat-trans-vec (CompRow)... "<< endl;
v2 = A2.trans_mult(x1);
VECTOR_double v3(N,0.0);
if (verbose) cout << "Mat-trans-vec (Coord)... "<< endl;
v3 = A3.trans_mult(x1);
if (verbose) cout << "Comparing results... ";
err = 0.0;
for (i=0;i<N;i++)
{
if ( (v1(i) - v2(i)) < 0 ) err -= (v1(i) - v2(i));
else err += (v1(i) - v2(i));
}
if ( err > 1.e-5 )
{
cout << endl << "Error in Mat-tran_mult-vecs on HB generated matrix. "
<< endl;
exit(1);
}
err = 0.0;
for (i=0;i<N;i++)
{
if ( (v2(i) - v3(i)) < 0 ) err -= (v2(i) - v3(i));
else err += (v2(i) - v3(i));
}
if ( err > 1.e-5 )
{
cout << endl << "Error in Mat-tran_mult-vecs on HB generated matrix. "
<< endl;
exit(1);
}
if (verbose) cout << "success. " << endl;
cout << endl << endl;
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
cout << "+ Successful completion of testing for SparseLib++ +" << endl;
cout << "+ No errors detected in conversion or blas routines. +" << endl;
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
cout << endl << endl;
}