Amesos Package Browser (Single Doxygen Collection)  Development
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Amesos_TestDriver.cpp
Go to the documentation of this file.
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Amesos: Direct Sparse Solver 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 // This library is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU Lesser General Public License as
12 // published by the Free Software Foundation; either version 2.1 of the
13 // License, or (at your option) any later version.
14 //
15 // This library is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 // Lesser General Public License for more details.
19 //
20 // You should have received a copy of the GNU Lesser General Public
21 // License along with this library; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
23 // USA
24 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
25 //
26 // ***********************************************************************
27 // @HEADER
28 
29 //
30 // Amesos_TestDriver
31 //
32 // usage:
33 // Amesos_TestDriver.exe Solver InputMatrix MatrixType Special Numsolves Transpose MaxError MaxResid
34 // Where solver is: SuperLU, SuperLUdist, SuperLUdist2,
35 // UMFPACK, SPOOLES, DSCPACK, DSCPACKOLD, KLU,
36 // SPOOLESERIAL, MUMPS, SUPERLU, SCALAPACK or AZTEC
37 // special is, at present, only used in SuperLU, where 0 means dgssv
38 // and 1 means dgssvx
39 // examples:
40 // Amesos_TestDriver.exe SPOOLES ImpcolA.rua 0 1 1 0 1e-10 1e-10
41 // source SmallTest.csh
42 //
43 // output:
44 // SST.log (append)
45 // SST.summary (append)
46 //
47 // exits with 0 if test completed (does not imply that the test passed)
48 // exits with -1 if command line options or file permissions are wrong
49 //
50 #include "Amesos_ConfigDefs.h"
51 #include "Teuchos_TimeMonitor.hpp"
52 #include "Teuchos_StackedTimer.hpp"
53 #include <stdio.h>
54 
56 
57 // #undef HAVE_TIME_H
58 // #undef HAVE_SYS_UTSNAME_H
59 
60 #ifdef HAVE_TIME_H
61 #include <time.h>
62 #endif
63 //
64 // utsname does not work on Paunchy (SunOS) so I disabled this
65 //
66 #ifdef HAVE_SYS_UTSNAME_WORKS_H
67 #include "utsname.h"
68 #endif
69 
70 
71 //
72 // There is undoubtedly a cleaner way to do this. But, I hope that this
73 // will allow this test code to port.
74 //
75 #ifdef HAVE_IOMANIP
76 #include <iomanip>
77 #define USE_IOMANP
78 #elif defined HAVE_IOMANIP_H
79 #include <iomanip.h>
80 #define USE_IOMANIP
81 #endif
82 #ifndef USE_IOMANIP
83 #define setw(a) ("")
84 #define setprecision(a) ("")
85 #endif
86 
87 #ifdef EPETRA_MPI
88 #include "mpi.h"
89 #include "Epetra_MpiComm.h"
90 #else
91 #include "Epetra_SerialComm.h"
92 #endif
93 
94 #include "Epetra_Comm.h"
95 
96 #include "SparseDirectTimingVars.h"
97 #include "Amesos_TestSolver.h"
98 
99 // #ifdef SOLARIS
100 // #include <unistd.h>
101 // #endif
102 
103 #if 0
104 extern "C" {
105 #include "BridgeMPI.h"
106 }
107 #endif
108 
109 // #include "TSF.h"
110 // using std::exception ;
111 
112 int main(int argc, char **argv)
113 {
114 #ifdef EPETRA_MPI
115  MPI_Init(&argc,&argv);
116  Epetra_MpiComm Comm (MPI_COMM_WORLD);
117 #else
118  Epetra_SerialComm Comm;
119 #endif
120  int MyPID = Comm.MyPID();
121  int NumMpiProcs = Comm.NumProc();
122  bool summary = MyPID == 0 ;
123  //
124  // The following are the values returned from the tester
125  //
126  int exit_value = 0;
127  FILE *matrix_fd;
128  std::ofstream summary_file;
129 
130  Teuchos::RCP< Teuchos::StackedTimer > stackedTimer = Teuchos::rcp(new Teuchos::StackedTimer("Amesos Test-Driver"));
132  {
134  Teuchos::TimeMonitor LocalTimer (*totalTimer);
135 
136  std::vector <double> BBval;
137  BBval.resize(12);
138  Epetra_Object::SetTracebackMode( 2 ); // Turns EPETRA_CHK_ERR() on
139 
140 #if 0
141  if (MyPID == 0 ) {
142  char junk;
143  std::cin >> junk ; // Wait for character input to give time to attach debuuger
144  }
145 #endif
146 
147  const int MAX_TOLERANCE_RATIO = 10000 ;
148  const int MAXNAMELENGTH = 800;
149 
150 #ifdef HAVE_SYS_UTSNAME_WORKS_H
151  utsname uname_buf;
152 #endif
153  char timebuffer[MAXNAMELENGTH];
154 
155  std::string Sprogram ;
156  if ( argc >1 ) Sprogram = argv[1] ;
157  const int NUM_PARAMS = 9 ;
158  const int NUM_SUPERLU_PARAMS = NUM_PARAMS + 1 ;
159  const int NUM_SPOOLES_PARAMS = NUM_PARAMS + 6 ;
160  bool argc_ok = ( argc == NUM_PARAMS ) ;
161  if ( argc == NUM_SPOOLES_PARAMS && Sprogram == "SPOOLES" ) argc_ok = true ;
162  if ( argc == NUM_SPOOLES_PARAMS && Sprogram == "SPOOLESSERIAL" )
163  argc_ok = true ;
164 
165  if ( argc == NUM_SUPERLU_PARAMS && Sprogram == "SuperLU" )
166  argc_ok = true ;
167 
168 //
169 // The usage print should be a subroutine and printed everywhere
170 // that we find a problem with the command line arguments
171 //
172  if ( ! argc_ok ) {
173  if ( MyPID == 0 ) {
174  std::cerr << " argc = " << argc << " Sprogam= " << Sprogram <<
175  " SPOOLES? " << (int) (Sprogram=="SPOOLES") << std::endl ;
176  std::cerr << "Usage: " << argv[0] <<" SolverName InputMatrix special numsolves transpose maxerror maxresid" << std::endl ;
177  std::cerr << " Solvername = UMFPACK, SUPERLUDIST, TAUCS, PARDISO, CSS, PARAKLETE, MUMPS, KLU, SUPERLU" << std::endl;
178  std::cerr << " InputMatrix must be a file in Harwell Boeing format"<< std::endl;
179  std::cerr << " special = number of repeats (0 means run just once) " << std::endl ;
180  std::cerr << " numsolves = number of right hand sidess (<0 means MRHS, >1 means BRHS) " << std::endl ;
181  std::cerr << " transpose = 1 means test A^T x = b instead of Ax = b" << std::endl ;
182  std::cerr << " maxerror = maximum allowed error < 0 == no check " << std::endl ;
183  std::cerr << " maxresid = maximum allowed residual < 0 == no check" << std::endl ;
184  std::cerr << " if maxerror == -2 and maxresid == -2, failure (hang or abort) is expected" << std::endl ;
185  std::cerr << " if maxerror == 1e30 and maxresid == 1e30, the solver is expected to finish but produce incorrect results" << std::endl ;
186  }
187 #ifdef EPETRA_MPI
188  MPI_Finalize();
189 #endif
190  exit( -1 ) ;
191  }
192 
193  if ( MyPID == 0 ) {
194 #ifdef HAVE_SYS_UTSNAME_WORKS_H
195  int uname_stat = uname( &uname_buf ) ;
196 #endif
197 
198 #ifdef HAVE_TIME_H
199  time_t now = time( NULL ) ;
200  tm *localnow = localtime( &now ) ;
201  (void) strftime( timebuffer, MAXNAMELENGTH, "20%g%b%d@%H:%M:%S", localnow ) ;
202 #else
203  strcpy( timebuffer, "unknown date" ) ;
204 #endif
205  }
206 
207  //
208  // Open SST.log and SST.summary
209  //
210  char *ShortOutputFileName = (char *) "SST.summary" ;
211  char *LongOutputFileName = (char *) "SST.log" ;
212 
213 #ifdef AMESOS_TEST_VERBOSE
214  bool verbose = ( MyPID == 0 ) && true ;
215 #else
216  bool verbose = ( MyPID == 0 ) && false ;
217 #endif
218  bool log = MyPID == 0 ;
219 #ifdef SOLARIS
220  // log = false ; // On Solaris mpich, the second ofstream.open fails
221 #endif
222 
223  if ( ( MyPID == 0 ) ) {
224  matrix_fd = fopen( argv[2], "r" ) ;
225  if ( matrix_fd == NULL ) {
226  std::cerr << "Unable to open " << argv[2] << " for reading" << std::endl ;
227  exit_value = - 1;
228  } else {
229  fclose( matrix_fd ) ;
230  }
231 
232  if ( log ) {
233  SparseDirectTimingVars::log_file.open( LongOutputFileName, std::ios::app ) ;
234  if ( SparseDirectTimingVars::log_file.fail() ) {
235  std::cerr << "Unable to open " << LongOutputFileName << " for writing" << std::endl ;
236  exit_value = - 1;
237  }
238  }
239 
240  if ( summary ) {
241  summary_file.open( ShortOutputFileName, std::ios::app ) ;
242  if ( summary_file.fail() ) {
243  std::cerr << "Unable to open " << ShortOutputFileName << " for writing" << std::endl ;
244  exit_value = - 1;
245  }
246  }
247  }
248 
249  //
250  // Check command line parameters
251  //
252  SparseSolverType SparseSolver ;
253 
254  int MatType = atoi( argv[3] ) ;
255  int special = atoi( argv[4] ) ;
256  int numsolves = atoi( argv[5] ) ;
257  int transpose = atoi( argv[6] ) ;
258  double maxerror = atof( argv[7] ) ; // Bump up the error margin for the release (but keep it lower for the dev branch )
259  double maxresid = atof( argv[8] ) ; // Bump up the error margin for the release (but keep it lower for the dev branch )
260 
261  if ( Sprogram == "LAPACK" )
262  SparseSolver = LAPACK ;
263  else if ( Sprogram == "KLU" )
264  SparseSolver = KLU ;
265  else if ( Sprogram == "UMFPACK" )
266  SparseSolver = UMFPACK ;
267  else if ( Sprogram == "SUPERLU" )
268  SparseSolver = SUPERLU ;
269  else if ( Sprogram == "SUPERLUDIST" )
270  SparseSolver = SUPERLUDIST ;
271  else if ( Sprogram == "DSCPACK" )
272  SparseSolver = DSCPACK ;
273  else if ( Sprogram == "TAUCS" )
274  SparseSolver = TAUCS ;
275  else if ( Sprogram == "PARDISO" )
276  SparseSolver = PARDISO ;
277  else if ( Sprogram == "CSS" )
278  SparseSolver = CSS ;
279  else if ( Sprogram == "PARAKLETE" )
280  SparseSolver = PARAKLETE ;
281  else if ( Sprogram == "MUMPS" )
282  SparseSolver = MUMPS ;
283  else if ( Sprogram == "SCALAPACK" )
284  SparseSolver = SCALAPACK ;
285  else {
286  if (( MyPID == 0 ) ) std::cerr << "Unknown program: " << Sprogram << std::endl ;
287  exit( -1 ) ;
288  }
289 
290  // return ok because I don't want to break the tests
291  // if the solver is not available
292 #ifndef HAVE_AMESOS_KLU
293  if (SparseSolver == KLU) {
294  std::cerr << "KLU is not installed..." << std::endl;
295  exit(EXIT_SUCCESS);
296  }
297 #endif
298 #ifndef HAVE_AMESOS_UMFPACK
299  if (SparseSolver == UMFPACK) {
300  std::cerr << "UMFPACK is not installed..." << std::endl;
301  exit(EXIT_SUCCESS);
302  }
303 #endif
304 #ifndef HAVE_AMESOS_SUPERLU
305  if (SparseSolver == SUPERLU) {
306  std::cerr << "SUPERLU is not installed..." << std::endl;
307  exit(EXIT_SUCCESS);
308  }
309 #endif
310 #ifndef HAVE_AMESOS_SUPERLUDIST
311  if (SparseSolver == SUPERLUDIST) {
312  std::cerr << "SUPERLUDIST is not installed..." << std::endl;
313  exit(EXIT_SUCCESS);
314  }
315 #endif
316 #ifndef HAVE_AMESOS_TAUCS
317  if (SparseSolver == TAUCS) {
318  std::cerr << "TAUCS is not installed..." << std::endl;
319  exit(EXIT_SUCCESS);
320  }
321 #endif
322 #if !defined(HAVE_AMESOS_PARDISO) && !defined(HAVE_AMESOS_PARDISO_MKL)
323  if (SparseSolver == PARDISO) {
324  std::cerr << "PARDISO is not installed..." << std::endl;
325  exit(EXIT_SUCCESS);
326  }
327 #endif
328 #if !defined(HAVE_AMESOS_PARDISO_MKL) || !defined(HAVE_MPI)
329  if (SparseSolver == CSS) {
330  std::cerr << "CSS is not installed..." << std::endl;
331  exit(EXIT_SUCCESS);
332  }
333 #endif
334 #ifndef HAVE_AMESOS_PARAKLETE
335  if (SparseSolver == PARAKLETE) {
336  std::cerr << "PARAKLETE is not installed..." << std::endl;
337  exit(EXIT_SUCCESS);
338  }
339 #endif
340 #ifndef HAVE_AMESOS_MUMPS
341  if (SparseSolver == MUMPS) {
342  std::cerr << "MUMPS is not installed..." << std::endl;
343  exit(EXIT_SUCCESS);
344  }
345 #endif
346 #ifndef HAVE_AMESOS_SCALAPACK
347  if (SparseSolver == SCALAPACK) {
348  std::cerr << "SCALAPACK is not installed..." << std::endl;
349  exit(EXIT_SUCCESS);
350  }
351 #endif
352 #ifndef HAVE_AMESOS_DSCPACK
353  if (SparseSolver == DSCPACK) {
354  std::cerr << "DSCPACK is not installed..." << std::endl;
355  exit(EXIT_SUCCESS);
356  }
357 #endif
358 
359  SuperLU_permc = 1 ; // Set the default to MMD on A'*A
360  if ( argc == NUM_SUPERLU_PARAMS &&
361  ( Sprogram == "SuperLU" || Sprogram == "SuperLUdist" ) ) {
362  SuperLU_permc = atoi( argv[8] );
363  assert( SuperLU_permc >= 0 && SuperLU_permc <= 3 ) ;
364  }
365 
366  const int MaxNumSolves = 3200 ;
367  if ( MatType < 0 || MatType > 1 ) {
368  if ( ( MyPID == 0 ) )
369  std::cerr << " MatType must be 0 or 1, is: "
370  << MatType << std::endl ;
371  exit_value = -1 ;
372  }
373  if ( special < 0 || special > 10000 ) {
374  if ( ( MyPID == 0 ) )
375  std::cerr << " No more than 10000 repeats allowed"
376  << special << std::endl ;
377  exit_value = -1 ;
378  }
379  if ( numsolves< -MaxNumSolves || numsolves > MaxNumSolves ) {
380  if ( ( MyPID == 0 ) )
381  std::cerr << "The number of solves must be between 0 and " << MaxNumSolves
382  << " is: "
383  << numsolves << std::endl ;
384  exit_value = -1 ;
385  }
386  if ( transpose< 0 || transpose > 1) {
387  if ( ( MyPID == 0 ) )
388  std::cerr << "transpose must be 0 (no trans) or 1"
389  << ", it is: "
390  << transpose << std::endl ;
391  exit_value = -1 ;
392  }
393  if ( transpose != 0 && SparseSolver == SUPERLUDIST ) {
394  if ( ( MyPID == 0 ) )
395  std::cerr << "Our use of SUPERLUDIST does not support transpose yet" << std::endl ;
396  exit_value = -1 ;
397  }
398  if ( numsolves != 1 &&
399  SparseSolver != LAPACK &&
400  SparseSolver != SUPERLUDIST &&
401  SparseSolver != DSCPACK &&
402  SparseSolver != UMFPACK &&
403  SparseSolver != KLU &&
404  SparseSolver != TAUCS &&
405  SparseSolver != PARDISO &&
406  SparseSolver != CSS &&
407  SparseSolver != PARAKLETE &&
408  SparseSolver != MUMPS &&
409  SparseSolver != SCALAPACK &&
410  SparseSolver != SUPERLU ) {
411  if ( ( MyPID == 0 ) )
412  std::cerr << "Only LAPACK, SUPERLUDIST, UMFPACK, TAUCS, PARDISO, CSS, PARAKLETE, MUMPS, SCALAPACK, KLU and DSCPACK support MRHS and BRHS" << std::endl ;
413  exit_value = -1 ;
414  }
415 
416 
417 #ifdef HAVE_SYS_UTSNAME_WORKS_H
418  char *hostname = uname_buf.nodename ;
419  char *releasenum = uname_buf.release;
420 #else
421  char *hostname = (char *) "";
422 #endif
423 
424 
425 
426  Comm.Broadcast( &exit_value, 1, 0 ) ;
427 
428  if ( exit_value == 0 ) {
429 
430  AMESOS_MatrixType MatrixType = AMESOS_Serial ;
431  if ( MatType == 1 ) MatrixType = AMESOS_Distributed ;
432 
433  if ( log ) {
434  //
435  // Log time stamp and machine information
436  //
437 
438  SparseDirectTimingVars::log_file << std::endl << "TIMESTAMP:" << hostname << " "
439  << argv[1] << " " << timebuffer
440  << " BEGIN RUN" << std::endl ;
441 #ifdef HAVE_SYS_UTSNAME_WORKS_H
442  SparseDirectTimingVars::log_file << uname_buf.sysname <<
443  hostname << releasenum << uname_buf.version <<
444  uname_buf.machine << std::endl ;
445 #endif
446  }
447  if (summary ) {
448  summary_file << std::endl << setw(12) << hostname << " "
449  << setw(12) << argv[1]
450  << " " << setw(-1) << timebuffer << " "
451  << setw(15) << argv[2] << setw(6) << " "
452  << MatType << " "
453  << special << " "
454  << NumMpiProcs << setw(6) << " "
455  << numsolves << setw(3) << " " << transpose << setprecision(12) ;
456  if ( maxresid == -2 && maxerror == -2 ) summary_file << "Failure OK" ;
457  flush( summary_file ) ;
458  }
459  if (MyPID == 0 ) {
460  if ( verbose ) {
461  std::cerr << std::endl << setw(12) << hostname
462  << setw(12) << argv[1]
463  << " " << setw(-1) << timebuffer
464  << setw(15) << argv[2] << setw(6)
465  << MatType << " "
466  << special << " "
467  << NumMpiProcs << setw(6) << " "
468  << numsolves << setw(3) << " " << transpose << setprecision(12) ;
469  if ( maxresid == -2 && maxerror == -2 ) std::cerr << "Failure OK" ;
470  flush( std::cerr ) ;
471  }
472  }
473  //
474  // Perform the test
475  //
477 
478  try {
479 
480  if ( numsolves < 0 ) {
481  Amesos_TestMrhsSolver( Comm, argv[2], - numsolves, SparseSolver, (transpose==1), special, MatrixType ) ;
482  } else {
483  if ( numsolves > 1 ) {
484  Amesos_TestMultiSolver( Comm, argv[2], numsolves, SparseSolver, (transpose==1), special, MatrixType ) ;
485  } else {
486  Amesos_TestSolver( Comm, argv[2], SparseSolver, (transpose==1), special, MatrixType ) ;
487  }
488  }
489  //
490  // Log time and memory estimates
491  //
492  if ( log ) {
494 
495  //
496  // Print a single line to the summary file (and a copy of same to
497  // the log file (details_fd) then print a final line to the log
498  // file.
499  //
500  SparseDirectTimingVars::log_file << std::endl << "TIMESTAMP:" << hostname
501  << argv[1] << timebuffer
502  << " END RUN" << std::endl ;
503 
505  << setw(12) << hostname << setw(9) << argv[1]
506  << " " << setw(-1) << timebuffer
507  << setw(15) << argv[2] << setw(6) << NumMpiProcs << setw(6)
508  << special << " "
509  << numsolves << setw(6)
510  << transpose << setprecision(12) ;
512  SparseDirectTimingVars::log_file << "SS_Result = "
514  << std::endl ;
515 
516  }
517  if (summary ) {
519  if ( verbose )
521  bool ErrorOK = maxerror <= -1 ||
523  bool ResidualOK = maxresid <= -1 ||
525  if ( ErrorOK && ResidualOK ) summary_file << " OK" ;
526  if ( ErrorOK && ResidualOK && verbose ) std::cerr << " OK" ;
527  if ( ! ErrorOK ) {
528  summary_file << " Error too large is: " <<
530  " should be < " << maxerror ;
531  std::cerr << " Error too large is: " <<
533  " should be < " << maxerror ;
534  }
535  //
536  // Here we check to see if the answer is better than we expect.
537  //
538  // 1e30 means that the code promises to complete but makes no
539  // promise about the answer
540  // If maxerror is 1e30, we set it to 10, meaning that if the actual
541  // answer is good to 10/ MAX_TOLERANCE_RATIO (presently 10/1000 = .01)
542  // we print a TOLERANCE is too large message.
543  //
544  if (maxerror == 1e30 ) maxerror = 10 ;
545  if (SparseDirectTimingVars::SS_Result.Get_Error() < maxerror / MAX_TOLERANCE_RATIO &&
546  maxerror > 1.1e-14 ) {
547  summary_file << " Error TOLERANCE is too large: " <<
549  " is allowed to be " << maxerror ;
550  if ( verbose ) {
551  std::cerr << " Error TOLERANCE is too large: " <<
553  " is allowed to be " << maxerror ;
554  }
555  }
556  if ( ! ResidualOK ) {
557  summary_file << " Residual too large is:" <<
559  " should be < " << maxresid ;
560  std::cerr << " Residual too large is:" <<
562  " should be < " << maxresid ;
563  }
564 
565  if (maxresid == 1e30 ) maxresid = 10 ;
566  if (SparseDirectTimingVars::SS_Result.Get_Residual() < maxresid / MAX_TOLERANCE_RATIO &&
567  maxresid > 1.1e-14 ) {
568  summary_file << " Residual TOLERANCE is too large: " <<
570  " is allowed to be " << maxresid ;
571  if ( verbose ) {
572  std::cerr << " Residual TOLERANCE is too large: " <<
574  " is allowed to be " << maxresid ;
575  }
576  }
577 
578  flush( summary_file ) ;
579  if ( verbose ) {
580  std::cerr << std::endl ; // Atlantis won't print anything without this.
581  flush( std::cerr ) ;
582  }
583  }
584  }
585  catch(const std::string &errormsg)
586  {
587  if ( summary ) { summary_file << errormsg ; }
588  if ( log ) SparseDirectTimingVars::log_file << errormsg ;
589  if ( ( verbose ) || summary ) std::cerr << errormsg << std::endl;
590  }
591  }
592  }
593  {
594  stackedTimer->stopBaseTimer();
595 
597  options.num_histogram=3;
598  options.print_warnings = false;
599  options.output_histogram = true;
600  options.output_fraction=true;
601  options.output_minmax = true;
602 
603 #ifdef EPETRA_MPI
604  auto comm = Teuchos::rcp(new Teuchos::MpiComm<int>(Comm.Comm()));
605 #else
606  auto comm = Teuchos::rcp(new Teuchos::SerialComm<int>());
607 #endif
608  stackedTimer->report(std::cout, comm, options);
609  }
610  if ( summary ) summary_file.close() ;
611  if ( log ) SparseDirectTimingVars::log_file.close() ;
612 
613 #ifdef EPETRA_MPI
614  MPI_Finalize();
615 #endif
616  exit( exit_value ) ;
617 }
618 
619 
620 
#define setw(a)
const int MatType
virtual void PrintSummary(std::ostream &os) const
static RCP< Time > getNewCounter(const std::string &name)
int Amesos_TestMrhsSolver(Epetra_Comm &Comm, char *matrix_file, int numsolves, SparseSolverType SparseSolver, bool transpose, int special, AMESOS_MatrixType matrix_type)
static bool verbose
Definition: Amesos.cpp:70
SparseSolverType
int MyPID() const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
int Amesos_TestSolver(Epetra_Comm &Comm, char *matrix_file, SparseSolverType SparseSolver, bool transpose, int special, AMESOS_MatrixType matrix_type)
int SuperLU_permc
AMESOS_MatrixType
int main(int argc, char *argv[])
static void setStackedTimer(const Teuchos::RCP< Teuchos::StackedTimer > &t)
int Amesos_TestMultiSolver(Epetra_Comm &Comm, char *matrix_file, int numsolves, SparseSolverType SparseSolver, bool transpose, int special, AMESOS_MatrixType matrix_type)
int NumProc() const
void report(std::ostream &os)
static std::ofstream log_file
#define setprecision(a)
int Broadcast(double *MyVals, int Count, int Root) const
static SparseSolverResult SS_Result