⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pddrive.c

📁 SuperLU 2.2版本。对大型、稀疏、非对称的线性系统的直接求解
💻 C
字号:
/* * -- Distributed SuperLU routine (version 2.1) -- * Lawrence Berkeley National Lab, Univ. of California Berkeley. * November 1, 2007 * */#include <math.h>#include "superlu_ddefs.h"main(int argc, char *argv[])/* * Purpose * ======= * * The driver program PDDRIVE. * * This example illustrates how to use PDGSSVX with the full * (default) options to solve a linear system. *  * Five basic steps are required: *   1. Initialize the MPI environment and the SuperLU process grid *   2. Set up the input matrix and the right-hand side *   3. Set the options argument *   4. Call pdgssvx *   5. Release the process grid and terminate the MPI environment * * On an IBM SP, the program may be run by typing *    poe pddrive -r <proc rows> -c <proc columns> <input_file> -procs <p> * */{    superlu_options_t options;    SuperLUStat_t stat;    SuperMatrix A;    ScalePermstruct_t ScalePermstruct;    LUstruct_t LUstruct;    SOLVEstruct_t SOLVEstruct;    gridinfo_t grid;    double   *berr;    double   *b, *xtrue;    int_t    m, n;    int_t    nprow, npcol;    int      iam, info, ldb, ldx, nrhs;    char     **cpp, c;    FILE *fp, *fopen();    extern int cpp_defs();    nprow = 1;  /* Default process rows.      */    npcol = 1;  /* Default process columns.   */    nrhs = 1;   /* Number of right-hand side. */    /* ------------------------------------------------------------       INITIALIZE MPI ENVIRONMENT.        ------------------------------------------------------------*/    MPI_Init( &argc, &argv );    /* Parse command line argv[]. */    for (cpp = argv+1; *cpp; ++cpp) {	if ( **cpp == '-' ) {	    c = *(*cpp+1);	    ++cpp;	    switch (c) {	      case 'h':		  printf("Options:\n");		  printf("\t-r <int>: process rows    (default %d)\n", nprow);		  printf("\t-c <int>: process columns (default %d)\n", npcol);		  exit(0);		  break;	      case 'r': nprow = atoi(*cpp);		        break;	      case 'c': npcol = atoi(*cpp);		        break;	    }	} else { /* Last arg is considered a filename */	    if ( !(fp = fopen(*cpp, "r")) ) {                ABORT("File does not exist");            }	    break;	}    }    /* ------------------------------------------------------------       INITIALIZE THE SUPERLU PROCESS GRID.        ------------------------------------------------------------*/    superlu_gridinit(MPI_COMM_WORLD, nprow, npcol, &grid);    /* Bail out if I do not belong in the grid. */    iam = grid.iam;    if ( iam >= nprow * npcol )	goto out;    if ( !iam ) printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol);#if ( VAMPIR>=1 )    VT_traceoff();#endif#if ( DEBUGlevel>=1 )    CHECK_MALLOC(iam, "Enter main()");#endif    /* ------------------------------------------------------------       GET THE MATRIX FROM FILE AND SETUP THE RIGHT HAND SIDE.        ------------------------------------------------------------*/    dcreate_matrix(&A, nrhs, &b, &ldb, &xtrue, &ldx, fp, &grid);    if ( !(berr = doubleMalloc_dist(nrhs)) )	ABORT("Malloc fails for berr[].");    /* ------------------------------------------------------------       NOW WE SOLVE THE LINEAR SYSTEM.       ------------------------------------------------------------*/    /* Set the default input options:        options.Fact              = DOFACT;        options.Equil             = YES;        options.ParSymbFact       = NO;        options.ColPerm           = MMD_AT_PLUS_A;        options.RowPerm           = LargeDiag;        options.ReplaceTinyPivot  = YES;        options.IterRefine        = DOUBLE;        options.Trans             = NOTRANS;        options.SolveInitialized  = NO;        options.RefineInitialized = NO;        options.PrintStat         = YES;     */    set_default_options_dist(&options);#if 0    options.ParSymbFact = YES;    options.RowPerm = NOROWPERM;    options.IterRefine = NOREFINE;    options.ColPerm = NATURAL;    options.Equil = NO;     options.ReplaceTinyPivot = NO;#endif    m = A.nrow;    n = A.ncol;    /* Initialize ScalePermstruct and LUstruct. */    ScalePermstructInit(m, n, &ScalePermstruct);    LUstructInit(m, n, &LUstruct);    /* Initialize the statistics variables. */    PStatInit(&stat);    /* Call the linear equation solver. */    pdgssvx(&options, &A, &ScalePermstruct, b, ldb, nrhs, &grid,	    &LUstruct, &SOLVEstruct, berr, &stat, &info);    /* Check the accuracy of the solution. */    pdinf_norm_error(iam, ((NRformat_loc *)A.Store)->m_loc,		     nrhs, b, ldb, xtrue, ldx, &grid);    PStatPrint(&options, &stat, &grid);        /* Print the statistics. */    /* ------------------------------------------------------------       DEALLOCATE STORAGE.       ------------------------------------------------------------*/    PStatFree(&stat);    Destroy_CompRowLoc_Matrix_dist(&A);    ScalePermstructFree(&ScalePermstruct);    Destroy_LU(n, &grid, &LUstruct);    LUstructFree(&LUstruct);    if ( options.SolveInitialized ) {        dSolveFinalize(&options, &SOLVEstruct);    }    SUPERLU_FREE(b);    SUPERLU_FREE(xtrue);    SUPERLU_FREE(berr);    /* ------------------------------------------------------------       RELEASE THE SUPERLU PROCESS GRID.       ------------------------------------------------------------*/out:    superlu_gridexit(&grid);    /* ------------------------------------------------------------       TERMINATES THE MPI EXECUTION ENVIRONMENT.       ------------------------------------------------------------*/    MPI_Finalize();#if ( DEBUGlevel>=1 )    CHECK_MALLOC(iam, "Exit main()");#endif}int cpp_defs(){    printf(".. CPP definitions:\n");#if ( PRNTlevel>=1 )    printf("\tPRNTlevel = %d\n", PRNTlevel);#endif#if ( DEBUGlevel>=1 )    printf("\tDEBUGlevel = %d\n", DEBUGlevel);#endif#if ( PROFlevel>=1 )    printf("\tPROFlevel = %d\n", PROFlevel);#endif#if ( StaticPivot>=1 )    printf("\tStaticPivot = %d\n", StaticPivot);#endif    printf("....\n");    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -