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