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

📄 pdgssvx.c.bak

📁 LU分解求解矩阵方程组的解
💻 BAK
📖 第 1 页 / 共 4 页
字号:
#include <math.h>#include "superlu_ddefs.h"voidpdgssvx(superlu_options_t *options, SuperMatrix *A, 	ScalePermstruct_t *ScalePermstruct,	double B[], int ldb, int nrhs, gridinfo_t *grid,	LUstruct_t *LUstruct, SOLVEstruct_t *SOLVEstruct, double *berr,	SuperLUStat_t *stat, int *info){/*  * -- Distributed SuperLU routine (version 2.0) -- * Lawrence Berkeley National Lab, Univ. of California Berkeley. * March 15, 2003 * * * Purpose * ======= * * PDGSSVX solves a system of linear equations A*X=B, * by using Gaussian elimination with "static pivoting" to * compute the LU factorization of A. * * Static pivoting is a technique that combines the numerical stability * of partial pivoting with the scalability of Cholesky (no pivoting), * to run accurately and efficiently on large numbers of processors. * See our paper at http://www.nersc.gov/~xiaoye/SuperLU/ for a detailed * description of the parallel algorithms. * * The input matrices A and B are distributed by block rows. * Here is a graphical illustration (0-based indexing): * *                        A                B *               0 ---------------       ------ *                   |           |        |  | *                   |           |   P0   |  | *                   |           |        |  | *                 ---------------       ------ *        - fst_row->|           |        |  | *        |          |           |        |  | *       m_loc       |           |   P1   |  | *        |          |           |        |  | *        -          |           |        |  | *                 ---------------       ------ *                   |    .      |        |. | *                   |    .      |        |. | *                   |    .      |        |. | *                 ---------------       ------ *  * where, fst_row is the row number of the first row, *        m_loc is the number of rows local to this processor * These are defined in the 'SuperMatrix' structure, see supermatrix.h. * * * Here are the options for using this code: * *   1. Independent of all the other options specified below, the *      user must supply * *      -  B, the matrix of right-hand sides, distributed by block rows, *            and its dimensions ldb (local) and nrhs (global) *      -  grid, a structure describing the 2D processor mesh *      -  options->IterRefine, which determines whether or not to *            improve the accuracy of the computed solution using  *            iterative refinement * *      On output, B is overwritten with the solution X. * *   2. Depending on options->Fact, the user has four options *      for solving A*X=B. The standard option is for factoring *      A "from scratch". (The other options, described below, *      are used when A is sufficiently similar to a previously  *      solved problem to save time by reusing part or all of  *      the previous factorization.) * *      -  options->Fact = DOFACT: A is factored "from scratch" * *      In this case the user must also supply * *        o  A, the input matrix * *        as well as the following options to determine what matrix to *        factorize. * *        o  options->Equil,   to specify how to scale the rows and columns *                             of A to "equilibrate" it (to try to reduce its *                             condition number and so improve the *                             accuracy of the computed solution) * *        o  options->RowPerm, to specify how to permute the rows of A *                             (typically to control numerical stability) * *        o  options->ColPerm, to specify how to permute the columns of A *                             (typically to control fill-in and enhance *                             parallelism during factorization) * *        o  options->ReplaceTinyPivot, to specify how to deal with tiny *                             pivots encountered during factorization *                             (to control numerical stability) * *      The outputs returned include *          *        o  ScalePermstruct,  modified to describe how the input matrix A *                             was equilibrated and permuted: *          .  ScalePermstruct->DiagScale, indicates whether the rows and/or *                                         columns of A were scaled *          .  ScalePermstruct->R, array of row scale factors *          .  ScalePermstruct->C, array of column scale factors *          .  ScalePermstruct->perm_r, row permutation vector *          .  ScalePermstruct->perm_c, column permutation vector * *          (part of ScalePermstruct may also need to be supplied on input, *           depending on options->RowPerm and options->ColPerm as described  *           later). * *        o  A, the input matrix A overwritten by the scaled and permuted *              matrix diag(R)*A*diag(C)*Pc^T, where  *              Pc is the row permutation matrix determined by *                  ScalePermstruct->perm_c *              diag(R) and diag(C) are diagonal scaling matrices determined *                  by ScalePermstruct->DiagScale, ScalePermstruct->R and  *                  ScalePermstruct->C * *        o  LUstruct, which contains the L and U factorization of A1 where * *                A1 = Pc*Pr*diag(R)*A*diag(C)*Pc^T = L*U * *               (Note that A1 = Pc*Pr*Aout, where Aout is the matrix stored *                in A on output.) * *   3. The second value of options->Fact assumes that a matrix with the same *      sparsity pattern as A has already been factored: *      *      -  options->Fact = SamePattern: A is factored, assuming that it has *            the same nonzero pattern as a previously factored matrix. In *            this case the algorithm saves time by reusing the previously *            computed column permutation vector stored in *            ScalePermstruct->perm_c and the "elimination tree" of A *            stored in LUstruct->etree * *      In this case the user must still specify the following options *      as before: * *        o  options->Equil *        o  options->RowPerm *        o  options->ReplaceTinyPivot * *      but not options->ColPerm, whose value is ignored. This is because the *      previous column permutation from ScalePermstruct->perm_c is used as *      input. The user must also supply  * *        o  A, the input matrix *        o  ScalePermstruct->perm_c, the column permutation *        o  LUstruct->etree, the elimination tree * *      The outputs returned include *          *        o  A, the input matrix A overwritten by the scaled and permuted *              matrix as described above *        o  ScalePermstruct, modified to describe how the input matrix A was *                            equilibrated and row permuted *        o  LUstruct, modified to contain the new L and U factors * *   4. The third value of options->Fact assumes that a matrix B with the same *      sparsity pattern as A has already been factored, and where the *      row permutation of B can be reused for A. This is useful when A and B *      have similar numerical values, so that the same row permutation *      will make both factorizations numerically stable. This lets us reuse *      all of the previously computed structure of L and U. * *      -  options->Fact = SamePattern_SameRowPerm: A is factored, *            assuming not only the same nonzero pattern as the previously *            factored matrix B, but reusing B's row permutation. * *      In this case the user must still specify the following options *      as before: * *        o  options->Equil *        o  options->ReplaceTinyPivot * *      but not options->RowPerm or options->ColPerm, whose values are *      ignored. This is because the permutations from ScalePermstruct->perm_r *      and ScalePermstruct->perm_c are used as input. * *      The user must also supply  * *        o  A, the input matrix *        o  ScalePermstruct->DiagScale, how the previous matrix was row *                                       and/or column scaled *        o  ScalePermstruct->R, the row scalings of the previous matrix, *                               if any *        o  ScalePermstruct->C, the columns scalings of the previous matrix,  *                               if any *        o  ScalePermstruct->perm_r, the row permutation of the previous *                                    matrix *        o  ScalePermstruct->perm_c, the column permutation of the previous  *                                    matrix *        o  all of LUstruct, the previously computed information about *                            L and U (the actual numerical values of L and U *                            stored in LUstruct->Llu are ignored) * *      The outputs returned include *          *        o  A, the input matrix A overwritten by the scaled and permuted *              matrix as described above *        o  ScalePermstruct,  modified to describe how the input matrix A was *                             equilibrated (thus ScalePermstruct->DiagScale, *                             R and C may be modified) *        o  LUstruct, modified to contain the new L and U factors * *   5. The fourth and last value of options->Fact assumes that A is *      identical to a matrix that has already been factored on a previous  *      call, and reuses its entire LU factorization * *      -  options->Fact = Factored: A is identical to a previously *            factorized matrix, so the entire previous factorization *            can be reused. * *      In this case all the other options mentioned above are ignored *      (options->Equil, options->RowPerm, options->ColPerm,  *       options->ReplaceTinyPivot) * *      The user must also supply  * *        o  A, the unfactored matrix, only in the case that iterative *              refinment is to be done (specifically A must be the output *              A from the previous call, so that it has been scaled and permuted) *        o  all of ScalePermstruct *        o  all of LUstruct, including the actual numerical values of *           L and U * *      all of which are unmodified on output. *          * Arguments * ========= * * options (input) superlu_options_t* (global) *         The structure defines the input parameters to control *         how the LU decomposition will be performed. *         The following fields should be defined for this structure: *          *         o Fact (fact_t) *           Specifies whether or not the factored form of the matrix *           A is supplied on entry, and if not, how the matrix A should *           be factorized based on the previous history. * *           = DOFACT: The matrix A will be factorized from scratch. *                 Inputs:  A *                          options->Equil, RowPerm, ColPerm, ReplaceTinyPivot *                 Outputs: modified A *                             (possibly row and/or column scaled and/or  *                              permuted) *                          all of ScalePermstruct *                          all of LUstruct * *           = SamePattern: the matrix A will be factorized assuming *             that a factorization of a matrix with the same sparsity *             pattern was performed prior to this one. Therefore, this *             factorization will reuse column permutation vector  *             ScalePermstruct->perm_c and the elimination tree *             LUstruct->etree *                 Inputs:  A *                          options->Equil, RowPerm, ReplaceTinyPivot *                          ScalePermstruct->perm_c *                          LUstruct->etree *                 Outputs: modified A *                             (possibly row and/or column scaled and/or  *                              permuted) *                          rest of ScalePermstruct (DiagScale, R, C, perm_r) *                          rest of LUstruct (GLU_persist, Llu) * *           = SamePattern_SameRowPerm: the matrix A will be factorized *             assuming that a factorization of a matrix with the same *             sparsity	pattern and similar numerical values was performed *             prior to this one. Therefore, this factorization will reuse *             both row and column scaling factors R and C, and the *             both row and column permutation vectors perm_r and perm_c, *             distributed data structure set up from the previous symbolic *             factorization. *                 Inputs:  A *                          options->Equil, ReplaceTinyPivot *                          all of ScalePermstruct *                          all of LUstruct *                 Outputs: modified A *                             (possibly row and/or column scaled and/or  *                              permuted) *                          modified LUstruct->Llu *           = FACTORED: the matrix A is already factored. *                 Inputs:  all of ScalePermstruct *                          all of LUstruct * *         o Equil (yes_no_t) *           Specifies whether to equilibrate the system. *           = NO:  no equilibration. *           = YES: scaling factors are computed to equilibrate the system: *                      diag(R)*A*diag(C)*inv(diag(C))*X = diag(R)*B. *                  Whether or not the system will be equilibrated depends

⌨️ 快捷键说明

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