kusano 7d535a
kusano 7d535a
/*
kusano 7d535a
 * -- SuperLU routine (version 3.0) --
kusano 7d535a
 * Univ. of California Berkeley, Xerox Palo Alto Research Center,
kusano 7d535a
 * and Lawrence Berkeley National Lab.
kusano 7d535a
 * October 15, 2003
kusano 7d535a
 *
kusano 7d535a
 */
kusano 7d535a
/*
kusano 7d535a
 * File name:		ddrive.c
kusano 7d535a
 * Purpose:             MAIN test program
kusano 7d535a
 */
kusano 7d535a
#include <string.h></string.h>
kusano 7d535a
#include "slu_ddefs.h"
kusano 7d535a
kusano 7d535a
#define NTESTS    5      /* Number of test types */
kusano 7d535a
#define NTYPES    11     /* Number of matrix types */
kusano 7d535a
#define NTRAN     2    
kusano 7d535a
#define THRESH    20.0
kusano 7d535a
#define FMT1      "%10s:n=%d, test(%d)=%12.5g\n"
kusano 7d535a
#define	FMT2      "%10s:fact=%4d, trans=%4d, equed=%c, n=%d, imat=%d, test(%d)=%12.5g\n"
kusano 7d535a
#define FMT3      "%10s:info=%d, izero=%d, n=%d, nrhs=%d, imat=%d, nfail=%d\n"
kusano 7d535a
kusano 7d535a
static void
kusano 7d535a
parse_command_line(int argc, char *argv[], char *matrix_type,
kusano 7d535a
		   int *n, int *w, int *relax, int *nrhs, int *maxsuper,
kusano 7d535a
		   int *rowblk, int *colblk, int *lwork, double *u);
