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
#define MBDYN_EXCEPT_ARGS
virtual void Reset(void)=0
static unsigned long long rd_CPU_ts(void)
const LinSol::solver_t solver[]
virtual void SolveT(void)
virtual MatrixHandler * pMatHdl(void) const =0
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
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
int getopt(int argc, char *const argv[], const char *opts)
virtual VectorHandler * pSolHdl(void) const =0
static void usage(int err)