36 #include "ac/getopt.h" 
   40 #ifdef HAVE_SYS_TIMES_H 
   41 #include <sys/times.h> 
   69 #if defined(USE_UMFPACK) 
   72 #if defined(USE_SUPERLU) 
   75 #if defined(USE_HARWELL) 
   78 #if defined(USE_MESCHACH) 
   81 #if defined(USE_LAPACK) 
   84 #if defined(USE_TAUCS) 
  104         const char *
const matrixfilename,
 
  118                         int size = (*pM).iGetNumRows();
 
  126                                         halfband = (
int)strtol(random_args,
 
  134                                                 random_args = &next[1];
 
  138                                                 std::cerr << 
"unable to parse " 
  146                                         std::cout << 
"Halfband?" << std::endl;
 
  147                                         std::cin >> halfband;
 
  154                                         activcol = (
int)strtol(random_args,
 
  162                                                 random_args = &next[1];
 
  166                                                 std::cerr << 
"unable to parse " 
  174                                         std::cout << 
"Activcol?" << std::endl;
 
  175                                         std::cin >> activcol;
 
  182                                         sprfct = (double)strtod(random_args,
 
  190                                                 random_args = &next[1];
 
  194                                                 std::cerr << 
"unable to parse " 
  202                                         std::cout << 
"Sprfct (hint: 0.9)?" 
  207                                 for (
int i = 0; i < size; i++) {
 
  208                                         for (
int k = (i - halfband) < 0 ? 0 : i - halfband; k < ((i + halfband) > size ? size : i + halfband); k++) {
 
  210                                                         (*spM)(i+1, k+1) = 2.0*(((
doublereal)rand())/RAND_MAX - 0.5);
 
  214                                 for (
int i = size - activcol; i < size; i++) {
 
  215                                         for (
int k = 0; k < size; k++) {
 
  217                                                         (*spM)(k+1, i+1) = (*spM)(i+1, k+1) = 2.0*(((
doublereal)rand())/RAND_MAX - 0.5);
 
  221                                 for (
int i = 0; i < size; i++) {
 
  222                                         (*spM)(i+1, i+1) = 1;
 
  225                                 if (matrixfilename != 0) {
 
  226                                         ofile.open(matrixfilename);
 
  227                                         ofile << size << std::endl;
 
  229                                         for (
int i=0; i<n; i++) {
 
  238                         for (
int i=0; i<n; i++) {
 
  241                         for (
int i = 1; i <= size; i++) {
 
  242                                 pV->
PutCoef(i, pM->operator()(i, size));
 
  270                         std::cout << *pM << 
"\n";
 
  273                 ifile.open(filename);
 
  279                 while (ifile >> row >> col >> x) {
 
  280                         if (row > size || col > size) {
 
  281                                 std::cerr << 
"Fatal read error of file" << filename << std::endl;
 
  282                                 std::cerr << 
"size: " << size << std::endl;
 
  283                                 std::cerr << 
"row:  " << row << std::endl;
 
  284                                 std::cerr << 
"col:  " << col << std::endl;
 
  285                                 std::cerr << 
"x:    " << x << std::endl;
 
  293                 for (
integer i = 1; i <= size; i++) {
 
  294                         pV->
PutCoef(i, pM->operator()(i, size));
 
  296                 std::cout << 
"\nThe matrix has " 
  299                         << 
"and " << count << 
" nonzeros\n" << std::endl;
 
  306         unsigned long long time = 0;
 
  307 #if defined(__i386__) 
  308         __asm__ __volatile__( 
"rdtsc" : 
"=A" (time));
 
  309 #elif defined(__x86_64__) 
  311         __asm__ __volatile__ (
"rdtsc" : 
"=a"(lo), 
"=d"(hi));
 
  312         time = ( (
unsigned long long)lo)|( ((
unsigned long long)hi)<<32 );
 
  313 #elif defined(__powerpc__) 
  314         unsigned long int upper, lower, tmp;
 
  322                 : 
"=r"(upper),
"=r"(lower),
"=r"(tmp)
 
  334         std::cerr << 
"usage: wraptest " 
  339                 << std::endl << 
"\t\t" 
  341                 "[-O <option>[=<value>]] " 
  343                 << std::endl << 
"\t\t" 
  344                 "[-r[<size>[:<halfband>[:<activcol>[:<sprfct>]]]]] " 
  345                 << std::endl << 
"\t\t" 
  351         std::cerr << 
"  -c :  if possible, use compressed column matrix format" << std::endl;
 
  352         std::cerr << 
"\tfor the naive solver: use colamd" << std::endl;
 
  353         std::cerr << 
"  -d :  if possible, use dir matrix format" << std::endl;
 
  354         std::cerr << 
"  -f <filename> : load the matrix from <filename>" << std::endl;
 
  355         std::cerr << 
"\tIf the matrix is loaded from file the solution should be [0 0 .... 1]" << std::endl;
 
  356         std::cerr << 
"\tThe file format is: size row col x row col x etc..." << std::endl;
 
  357         std::cerr << 
"  -m <solver> : {" << 
solvers[0];
 
  358         for (
int i = 1; solvers[i]; i++) {
 
  359                 std::cerr << 
"|" << solvers[i];
 
  361         std::cerr << 
"}" << std::endl;
 
  362         std::cerr << 
"  -o :  output of the solution" << std::endl;
 
  363         std::cerr << 
"  -O <option[=<value>]>" << std::endl
 
  364                 << 
"\tblocksize=<blocksize> (umfpack only)" << std::endl;
 
  365         std::cerr << 
"  -p <pivot> : if meaningful, use <pivot> threshold" << std::endl;
 
  366         std::cerr << 
"  -r[<size>[:<halfband>[:<activcol>[:<sprfct>]]]] :" << std::endl;
 
  367         std::cerr << 
"\tgenerate a random matrix with <size>, <halfband>, <activcol>" << std::endl;
 
  368         std::cerr << 
"\tand <sprfct> (prompts for values not provided)" << std::endl;
 
  369         std::cerr << 
"  -s :  (singular) with the 3x3 matrix, do not set the element (3,3)" << std::endl;
 
  370         std::cerr << 
"  -t :  with multithreaded solvers, use <nthreads> threads" << std::endl;
 
  371         std::cerr << 
"  -T :  solve A^T x = b" << std::endl;
 
  372         std::cerr << 
"  -w :  write the random matrix to <filename>" << std::endl;
 
  387 #if defined(USE_UMFPACK) 
  389 #elif defined(USE_Y12) 
  391 #elif defined(USE_SUPERLU) 
  393 #elif defined(USE_HARWELL) 
  395 #elif defined(USE_MESCHACH) 
  397 #elif defined(USE_LAPACK) 
  399 #elif defined(USE_TAUCS) 
  401 #elif defined(USE_WSMP) 
  411         double cpu_time_used;
 
  414         char *matrixfilename = 0;
 
  417         char *random_args = 0;
 
  421         unsigned block_size = 0;
 
  423         double ddroptol = 0.;
 
  424         bool singular(
false);
 
  425         bool output_solution(
false);
 
  426         bool transpose(
false);
 
  433                 int opt = 
getopt(argc, argv, 
"cdf:m:oO:p:P:r::st:Tw:");
 
  474                                 if ((strcasecmp(solver, 
"umfpack") != 0) && 
 
  475                                         (strcasecmp(solver, 
"naive") != 0) &&
 
  476                                         (strcasecmp(solver, 
"superlu") != 0)
 
  478                                         std::cerr << 
"colamd preordering meaningful only for umfpack" 
  479                                         ", naive and superlu solvers" << std::endl;
 
  483                         } 
else if (strncasecmp(
optarg, 
"mmdata", 
STRLENOF(
"mmdata")) == 0) {
 
  484                                 if (strcasecmp(solver, 
"superlu") != 0) {
 
  485                                         std::cerr << 
"mmdata preordering meaningful only for superlu solver" << std::endl;
 
  490                                 std::cerr << 
"unrecognized option \"" << 
optarg << 
"\"" << std::endl;
 
  499                         if (strncasecmp(
optarg, 
"blocksize=", 
STRLENOF(
"blocksize=")) == 0) {
 
  502                                 if (strcasecmp(solver, 
"umfpack") != 0) {
 
  503                                         std::cerr << 
"blocksize only meaningful for umfpack solver" << std::endl;
 
  507                                 block_size = (
int)strtol(
optarg, &next, 10);
 
  508                                 if (next[0] != 
'\0') {
 
  509                                         std::cerr << 
"unable to parse blocksize value" << std::endl;
 
  512                                 if (block_size < 1) {
 
  517                                 std::cerr << 
"unrecognized option \"" << 
optarg << 
"\"" << std::endl;
 
  529                         output_solution = 
true;
 
  556                         size = (
int)strtol(random_args, &next, 10);
 
  563                                 random_args = &next[1];
 
  567                                 std::cerr << 
"unable to parse <size> " 
  568                                         "from -r args" << std::endl;
 
  573                         std::cout << 
"Matrix size?" << std::endl;
 
  578         std::cerr << std::endl;
 
  580         if (strcasecmp(solver, 
"taucs") == 0) {
 
  582                 std::cerr << 
"Taucs solver" 
  584                         std::cerr << 
" with dir matrix" 
  585                         typedef TaucsSparseCCSolutionManager<DirCColMatrixHandler<0> > CCMH;
 
  589                         std::cerr << 
" with cc matrix" 
  590                         typedef TaucsSparseCCSolutionManager<CColMatrixHandler<0> > CCMH;
 
  595                                         TaucsSparseSolutionManager(size));
 
  597                 std::cerr << std::endl;
 
  599                 std::cerr << 
"need --with-taucs to use Taucs library sparse solver"  
  604         } 
else if (strcasecmp(solver, 
"lapack") == 0) {
 
  606                 std::cerr << 
"Lapack solver" << std::endl;
 
  608                                 LapackSolutionManager(size));
 
  610                 std::cerr << 
"need --with-lapack to use Lapack library dense solver"  
  615         } 
else if (strcasecmp(solver, 
"superlu") == 0) {
 
  620                 unsigned pre = SuperLUSolver::SUPERLU_COLAMD;
 
  622                         pre = SuperLUSolver::SUPERLU_MMDATA;
 
  623                         std::cerr << 
"Using MMDATA preordering" << std::endl;
 
  625                         pre = SuperLUSolver::SUPERLU_COLAMD;
 
  626                         std::cerr << 
"Using colamd preordering" << std::endl;
 
  629 #ifdef USE_SUPERLU_MT 
  630                         std::cerr << 
"Multithreaded SuperLU solver";
 
  631                         if (pre != SuperLUSolver::SUPERLU_COLAMD) {
 
  632                                 std::cerr << std::end << 
 
  633                                         "ERROR, mmdata preordering available only for scalar superlu" << 
 
  638                                 std::cerr << 
" with dir matrix";
 
  639                                 typedef ParSuperLUSparseCCSolutionManager<DirCColMatrixHandler<0> > CCMH;
 
  642                                 std::cerr << 
" with cc matrix";
 
  643                                 typedef ParSuperLUSparseCCSolutionManager<CColMatrixHandler<0> > CCMH;
 
  647                                                 ParSuperLUSparseSolutionManager(nt, size, dpivot));
 
  649                         std::cerr << 
" using " << nt << 
" threads" << std::endl;
 
  651                         silent_cerr(
"multithread SuperLU solver support not compiled; " 
  655                         std::cerr << 
"SuperLU solver";
 
  657                                 std::cerr << 
" with dir matrix";
 
  658                                 typedef SuperLUSparseCCSolutionManager<DirCColMatrixHandler<0> > CCMH;
 
  661                                 std::cerr << 
" with cc matrix";
 
  662                                 typedef SuperLUSparseCCSolutionManager<CColMatrixHandler<0> > CCMH;
 
  666                                         SuperLUSparseSolutionManager(size, dpivot, pre));
 
  670                 std::cerr << std::endl;
 
  672                 std::cerr << 
"need --with-superlu to use SuperLU library"  
  677         } 
else if (strcasecmp(solver, 
"y12") == 0) {
 
  679                 std::cerr << 
"y12 solver";
 
  681                         std::cerr << 
" with dir matrix";
 
  682                         typedef Y12SparseCCSolutionManager<DirCColMatrixHandler<1> > CCMH;
 
  686                         std::cerr << 
" with cc matrix";
 
  687                         typedef Y12SparseCCSolutionManager<CColMatrixHandler<1> > CCMH;
 
  692                                         Y12SparseSolutionManager(size));
 
  694                 std::cerr << std::endl;
 
  696                 std::cerr << 
"need --with-y12 to use y12m library"  
  701         } 
else if (strcasecmp(solver, 
"harwell") == 0) {
 
  703                 std::cerr << 
"Harwell solver" << std::endl;
 
  705                                 HarwellSparseSolutionManager(size));
 
  707                 std::cerr << 
"need --with-harwell to use HSL library"  
  712         } 
else if (strcasecmp(solver, 
"meschach") == 0) {
 
  714                 std::cerr << 
"Meschach solver" << std::endl;
 
  716                                 MeschachSparseSolutionManager(size));
 
  718                 std::cerr << 
"need --with-meschach to use Meschach library"  
  722         } 
else if (strcasecmp(solver, 
"umfpack") == 0
 
  723                         || strcasecmp(solver, 
"umfpack3") == 0) {
 
  725                 std::cerr << 
"Umfpack solver";
 
  727                         std::cerr << 
" with dir matrix";
 
  728                         typedef UmfpackSparseCCSolutionManager<DirCColMatrixHandler<0> > CCMH;
 
  732                         std::cerr << 
" with cc matrix";
 
  733                         typedef UmfpackSparseCCSolutionManager<CColMatrixHandler<0> > CCMH;
 
  738                                         UmfpackSparseSolutionManager,
 
  739                                         UmfpackSparseSolutionManager(size, dpivot, ddroptol, block_size));
 
  741                 std::cerr << std::endl;
 
  743                 std::cerr << 
"need --with-umfpack to use Umfpack library"  
  748         } 
else if (strcasecmp(solver, 
"wsmp") == 0) {
 
  750                 std::cerr << 
"Wsmp solver";
 
  752                         std::cerr << 
" with dir matrix";
 
  753                         typedef WsmpSparseCCSolutionManager<DirCColMatrixHandler<0> > CCMH;
 
  757                         std::cerr << 
" with cc matrix";
 
  758                         typedef WsmpSparseCCSolutionManager<CColMatrixHandler<0> > CCMH;
 
  763                                         WsmpSparseSolutionManager,
 
  764                                         WsmpSparseSolutionManager(size, dpivot, block_size, nt));
 
  766                 std::cerr << 
" using " << nt << 
" threads " << std::endl;
 
  767                 std::cerr << std::endl;
 
  769                 std::cerr << 
"need --with-wsmp to use Wsmp library"  
  774         } 
else if (strcasecmp(solver, 
"naive") == 0) {
 
  775                 std::cerr << 
"Naive solver";
 
  780                         std::cerr << 
" with Colamd ordering";
 
  782 #ifdef USE_NAIVE_MULTITHREAD 
  784                                         ParNaiveSparsePermSolutionManager,
 
  785                                         ParNaiveSparsePermSolutionManager(nt, size, dpivot));
 
  787                                 silent_cerr(
"multithread naive solver support not compiled; " 
  788                                         "you can configure --enable-multithread-naive " 
  789                                         "on a linux ix86 to get it" 
  800 #ifdef USE_NAIVE_MULTITHREAD 
  802                                         ParNaiveSparseSolutionManager,
 
  803                                         ParNaiveSparseSolutionManager(nt, size, dpivot));
 
  805                                 silent_cerr(
"multithread naive solver support not compiled; " 
  806                                         "you can configure --enable-multithread-naive " 
  807                                         "on a linux ix86 to get it" 
  817                 std::cerr << 
" using " << nt << 
" threads " << std::endl;
 
  819                 std::cerr << 
"unknown solver '" << solver << 
"'" << std::endl;
 
  832                         matrixfilename, filename, pM, pV);
 
  843                 ct = tmsbuf.tms_utime + tmsbuf.tms_cutime
 
  844                         + tmsbuf.tms_stime + tmsbuf.tms_cstime;
 
  855                 ct = tmsbuf.tms_utime + tmsbuf.tms_cutime
 
  856                         + tmsbuf.tms_stime + tmsbuf.tms_cstime - ct;
 
  861         if (output_solution) {
 
  862                 for (
int i = 1; i <= size; i++) {
 
  863                         std::cout << 
"\tsol[" << i << 
"] = " << px->operator()(i) 
 
  867         cpu_time_used = ((double) (end - start));
 
  868         cpu_time_used = cpu_time_used / CLOCKS_PER_SEC;
 
  869         std::cout << 
"Clock tics to solve: " << tf << std::endl;
 
  871         std::cout << 
"Clock tics to solve: " << ct << std::endl;
 
  873         std::cout << 
"Time to solve: " << cpu_time_used << std::endl;
 
  876         std::cout << 
"\nSecond solve:\n";
 
  883         SetupSystem(random, random_args, singular, 0, filename, pM, pV);
 
  890                 ct = tmsbuf.tms_utime + tmsbuf.tms_cutime
 
  891                         + tmsbuf.tms_stime + tmsbuf.tms_cstime;
 
  902                 ct = tmsbuf.tms_utime + tmsbuf.tms_cutime
 
  903                         + tmsbuf.tms_stime + tmsbuf.tms_cstime - ct;
 
  909         if (output_solution) {
 
  910                 for (
int i = 1; i <= size; i++) {
 
  911                         std::cout << 
"\tsol[" << i << 
"] = " << px->operator()(i) 
 
  915         cpu_time_used = ((double) (end - start));
 
  916         cpu_time_used = cpu_time_used / CLOCKS_PER_SEC;
 
  917         std::cout << 
"Clock tics to solve: " << tf << std::endl;
 
  919         std::cout << 
"Clock tics to solve: " << ct << std::endl;
 
  921         std::cout << 
"Time to solve: " << cpu_time_used << std::endl;
 
virtual VectorHandler * pResHdl(void) const =0
void PutColIndex(integer iSubCol, integer iCol)
virtual integer MakeIndexForm(doublereal *const Ax, integer *const Arow, integer *const Acol, integer *const AcolSt, int offset=0) const =0
virtual integer iGetNumCols(void) const =0
#define MBDYN_EXCEPT_ARGS
FullSubMatrixHandler & SetFull(void)
void PutCoef(integer iRow, integer iCol, const doublereal &dCoef)
std::vector< doublereal > x_values
SparseMatrixHandler * spM
virtual void Reset(void)=0
static unsigned long long rd_CPU_ts(void)
const LinSol::solver_t solver[]
std::vector< integer > row_values
virtual void SolveT(void)
virtual MatrixHandler * pMatHdl(void) const =0
int main(int argc, char *argv[])
std::vector< integer > acol_values
virtual void MatrReset(void)=0
void SetupSystem(const bool random, char *random_args, const bool singular, const char *const matrixfilename, const char *const filename, MatrixHandler *const pM, VectorHandler *const pV)
virtual void Solve(void)=0
virtual void PutCoef(integer iRow, const doublereal &dCoef)=0
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
virtual void ResizeReset(integer, integer)
int getopt(int argc, char *const argv[], const char *opts)
std::vector< integer > col_values
void PutRowIndex(integer iSubRow, integer iRow)
virtual VectorHandler * pSolHdl(void) const =0
static void usage(int err)
virtual integer iGetNumRows(void) const =0