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

📄 pzgssvx.c

📁 SuperLU 2.2版本。对大型、稀疏、非对称的线性系统的直接求解
💻 C
📖 第 1 页 / 共 4 页
字号:
 *           = YES: replace tiny pivots by sqrt(epsilon)*norm(A) during  *                  LU factorization. * *         o IterRefine (IterRefine_t) *           Specifies how to perform iterative refinement. *           = NO:     no iterative refinement. *           = DOUBLE: accumulate residual in double precision. *           = EXTRA:  accumulate residual in extra precision. * *         NOTE: all options must be indentical on all processes when *               calling this routine. * * A (input/output) SuperMatrix* (local) *         On entry, matrix A in A*X=B, of dimension (A->nrow, A->ncol). *           The number of linear equations is A->nrow. The type of A must be: *           Stype = SLU_NR_loc; Dtype = SLU_D; Mtype = SLU_GE. *           That is, A is stored in distributed compressed row format. *           See supermatrix.h for the definition of 'SuperMatrix'. *           This routine only handles square A, however, the LU factorization *           routine PDGSTRF can factorize rectangular matrices. *         On exit, A may be overwtirren by diag(R)*A*diag(C)*Pc^T, *           depending on ScalePermstruct->DiagScale and options->ColPerm: *             if ScalePermstruct->DiagScale != NOEQUIL, A is overwritten by *                diag(R)*A*diag(C). *             if options->ColPerm != NATURAL, A is further overwritten by *                diag(R)*A*diag(C)*Pc^T. *           If all the above condition are true, the LU decomposition is *           performed on the matrix Pc*Pr*diag(R)*A*diag(C)*Pc^T. * * ScalePermstruct (input/output) ScalePermstruct_t* (global) *         The data structure to store the scaling and permutation vectors *         describing the transformations performed to the matrix A. *         It contains the following fields: * *         o DiagScale (DiagScale_t) *           Specifies the form of equilibration that was done. *           = NOEQUIL: no equilibration. *           = ROW:     row equilibration, i.e., A was premultiplied by *                      diag(R). *           = COL:     Column equilibration, i.e., A was postmultiplied *                      by diag(C). *           = BOTH:    both row and column equilibration, i.e., A was  *                      replaced by diag(R)*A*diag(C). *           If options->Fact = FACTORED or SamePattern_SameRowPerm, *           DiagScale is an input argument; otherwise it is an output *           argument. * *         o perm_r (int*) *           Row permutation vector, which defines the permutation matrix Pr; *           perm_r[i] = j means row i of A is in position j in Pr*A. *           If options->RowPerm = MY_PERMR, or *           options->Fact = SamePattern_SameRowPerm, perm_r is an *           input argument; otherwise it is an output argument. * *         o perm_c (int*) *           Column permutation vector, which defines the  *           permutation matrix Pc; perm_c[i] = j means column i of A is  *           in position j in A*Pc. *           If options->ColPerm = MY_PERMC or options->Fact = SamePattern *           or options->Fact = SamePattern_SameRowPerm, perm_c is an *           input argument; otherwise, it is an output argument. *           On exit, perm_c may be overwritten by the product of the input *           perm_c and a permutation that postorders the elimination tree *           of Pc*A'*A*Pc'; perm_c is not changed if the elimination tree *           is already in postorder. * *         o R (double*) dimension (A->nrow) *           The row scale factors for A. *           If DiagScale = ROW or BOTH, A is multiplied on the left by  *                          diag(R). *           If DiagScale = NOEQUIL or COL, R is not defined. *           If options->Fact = FACTORED or SamePattern_SameRowPerm, R is *           an input argument; otherwise, R is an output argument. * *         o C (double*) dimension (A->ncol) *           The column scale factors for A. *           If DiagScale = COL or BOTH, A is multiplied on the right by  *                          diag(C). *           If DiagScale = NOEQUIL or ROW, C is not defined. *           If options->Fact = FACTORED or SamePattern_SameRowPerm, C is *           an input argument; otherwise, C is an output argument. *          * B       (input/output) doublecomplex* (local) *         On entry, the right-hand side matrix of dimension (m_loc, nrhs), *           where, m_loc is the number of rows stored locally on my *           process and is defined in the data structure of matrix A. *         On exit, the solution matrix if info = 0; * * ldb     (input) int (local) *         The leading dimension of matrix B. * * nrhs    (input) int (global) *         The number of right-hand sides. *         If nrhs = 0, only LU decomposition is performed, the forward *         and back substitutions are skipped. * * grid    (input) gridinfo_t* (global) *         The 2D process mesh. It contains the MPI communicator, the number *         of process rows (NPROW), the number of process columns (NPCOL), *         and my process rank. It is an input argument to all the *         parallel routines. *         Grid can be initialized by subroutine SUPERLU_GRIDINIT. *         See superlu_zdefs.h for the definition of 'gridinfo_t'. * * LUstruct (input/output) LUstruct_t* *         The data structures to store the distributed L and U factors. *         It contains the following fields: * *         o etree (int*) dimension (A->ncol) (global) *           Elimination tree of Pc*(A'+A)*Pc' or Pc*A'*A*Pc'. *           It is computed in sp_colorder() during the first factorization, *           and is reused in the subsequent factorizations of the matrices *           with the same nonzero pattern. *           On exit of sp_colorder(), the columns of A are permuted so that *           the etree is in a certain postorder. This postorder is reflected *           in ScalePermstruct->perm_c. *           NOTE: *           Etree is a vector of parent pointers for a forest whose vertices *           are the integers 0 to A->ncol-1; etree[root]==A->ncol. * *         o Glu_persist (Glu_persist_t*) (global) *           Global data structure (xsup, supno) replicated on all processes, *           describing the supernode partition in the factored matrices *           L and U: *	       xsup[s] is the leading column of the s-th supernode, *             supno[i] is the supernode number to which column i belongs. * *         o Llu (LocalLU_t*) (local) *           The distributed data structures to store L and U factors. *           See superlu_zdefs.h for the definition of 'LocalLU_t'. * * SOLVEstruct (input/output) SOLVEstruct_t* *         The data structure to hold the communication pattern used *         in the phases of triangular solution and iterative refinement. *         This pattern should be intialized only once for repeated solutions. *         If options->SolveInitialized = YES, it is an input argument. *         If options->SolveInitialized = NO and nrhs != 0, it is an output *         argument. See superlu_zdefs.h for the definition of 'SOLVEstruct_t'. * * berr    (output) double*, dimension (nrhs) (global) *         The componentwise relative backward error of each solution    *         vector X(j) (i.e., the smallest relative change in    *         any element of A or B that makes X(j) an exact solution). * * stat   (output) SuperLUStat_t* *        Record the statistics on runtime and floating-point operation count. *        See util.h for the definition of 'SuperLUStat_t'. * * info    (output) int* *         = 0: successful exit *         > 0: if info = i, and i is *             <= A->ncol: U(i,i) is exactly zero. The factorization has *                been completed, but the factor U is exactly singular, *                so the solution could not be computed. *             > A->ncol: number of bytes allocated when memory allocation *                failure occurred, plus A->ncol. * * See superlu_zdefs.h for the definitions of varioous data types. * */    NRformat_loc *Astore;    SuperMatrix GA;      /* Global A in NC format */    NCformat *GAstore;    doublecomplex   *a_GA;    SuperMatrix GAC;      /* Global A in NCP format (add n end pointers) */    NCPformat *GACstore;    Glu_persist_t *Glu_persist = LUstruct->Glu_persist;    Glu_freeable_t *Glu_freeable;            /* The nonzero structures of L and U factors, which are	       replicated on all processrs.	           (lsub, xlsub) contains the compressed subscript of		                 supernodes in L.          	   (usub, xusub) contains the compressed subscript of		                 nonzero segments in U.	      If options->Fact != SamePattern_SameRowPerm, they are 	      computed by SYMBFACT routine, and then used by PDDISTRIBUTE	      routine. They will be freed after PDDISTRIBUTE routine.	      If options->Fact == SamePattern_SameRowPerm, these	      structures are not used.                                  */    fact_t   Fact;    doublecomplex   *a;    int_t    *colptr, *rowind;    int_t    *perm_r; /* row permutations from partial pivoting */    int_t    *perm_c; /* column permutation vector */    int_t    *etree;  /* elimination tree */    int_t    *rowptr, *colind;  /* Local A in NR*/    int_t    *rowind_loc, *colptr_loc;    int_t    colequ, Equil, factored, job, notran, rowequ, need_value;    int_t    i, iinfo, j, irow, m, n, nnz, permc_spec, dist_mem_use;    int_t    nnz_loc, m_loc, fst_row, icol;    int      iam;    int      ldx;  /* LDA for matrix X (local). */    char     equed[1], norm[1];    double   *C, *R, *C1, *R1, amax, anorm, colcnd, rowcnd;    doublecomplex   *X, *b_col, *b_work, *x_col;    double   t;    static mem_usage_t num_mem_usage, symb_mem_usage;#if ( PRNTlevel>= 2 )    double   dmin, dsum, dprod;#endif    int_t procs;    /* Structures needed for parallel symbolic factorization */    int_t *sizes, *fstVtxSep, parSymbFact;    int   noDomains, nprocs_num;    MPI_Comm symb_comm; /* communicator for symbolic factorization */    int   col, key; /* parameters for creating a new communicator */    Pslu_freeable_t Pslu_freeable;    float  flinfo;    /* Initialization. */    m       = A->nrow;    n       = A->ncol;    Astore  = (NRformat_loc *) A->Store;    nnz_loc = Astore->nnz_loc;    m_loc   = Astore->m_loc;    fst_row = Astore->fst_row;    a       = (doublecomplex *) Astore->nzval;    rowptr  = Astore->rowptr;    colind  = Astore->colind;    sizes   = NULL;    fstVtxSep = NULL;    symb_comm = MPI_COMM_NULL;    /* Test the input parameters. */    *info = 0;    Fact = options->Fact;    if ( Fact < 0 || Fact > FACTORED )	*info = -1;    else if ( options->RowPerm < 0 || options->RowPerm > MY_PERMR )	*info = -1;    else if ( options->ColPerm < 0 || options->ColPerm > MY_PERMC )	*info = -1;    else if ( options->IterRefine < 0 || options->IterRefine > EXTRA )	*info = -1;    else if ( options->IterRefine == EXTRA ) {	*info = -1;	fprintf(stderr, "Extra precise iterative refinement yet to support.");    } else if ( A->nrow != A->ncol || A->nrow < 0 || A->Stype != SLU_NR_loc		|| A->Dtype != SLU_Z || A->Mtype != SLU_GE )	*info = -2;    else if ( ldb < m_loc )	*info = -5;    else if ( nrhs < 0 )	*info = -6;    if ( *info ) {	i = -(*info);	pxerbla("pzgssvx", grid, -*info);	return;    }    factored = (Fact == FACTORED);    Equil = (!factored && options->Equil == YES);    notran = (options->Trans == NOTRANS);    iam = grid->iam;    job = 5;    if ( factored || (Fact == SamePattern_SameRowPerm && Equil) ) {	rowequ = (ScalePermstruct->DiagScale == ROW) ||	         (ScalePermstruct->DiagScale == BOTH);	colequ = (ScalePermstruct->DiagScale == COL) ||	         (ScalePermstruct->DiagScale == BOTH);    } else rowequ = colequ = FALSE;    /* The following arrays are replicated on all processes. */    perm_r = ScalePermstruct->perm_r;    perm_c = ScalePermstruct->perm_c;    etree = LUstruct->etree;    R = ScalePermstruct->R;    C = ScalePermstruct->C;    /********/#if ( DEBUGlevel>=1 )    CHECK_MALLOC(iam, "Enter pzgssvx()");#endif    /* Not factored & ask for equilibration */    if ( Equil && Fact != SamePattern_SameRowPerm ) { 	/* Allocate storage if not done so before. */	switch ( ScalePermstruct->DiagScale ) {	    case NOEQUIL:		if ( !(R = (double *) doubleMalloc_dist(m)) )		    ABORT("Malloc fails for R[].");	        if ( !(C = (double *) doubleMalloc_dist(n)) )		    ABORT("Malloc fails for C[].");		ScalePermstruct->R = R;		ScalePermstruct->C = C;		break;	    case ROW: 	        if ( !(C = (double *) doubleMalloc_dist(n)) )		    ABORT("Malloc fails for C[].");		ScalePermstruct->C = C;		break;	    case COL: 		if ( !(R = (double *) doubleMalloc_dist(m)) )		    ABORT("Malloc fails for R[].");		ScalePermstruct->R = R;		break;	}    }    /* ------------------------------------------------------------       Diagonal scaling to equilibrate the matrix.       ------------------------------------------------------------*/    if ( Equil ) {#if ( DEBUGlevel>=1 )	CHECK_MALLOC(iam, "Enter equil");#endif	t = SuperLU_timer_();	if ( Fact == SamePattern_SameRowPerm ) {	    /* Reuse R and C. */	    switch ( ScalePermstruct->DiagScale ) {	      case NOEQUIL:		break;	      case ROW:		irow = fst_row;		for (j = 0; j < m_loc; ++j) {		    for (i = rowptr[j]; i < rowptr[j+1]; ++i) {                        zd_mult(&a[i], &a[i], R[irow]); /* Scale rows */		    }		    ++irow;

⌨️ 快捷键说明

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