kusano 7d535a
kusano 7d535a
main(int argc, char *argv[])
kusano 7d535a
{
kusano 7d535a
/* 
kusano 7d535a
 * Purpose
kusano 7d535a
 * =======
kusano 7d535a
 *
kusano 7d535a
 * DDRIVE is the main test program for the DOUBLE linear 
kusano 7d535a
 * equation driver routines DGSSV and DGSSVX.
kusano 7d535a
 * 
kusano 7d535a
 * The program is invoked by a shell script file -- dtest.csh.
kusano 7d535a
 * The output from the tests are written into a file -- dtest.out.
kusano 7d535a
 *
kusano 7d535a
 * =====================================================================
kusano 7d535a
 */
kusano 7d535a
    double         *a, *a_save;
kusano 7d535a
    int            *asub, *asub_save;
kusano 7d535a
    int            *xa, *xa_save;
kusano 7d535a
    SuperMatrix  A, B, X, L, U;
kusano 7d535a
    SuperMatrix  ASAV, AC;
kusano 7d535a
    mem_usage_t    mem_usage;
kusano 7d535a
    int            *perm_r; /* row permutation from partial pivoting */
kusano 7d535a
    int            *perm_c, *pc_save; /* column permutation */
kusano 7d535a
    int            *etree;
kusano 7d535a
    double  zero = 0.0;
kusano 7d535a
    double         *R, *C;
kusano 7d535a
    double         *ferr, *berr;
kusano 7d535a
    double         *rwork;
kusano 7d535a
    double	   *wwork;
kusano 7d535a
    void           *work;
kusano 7d535a
    int            info, lwork, nrhs, panel_size, relax;
kusano 7d535a
    int            m, n, nnz;
kusano 7d535a
    double         *xact;
kusano 7d535a
    double         *rhsb, *solx, *bsav;
kusano 7d535a
    int            ldb, ldx;
kusano 7d535a
    double         rpg, rcond;
kusano 7d535a
    int            i, j, k1;
kusano 7d535a
    double         rowcnd, colcnd, amax;
kusano 7d535a
    int            maxsuper, rowblk, colblk;
kusano 7d535a
    int            prefact, nofact, equil, iequed;
kusano 7d535a
    int            nt, nrun, nfail, nerrs, imat, fimat, nimat;
kusano 7d535a
    int            nfact, ifact, itran;
kusano 7d535a
    int            kl, ku, mode, lda;
kusano 7d535a
    int            zerot, izero, ioff;
kusano 7d535a
    double         u;
kusano 7d535a
    double         anorm, cndnum;
kusano 7d535a
    double         *Afull;
kusano 7d535a
    double         result[NTESTS];
kusano 7d535a
    superlu_options_t options;
kusano 7d535a
    fact_t         fact;
kusano 7d535a
    trans_t        trans;
kusano 7d535a
    SuperLUStat_t  stat;
kusano 7d535a
    static char    matrix_type[8];
kusano 7d535a
    static char    equed[1], path[4], sym[1], dist[1];
kusano 7d535a
kusano 7d535a
    /* Fixed set of parameters */
kusano 7d535a
    int            iseed[]  = {1988, 1989, 1990, 1991};
kusano 7d535a
    static char    equeds[]  = {'N', 'R', 'C', 'B'};
kusano 7d535a
    static fact_t  facts[] = {FACTORED, DOFACT, SamePattern,
kusano 7d535a
			      SamePattern_SameRowPerm};
kusano 7d535a
    static trans_t transs[]  = {NOTRANS, TRANS, CONJ};
kusano 7d535a
kusano 7d535a
    /* Some function prototypes */ 
kusano 7d535a
    extern int dgst01(int, int, SuperMatrix *, SuperMatrix *, 
kusano 7d535a
		      SuperMatrix *, int *, int *, double *);
kusano 7d535a
    extern int dgst02(trans_t, int, int, int, SuperMatrix *, double *,
kusano 7d535a
                      int, double *, int, double *resid);
kusano 7d535a
    extern int dgst04(int, int, double *, int, 
kusano 7d535a
                      double *, int, double rcond, double *resid);
kusano 7d535a
    extern int dgst07(trans_t, int, int, SuperMatrix *, double *, int,
kusano 7d535a
                         double *, int, double *, int, 
kusano 7d535a
                         double *, double *, double *);
kusano 7d535a
    extern int dlatb4_(char *, int *, int *, int *, char *, int *, int *, 
kusano 7d535a
	               double *, int *, double *, char *);
kusano 7d535a
    extern int dlatms_(int *, int *, char *, int *, char *, double *d,
kusano 7d535a
                       int *, double *, double *, int *, int *,
kusano 7d535a
                       char *, double *, int *, double *, int *);
kusano 7d535a
    extern int sp_dconvert(int, int, double *, int, int, int,
kusano 7d535a
	                   double *a, int *, int *, int *);
kusano 7d535a
kusano 7d535a
kusano 7d535a
    /* Executable statements */
kusano 7d535a
kusano 7d535a
    strcpy(path, "DGE");
kusano 7d535a
    nrun  = 0;
kusano 7d535a
    nfail = 0;
kusano 7d535a
    nerrs = 0;
kusano 7d535a
kusano 7d535a
    /* Defaults */
kusano 7d535a
    lwork      = 0;
kusano 7d535a
    n          = 1;
kusano 7d535a
    nrhs       = 1;
kusano 7d535a
    panel_size = sp_ienv(1);
kusano 7d535a
    relax      = sp_ienv(2);
kusano 7d535a
    u          = 1.0;
kusano 7d535a
    strcpy(matrix_type, "LA");
kusano 7d535a
    parse_command_line(argc, argv, matrix_type, &n,
kusano 7d535a
		       &panel_size, &relax, &nrhs, &maxsuper,
kusano 7d535a
		       &rowblk, &colblk, &lwork, &u);
kusano 7d535a
    if ( lwork > 0 ) {
kusano 7d535a
	work = SUPERLU_MALLOC(lwork);
kusano 7d535a
	if ( !work ) {
kusano 7d535a
	    fprintf(stderr, "expert: cannot allocate %d bytes\n", lwork);
kusano 7d535a
	    exit (-1);
kusano 7d535a
	}
kusano 7d535a
    }
kusano 7d535a
kusano 7d535a
    /* Set the default input options. */
kusano 7d535a
    set_default_options(&options);
kusano 7d535a
    options.DiagPivotThresh = u;
kusano 7d535a
    options.PrintStat = NO;
kusano 7d535a
    options.PivotGrowth = YES;
kusano 7d535a
    options.ConditionNumber = YES;
kusano 7d535a
    options.IterRefine = DOUBLE;
kusano 7d535a
    
kusano 7d535a
    if ( strcmp(matrix_type, "LA") == 0 ) {
kusano 7d535a
	/* Test LAPACK matrix suite. */
kusano 7d535a
	m = n;
kusano 7d535a
	lda = SUPERLU_MAX(n, 1);
kusano 7d535a
	nnz = n * n;        /* upper bound */
kusano 7d535a
	fimat = 1;
kusano 7d535a
	nimat = NTYPES;
kusano 7d535a
	Afull = doubleCalloc(lda * n);
kusano 7d535a
	dallocateA(n, nnz, &a, &asub, &xa);
kusano 7d535a
    } else {
kusano 7d535a
	/* Read a sparse matrix */
kusano 7d535a
	fimat = nimat = 0;
kusano 7d535a
	dreadhb(&m, &n, &nnz, &a, &asub, &xa);
kusano 7d535a
    }
kusano 7d535a
kusano 7d535a
    dallocateA(n, nnz, &a_save, &asub_save, &xa_save);
kusano 7d535a
    rhsb = doubleMalloc(m * nrhs);
kusano 7d535a
    bsav = doubleMalloc(m * nrhs);
kusano 7d535a
    solx = doubleMalloc(n * nrhs);
kusano 7d535a
    ldb  = m;
kusano 7d535a
    ldx  = n;
kusano 7d535a
    dCreate_Dense_Matrix(&B, m, nrhs, rhsb, ldb, SLU_DN, SLU_D, SLU_GE);
kusano 7d535a
    dCreate_Dense_Matrix(&X, n, nrhs, solx, ldx, SLU_DN, SLU_D, SLU_GE);
kusano 7d535a
    xact = doubleMalloc(n * nrhs);
kusano 7d535a
    etree   = intMalloc(n);
kusano 7d535a
    perm_r  = intMalloc(n);
kusano 7d535a
    perm_c  = intMalloc(n);
kusano 7d535a
    pc_save = intMalloc(n);
kusano 7d535a
    R       = (double *) SUPERLU_MALLOC(m*sizeof(double));
kusano 7d535a
    C       = (double *) SUPERLU_MALLOC(n*sizeof(double));
kusano 7d535a
    ferr    = (double *) SUPERLU_MALLOC(nrhs*sizeof(double));
kusano 7d535a
    berr    = (double *) SUPERLU_MALLOC(nrhs*sizeof(double));
kusano 7d535a
    j = SUPERLU_MAX(m,n) * SUPERLU_MAX(4,nrhs);    
kusano 7d535a
    rwork   = (double *) SUPERLU_MALLOC(j*sizeof(double));
kusano 7d535a
    for (i = 0; i < j; ++i) rwork[i] = 0.;
kusano 7d535a
    if ( !R ) ABORT("SUPERLU_MALLOC fails for R");
kusano 7d535a
    if ( !C ) ABORT("SUPERLU_MALLOC fails for C");
kusano 7d535a
    if ( !ferr ) ABORT("SUPERLU_MALLOC fails for ferr");
kusano 7d535a
    if ( !berr ) ABORT("SUPERLU_MALLOC fails for berr");
kusano 7d535a
    if ( !rwork ) ABORT("SUPERLU_MALLOC fails for rwork");
kusano 7d535a
    wwork   = doubleCalloc( SUPERLU_MAX(m,n) * SUPERLU_MAX(4,nrhs) );
kusano 7d535a
kusano 7d535a
    for (i = 0; i < n; ++i) perm_c[i] = pc_save[i] = i;
kusano 7d535a
    options.ColPerm = MY_PERMC;
kusano 7d535a
kusano 7d535a
    for (imat = fimat; imat <= nimat; ++imat) { /* All matrix types */
kusano 7d535a
	
kusano 7d535a
	if ( imat ) {
kusano 7d535a
kusano 7d535a
	    /* Skip types 5, 6, or 7 if the matrix size is too small. */
kusano 7d535a
	    zerot = (imat >= 5 && imat <= 7);
kusano 7d535a
	    if ( zerot && n < imat-4 )
kusano 7d535a
		continue;
kusano 7d535a
	    
kusano 7d535a
	    /* Set up parameters with DLATB4 and generate a test matrix
kusano 7d535a
	       with DLATMS.  */
kusano 7d535a
	    dlatb4_(path, &imat, &n, &n, sym, &kl, &ku, &anorm, &mode,
kusano 7d535a
		    &cndnum, dist);
kusano 7d535a
kusano 7d535a
	    dlatms_(&n, &n, dist, iseed, sym, &rwork[0], &mode, &cndnum,
kusano 7d535a
		    &anorm, &kl, &ku, "No packing", Afull, &lda,
kusano 7d535a
		    &wwork[0], &info);
kusano 7d535a
kusano 7d535a
	    if ( info ) {
kusano 7d535a
		printf(FMT3, "DLATMS", info, izero, n, nrhs, imat, nfail);
kusano 7d535a
		continue;
kusano 7d535a
	    }
kusano 7d535a
kusano 7d535a
	    /* For types 5-7, zero one or more columns of the matrix
kusano 7d535a
	       to test that INFO is returned correctly.   */
kusano 7d535a
	    if ( zerot ) {
kusano 7d535a
		if ( imat == 5 ) izero = 1;
kusano 7d535a
		else if ( imat == 6 ) izero = n;
kusano 7d535a
		else izero = n / 2 + 1;
kusano 7d535a
		ioff = (izero - 1) * lda;
kusano 7d535a
		if ( imat < 7 ) {
kusano 7d535a
		    for (i = 0; i < n; ++i) Afull[ioff + i] = zero;
kusano 7d535a
		} else {
kusano 7d535a
		    for (j = 0; j < n - izero + 1; ++j)
kusano 7d535a
			for (i = 0; i < n; ++i)
kusano 7d535a
			    Afull[ioff + i + j*lda] = zero;
kusano 7d535a
		}
kusano 7d535a
	    } else {
kusano 7d535a
		izero = 0;
kusano 7d535a
	    }
kusano 7d535a
kusano 7d535a
	    /* Convert to sparse representation. */
kusano 7d535a
	    sp_dconvert(n, n, Afull, lda, kl, ku, a, asub, xa, &nnz);
kusano 7d535a
kusano 7d535a
	} else {
kusano 7d535a
	    izero = 0;
kusano 7d535a
	    zerot = 0;
kusano 7d535a
	}
kusano 7d535a
	
kusano 7d535a
	dCreate_CompCol_Matrix(&A, m, n, nnz, a, asub, xa, SLU_NC, SLU_D, SLU_GE);
kusano 7d535a
kusano 7d535a
	/* Save a copy of matrix A in ASAV */
kusano 7d535a
	dCreate_CompCol_Matrix(&ASAV, m, n, nnz, a_save, asub_save, xa_save,
kusano 7d535a
			      SLU_NC, SLU_D, SLU_GE);
kusano 7d535a
	dCopy_CompCol_Matrix(&A, &ASAV);
kusano 7d535a
	
kusano 7d535a
	/* Form exact solution. */
kusano 7d535a
	dGenXtrue(n, nrhs, xact, ldx);
kusano 7d535a
	
kusano 7d535a
	StatInit(&stat);
kusano 7d535a
kusano 7d535a
	for (iequed = 0; iequed < 4; ++iequed) {
kusano 7d535a
	    *equed = equeds[iequed];
kusano 7d535a
	    if (iequed == 0) nfact = 4;
kusano 7d535a
	    else nfact = 1; /* Only test factored, pre-equilibrated matrix */
kusano 7d535a
kusano 7d535a
	    for (ifact = 0; ifact < nfact; ++ifact) {
kusano 7d535a
		fact = facts[ifact];
kusano 7d535a
		options.Fact = fact;
kusano 7d535a
kusano 7d535a
		for (equil = 0; equil < 2; ++equil) {
kusano 7d535a
		    options.Equil = equil;
kusano 7d535a
		    prefact   = ( options.Fact == FACTORED ||
kusano 7d535a
				  options.Fact == SamePattern_SameRowPerm );
kusano 7d535a
                                /* Need a first factor */
kusano 7d535a
		    nofact    = (options.Fact != FACTORED);  /* Not factored */
kusano 7d535a
kusano 7d535a
		    /* Restore the matrix A. */
kusano 7d535a
		    dCopy_CompCol_Matrix(&ASAV, &A);
kusano 7d535a
			
kusano 7d535a
		    if ( zerot ) {
kusano 7d535a
                        if ( prefact ) continue;
kusano 7d535a
		    } else if ( options.Fact == FACTORED ) {
kusano 7d535a
                        if ( equil || iequed ) {
kusano 7d535a
			    /* Compute row and column scale factors to
kusano 7d535a
			       equilibrate matrix A.    */
kusano 7d535a
			    dgsequ(&A, R, C, &rowcnd, &colcnd, &amax, &info);
kusano 7d535a
kusano 7d535a
			    /* Force equilibration. */
kusano 7d535a
			    if ( !info && n > 0 ) {
kusano 7d535a
				if ( lsame_(equed, "R") ) {
kusano 7d535a
				    rowcnd = 0.;
kusano 7d535a
				    colcnd = 1.;
kusano 7d535a
				} else if ( lsame_(equed, "C") ) {
kusano 7d535a
				    rowcnd = 1.;
kusano 7d535a
				    colcnd = 0.;
kusano 7d535a
				} else if ( lsame_(equed, "B") ) {
kusano 7d535a
				    rowcnd = 0.;
kusano 7d535a
				    colcnd = 0.;
kusano 7d535a
				}
kusano 7d535a
			    }
kusano 7d535a
			
kusano 7d535a
			    /* Equilibrate the matrix. */
kusano 7d535a
			    dlaqgs(&A, R, C, rowcnd, colcnd, amax, equed);
kusano 7d535a
			}
kusano 7d535a
		    }
kusano 7d535a
		    
kusano 7d535a
		    if ( prefact ) { /* Need a factor for the first time */
kusano 7d535a
			
kusano 7d535a
		        /* Save Fact option. */
kusano 7d535a
		        fact = options.Fact;
kusano 7d535a
			options.Fact = DOFACT;
kusano 7d535a
kusano 7d535a
			/* Preorder the matrix, obtain the column etree. */
kusano 7d535a
			sp_preorder(&options, &A, perm_c, etree, &AC);
kusano 7d535a
kusano 7d535a
			/* Factor the matrix AC. */
kusano 7d535a
			dgstrf(&options, &AC, relax, panel_size,
kusano 7d535a
                               etree, work, lwork, perm_c, perm_r, &L, &U,
kusano 7d535a
                               &stat, &info);
kusano 7d535a
kusano 7d535a
			if ( info ) { 
kusano 7d535a
                            printf("** First factor: info %d, equed %c\n",
kusano 7d535a
				   info, *equed);
kusano 7d535a
                            if ( lwork == -1 ) {
kusano 7d535a
                                printf("** Estimated memory: %d bytes\n",
kusano 7d535a
                                        info - n);
kusano 7d535a
                                exit(0);
kusano 7d535a
                            }
kusano 7d535a
                        }
kusano 7d535a
	
kusano 7d535a
                        Destroy_CompCol_Permuted(&AC);
kusano 7d535a
			
kusano 7d535a
		        /* Restore Fact option. */
kusano 7d535a
			options.Fact = fact;
kusano 7d535a
		    } /* if .. first time factor */
kusano 7d535a
		    
kusano 7d535a
		    for (itran = 0; itran < NTRAN; ++itran) {
kusano 7d535a
			trans = transs[itran];
kusano 7d535a
                        options.Trans = trans;
kusano 7d535a
kusano 7d535a
			/* Restore the matrix A. */
kusano 7d535a
			dCopy_CompCol_Matrix(&ASAV, &A);
kusano 7d535a
			
kusano 7d535a
 			/* Set the right hand side. */
kusano 7d535a
			dFillRHS(trans, nrhs, xact, ldx, &A, &B);
kusano 7d535a
			dCopy_Dense_Matrix(m, nrhs, rhsb, ldb, bsav, ldb);
kusano 7d535a
kusano 7d535a
			/*----------------
kusano 7d535a
			 * Test dgssv
kusano 7d535a
			 *----------------*/
kusano 7d535a
			if ( options.Fact == DOFACT && itran == 0) {
kusano 7d535a
                            /* Not yet factored, and untransposed */
kusano 7d535a
	
kusano 7d535a
			    dCopy_Dense_Matrix(m, nrhs, rhsb, ldb, solx, ldx);
kusano 7d535a
			    dgssv(&options, &A, perm_c, perm_r, &L, &U, &X,
kusano 7d535a
                                  &stat, &info);
kusano 7d535a
			    
kusano 7d535a
			    if ( info && info != izero ) {
kusano 7d535a
                                printf(FMT3, "dgssv",
kusano 7d535a
				       info, izero, n, nrhs, imat, nfail);
kusano 7d535a
			    } else {
kusano 7d535a
                                /* Reconstruct matrix from factors and
kusano 7d535a
	                           compute residual. */
kusano 7d535a
                                dgst01(m, n, &A, &L, &U, perm_c, perm_r,
kusano 7d535a
                                         &result[0]);
kusano 7d535a
				nt = 1;
kusano 7d535a
				if ( izero == 0 ) {
kusano 7d535a
				    /* Compute residual of the computed
kusano 7d535a
				       solution. */
kusano 7d535a
				    dCopy_Dense_Matrix(m, nrhs, rhsb, ldb,
kusano 7d535a
						       wwork, ldb);
kusano 7d535a
				    dgst02(trans, m, n, nrhs, &A, solx,
kusano 7d535a
                                              ldx, wwork,ldb, &result[1]);
kusano 7d535a
				    nt = 2;
kusano 7d535a
				}
kusano 7d535a
				
kusano 7d535a
				/* Print information about the tests that
kusano 7d535a
				   did not pass the threshold.      */
kusano 7d535a
				for (i = 0; i < nt; ++i) {
kusano 7d535a
				    if ( result[i] >= THRESH ) {
kusano 7d535a
					printf(FMT1, "dgssv", n, i,
kusano 7d535a
					       result[i]);
kusano 7d535a
					++nfail;
kusano 7d535a
				    }
kusano 7d535a
				}
kusano 7d535a
				nrun += nt;
kusano 7d535a
			    } /* else .. info == 0 */
kusano 7d535a
kusano 7d535a
			    /* Restore perm_c. */
kusano 7d535a
			    for (i = 0; i < n; ++i) perm_c[i] = pc_save[i];
kusano 7d535a
kusano 7d535a
		            if (lwork == 0) {
kusano 7d535a
			        Destroy_SuperNode_Matrix(&L);
kusano 7d535a
			        Destroy_CompCol_Matrix(&U);
kusano 7d535a
			    }
kusano 7d535a
			} /* if .. end of testing dgssv */
kusano 7d535a
    
kusano 7d535a
			/*----------------
kusano 7d535a
			 * Test dgssvx
kusano 7d535a
			 *----------------*/
kusano 7d535a
    
kusano 7d535a
			/* Equilibrate the matrix if fact = FACTORED and
kusano 7d535a
			   equed = 'R', 'C', or 'B'.   */
kusano 7d535a
			if ( options.Fact == FACTORED &&
kusano 7d535a
			     (equil || iequed) && n > 0 ) {
kusano 7d535a
			    dlaqgs(&A, R, C, rowcnd, colcnd, amax, equed);
kusano 7d535a
			}
kusano 7d535a
			
kusano 7d535a
			/* Solve the system and compute the condition number
kusano 7d535a
			   and error bounds using dgssvx.      */
kusano 7d535a
			dgssvx(&options, &A, perm_c, perm_r, etree,
kusano 7d535a
                               equed, R, C, &L, &U, work, lwork, &B, &X, &rpg,
kusano 7d535a
                               &rcond, ferr, berr, &mem_usage, &stat, &info);
kusano 7d535a
kusano 7d535a
			if ( info && info != izero ) {
kusano 7d535a
			    printf(FMT3, "dgssvx",
kusano 7d535a
				   info, izero, n, nrhs, imat, nfail);
kusano 7d535a
                            if ( lwork == -1 ) {
kusano 7d535a
                                printf("** Estimated memory: %.0f bytes\n",
kusano 7d535a
                                        mem_usage.total_needed);
kusano 7d535a
                                exit(0);
kusano 7d535a
                            }
kusano 7d535a
			} else {
kusano 7d535a
			    if ( !prefact ) {
kusano 7d535a
			    	/* Reconstruct matrix from factors and
kusano 7d535a
	 			   compute residual. */
kusano 7d535a
                                dgst01(m, n, &A, &L, &U, perm_c, perm_r,
kusano 7d535a
                                         &result[0]);
kusano 7d535a
				k1 = 0;
kusano 7d535a
			    } else {
kusano 7d535a
			   	k1 = 1;
kusano 7d535a
			    }
kusano 7d535a
kusano 7d535a
			    if ( !info ) {
kusano 7d535a
				/* Compute residual of the computed solution.*/
kusano 7d535a
				dCopy_Dense_Matrix(m, nrhs, bsav, ldb,
kusano 7d535a
						  wwork, ldb);
kusano 7d535a
				dgst02(trans, m, n, nrhs, &ASAV, solx, ldx,
kusano 7d535a
					  wwork, ldb, &result[1]);
kusano 7d535a
kusano 7d535a
				/* Check solution from generated exact
kusano 7d535a
				   solution. */
kusano 7d535a
				dgst04(n, nrhs, solx, ldx, xact, ldx, rcond,
kusano 7d535a
					  &result[2]);
kusano 7d535a
kusano 7d535a
				/* Check the error bounds from iterative
kusano 7d535a
				   refinement. */
kusano 7d535a
				dgst07(trans, n, nrhs, &ASAV, bsav, ldb,
kusano 7d535a
					  solx, ldx, xact, ldx, ferr, berr,
kusano 7d535a
					  &result[3]);
kusano 7d535a
kusano 7d535a
				/* Print information about the tests that did
kusano 7d535a
				   not pass the threshold.    */
kusano 7d535a
				for (i = k1; i < NTESTS; ++i) {
kusano 7d535a
				    if ( result[i] >= THRESH ) {
kusano 7d535a
					printf(FMT2, "dgssvx",
kusano 7d535a
					       options.Fact, trans, *equed,
kusano 7d535a
					       n, imat, i, result[i]);
kusano 7d535a
					++nfail;
kusano 7d535a
				    }
kusano 7d535a
				}
kusano 7d535a
				nrun += NTESTS;
kusano 7d535a
			    } /* if .. info == 0 */
kusano 7d535a
			} /* else .. end of testing dgssvx */
kusano 7d535a
kusano 7d535a
		    } /* for itran ... */
kusano 7d535a
kusano 7d535a
		    if ( lwork == 0 ) {
kusano 7d535a
			Destroy_SuperNode_Matrix(&L);
kusano 7d535a
			Destroy_CompCol_Matrix(&U);
kusano 7d535a
		    }
kusano 7d535a
kusano 7d535a
		} /* for equil ... */
kusano 7d535a
	    } /* for ifact ... */
kusano 7d535a
	} /* for iequed ... */
kusano 7d535a
#if 0    
kusano 7d535a
    if ( !info ) {
kusano 7d535a
	PrintPerf(&L, &U, &mem_usage, rpg, rcond, ferr, berr, equed);
kusano 7d535a
    }
kusano 7d535a
#endif    
kusano 7d535a
kusano 7d535a
    } /* for imat ... */
kusano 7d535a
kusano 7d535a
    /* Print a summary of the results. */
kusano 7d535a
    PrintSumm("DGE", nfail, nrun, nerrs);
kusano 7d535a
kusano 7d535a
    SUPERLU_FREE (rhsb);
kusano 7d535a
    SUPERLU_FREE (bsav);
kusano 7d535a
    SUPERLU_FREE (solx);    
kusano 7d535a
    SUPERLU_FREE (xact);
kusano 7d535a
    SUPERLU_FREE (etree);
kusano 7d535a
    SUPERLU_FREE (perm_r);
kusano 7d535a
    SUPERLU_FREE (perm_c);
kusano 7d535a
    SUPERLU_FREE (pc_save);
kusano 7d535a
    SUPERLU_FREE (R);
kusano 7d535a
    SUPERLU_FREE (C);
kusano 7d535a
    SUPERLU_FREE (ferr);
kusano 7d535a
    SUPERLU_FREE (berr);
kusano 7d535a
    SUPERLU_FREE (rwork);
kusano 7d535a
    SUPERLU_FREE (wwork);
kusano 7d535a
    Destroy_SuperMatrix_Store(&B);
kusano 7d535a
    Destroy_SuperMatrix_Store(&X);
kusano 7d535a
    Destroy_CompCol_Matrix(&A);
kusano 7d535a
    Destroy_CompCol_Matrix(&ASAV);
kusano 7d535a
    if ( lwork > 0 ) {
kusano 7d535a
	SUPERLU_FREE (work);
kusano 7d535a
	Destroy_SuperMatrix_Store(&L);
kusano 7d535a
	Destroy_SuperMatrix_Store(&U);
kusano 7d535a
    }
kusano 7d535a
    StatFree(&stat);
kusano 7d535a
kusano 7d535a
    return 0;
kusano 7d535a
}
kusano 7d535a
kusano 7d535a
/*  
kusano 7d535a
 * Parse command line options to get relaxed snode size, panel size, etc.
kusano 7d535a
 */
kusano 7d535a
static void
kusano 7d535a
parse_command_line(int argc, char *argv[], char *matrix_type,
kusano 7d535a
		   int *n, int *w, int *relax, int *nrhs, int *maxsuper,
kusano 7d535a
		   int *rowblk, int *colblk, int *lwork, double *u)
kusano 7d535a
{
kusano 7d535a
    int c;
kusano 7d535a
    extern char *optarg;
kusano 7d535a
kusano 7d535a
    while ( (c = getopt(argc, argv, "ht:n:w:r:s:m:b:c:l:")) != EOF ) {
kusano 7d535a
	switch (c) {
kusano 7d535a
	  case 'h':
kusano 7d535a
	    printf("Options:\n");
kusano 7d535a
	    printf("\t-w <int> - panel size\n");</int>
kusano 7d535a
	    printf("\t-r <int> - granularity of relaxed supernodes\n");</int>
kusano 7d535a
	    exit(1);
kusano 7d535a
	    break;
kusano 7d535a
	  case 't': strcpy(matrix_type, optarg);
kusano 7d535a
	            break;
kusano 7d535a
	  case 'n': *n = atoi(optarg);
kusano 7d535a
	            break;
kusano 7d535a
	  case 'w': *w = atoi(optarg);
kusano 7d535a
	            break;
kusano 7d535a
	  case 'r': *relax = atoi(optarg); 
kusano 7d535a
	            break;
kusano 7d535a
	  case 's': *nrhs = atoi(optarg); 
kusano 7d535a
	            break;
kusano 7d535a
	  case 'm': *maxsuper = atoi(optarg); 
kusano 7d535a
	            break;
kusano 7d535a
	  case 'b': *rowblk = atoi(optarg); 
kusano 7d535a
	            break;
kusano 7d535a
	  case 'c': *colblk = atoi(optarg); 
kusano 7d535a
	            break;
kusano 7d535a
	  case 'l': *lwork = atoi(optarg); 
kusano 7d535a
	            break;
kusano 7d535a
	  case 'u': *u = atof(optarg); 
kusano 7d535a
	            break;
kusano 7d535a
  	}
kusano 7d535a
    }
kusano 7d535a
}