File:  [local] / rpl / lapack / lapack / zgesvxx.f
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Sat Aug 7 13:22:32 2010 UTC (13 years, 9 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Mise à jour globale de Lapack 3.2.2.

    1:       SUBROUTINE ZGESVXX( FACT, TRANS, N, NRHS, A, LDA, AF, LDAF, IPIV,
    2:      $                    EQUED, R, C, B, LDB, X, LDX, RCOND, RPVGRW,
    3:      $                    BERR, N_ERR_BNDS, ERR_BNDS_NORM,
    4:      $                    ERR_BNDS_COMP, NPARAMS, PARAMS, WORK, RWORK,
    5:      $                    INFO )
    6: *
    7: *     -- LAPACK driver routine (version 3.2.1)                          --
    8: *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
    9: *     -- Jason Riedy of Univ. of California Berkeley.                 --
   10: *     -- April 2009                                                   --
   11: *
   12: *     -- LAPACK is a software package provided by Univ. of Tennessee, --
   13: *     -- Univ. of California Berkeley and NAG Ltd.                    --
   14: *
   15:       IMPLICIT NONE
   16: *     ..
   17: *     .. Scalar Arguments ..
   18:       CHARACTER          EQUED, FACT, TRANS
   19:       INTEGER            INFO, LDA, LDAF, LDB, LDX, N, NRHS, NPARAMS,
   20:      $                   N_ERR_BNDS
   21:       DOUBLE PRECISION   RCOND, RPVGRW
   22: *     ..
   23: *     .. Array Arguments ..
   24:       INTEGER            IPIV( * )
   25:       COMPLEX*16         A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
   26:      $                   X( LDX , * ),WORK( * )
   27:       DOUBLE PRECISION   R( * ), C( * ), PARAMS( * ), BERR( * ),
   28:      $                   ERR_BNDS_NORM( NRHS, * ),
   29:      $                   ERR_BNDS_COMP( NRHS, * ), RWORK( * )
   30: *     ..
   31: *
   32: *     Purpose
   33: *     =======
   34: *
   35: *     ZGESVXX uses the LU factorization to compute the solution to a
   36: *     complex*16 system of linear equations  A * X = B,  where A is an
   37: *     N-by-N matrix and X and B are N-by-NRHS matrices.
   38: *
   39: *     If requested, both normwise and maximum componentwise error bounds
   40: *     are returned. ZGESVXX will return a solution with a tiny
   41: *     guaranteed error (O(eps) where eps is the working machine
   42: *     precision) unless the matrix is very ill-conditioned, in which
   43: *     case a warning is returned. Relevant condition numbers also are
   44: *     calculated and returned.
   45: *
   46: *     ZGESVXX accepts user-provided factorizations and equilibration
   47: *     factors; see the definitions of the FACT and EQUED options.
   48: *     Solving with refinement and using a factorization from a previous
   49: *     ZGESVXX call will also produce a solution with either O(eps)
   50: *     errors or warnings, but we cannot make that claim for general
   51: *     user-provided factorizations and equilibration factors if they
   52: *     differ from what ZGESVXX would itself produce.
   53: *
   54: *     Description
   55: *     ===========
   56: *
   57: *     The following steps are performed:
   58: *
   59: *     1. If FACT = 'E', double precision scaling factors are computed to equilibrate
   60: *     the system:
   61: *
   62: *       TRANS = 'N':  diag(R)*A*diag(C)     *inv(diag(C))*X = diag(R)*B
   63: *       TRANS = 'T': (diag(R)*A*diag(C))**T *inv(diag(R))*X = diag(C)*B
   64: *       TRANS = 'C': (diag(R)*A*diag(C))**H *inv(diag(R))*X = diag(C)*B
   65: *
   66: *     Whether or not the system will be equilibrated depends on the
   67: *     scaling of the matrix A, but if equilibration is used, A is
   68: *     overwritten by diag(R)*A*diag(C) and B by diag(R)*B (if TRANS='N')
   69: *     or diag(C)*B (if TRANS = 'T' or 'C').
   70: *
   71: *     2. If FACT = 'N' or 'E', the LU decomposition is used to factor
   72: *     the matrix A (after equilibration if FACT = 'E') as
   73: *
   74: *       A = P * L * U,
   75: *
   76: *     where P is a permutation matrix, L is a unit lower triangular
   77: *     matrix, and U is upper triangular.
   78: *
   79: *     3. If some U(i,i)=0, so that U is exactly singular, then the
   80: *     routine returns with INFO = i. Otherwise, the factored form of A
   81: *     is used to estimate the condition number of the matrix A (see
   82: *     argument RCOND). If the reciprocal of the condition number is less
   83: *     than machine precision, the routine still goes on to solve for X
   84: *     and compute error bounds as described below.
   85: *
   86: *     4. The system of equations is solved for X using the factored form
   87: *     of A.
   88: *
   89: *     5. By default (unless PARAMS(LA_LINRX_ITREF_I) is set to zero),
   90: *     the routine will use iterative refinement to try to get a small
   91: *     error and error bounds.  Refinement calculates the residual to at
   92: *     least twice the working precision.
   93: *
   94: *     6. If equilibration was used, the matrix X is premultiplied by
   95: *     diag(C) (if TRANS = 'N') or diag(R) (if TRANS = 'T' or 'C') so
   96: *     that it solves the original system before equilibration.
   97: *
   98: *     Arguments
   99: *     =========
  100: *
  101: *     Some optional parameters are bundled in the PARAMS array.  These
  102: *     settings determine how refinement is performed, but often the
  103: *     defaults are acceptable.  If the defaults are acceptable, users
  104: *     can pass NPARAMS = 0 which prevents the source code from accessing
  105: *     the PARAMS argument.
  106: *
  107: *     FACT    (input) CHARACTER*1
  108: *     Specifies whether or not the factored form of the matrix A is
  109: *     supplied on entry, and if not, whether the matrix A should be
  110: *     equilibrated before it is factored.
  111: *       = 'F':  On entry, AF and IPIV contain the factored form of A.
  112: *               If EQUED is not 'N', the matrix A has been
  113: *               equilibrated with scaling factors given by R and C.
  114: *               A, AF, and IPIV are not modified.
  115: *       = 'N':  The matrix A will be copied to AF and factored.
  116: *       = 'E':  The matrix A will be equilibrated if necessary, then
  117: *               copied to AF and factored.
  118: *
  119: *     TRANS   (input) CHARACTER*1
  120: *     Specifies the form of the system of equations:
  121: *       = 'N':  A * X = B     (No transpose)
  122: *       = 'T':  A**T * X = B  (Transpose)
  123: *       = 'C':  A**H * X = B  (Conjugate Transpose)
  124: *
  125: *     N       (input) INTEGER
  126: *     The number of linear equations, i.e., the order of the
  127: *     matrix A.  N >= 0.
  128: *
  129: *     NRHS    (input) INTEGER
  130: *     The number of right hand sides, i.e., the number of columns
  131: *     of the matrices B and X.  NRHS >= 0.
  132: *
  133: *     A       (input/output) COMPLEX*16 array, dimension (LDA,N)
  134: *     On entry, the N-by-N matrix A.  If FACT = 'F' and EQUED is
  135: *     not 'N', then A must have been equilibrated by the scaling
  136: *     factors in R and/or C.  A is not modified if FACT = 'F' or
  137: *     'N', or if FACT = 'E' and EQUED = 'N' on exit.
  138: *
  139: *     On exit, if EQUED .ne. 'N', A is scaled as follows:
  140: *     EQUED = 'R':  A := diag(R) * A
  141: *     EQUED = 'C':  A := A * diag(C)
  142: *     EQUED = 'B':  A := diag(R) * A * diag(C).
  143: *
  144: *     LDA     (input) INTEGER
  145: *     The leading dimension of the array A.  LDA >= max(1,N).
  146: *
  147: *     AF      (input or output) COMPLEX*16 array, dimension (LDAF,N)
  148: *     If FACT = 'F', then AF is an input argument and on entry
  149: *     contains the factors L and U from the factorization
  150: *     A = P*L*U as computed by ZGETRF.  If EQUED .ne. 'N', then
  151: *     AF is the factored form of the equilibrated matrix A.
  152: *
  153: *     If FACT = 'N', then AF is an output argument and on exit
  154: *     returns the factors L and U from the factorization A = P*L*U
  155: *     of the original matrix A.
  156: *
  157: *     If FACT = 'E', then AF is an output argument and on exit
  158: *     returns the factors L and U from the factorization A = P*L*U
  159: *     of the equilibrated matrix A (see the description of A for
  160: *     the form of the equilibrated matrix).
  161: *
  162: *     LDAF    (input) INTEGER
  163: *     The leading dimension of the array AF.  LDAF >= max(1,N).
  164: *
  165: *     IPIV    (input or output) INTEGER array, dimension (N)
  166: *     If FACT = 'F', then IPIV is an input argument and on entry
  167: *     contains the pivot indices from the factorization A = P*L*U
  168: *     as computed by ZGETRF; row i of the matrix was interchanged
  169: *     with row IPIV(i).
  170: *
  171: *     If FACT = 'N', then IPIV is an output argument and on exit
  172: *     contains the pivot indices from the factorization A = P*L*U
  173: *     of the original matrix A.
  174: *
  175: *     If FACT = 'E', then IPIV is an output argument and on exit
  176: *     contains the pivot indices from the factorization A = P*L*U
  177: *     of the equilibrated matrix A.
  178: *
  179: *     EQUED   (input or output) CHARACTER*1
  180: *     Specifies the form of equilibration that was done.
  181: *       = 'N':  No equilibration (always true if FACT = 'N').
  182: *       = 'R':  Row equilibration, i.e., A has been premultiplied by
  183: *               diag(R).
  184: *       = 'C':  Column equilibration, i.e., A has been postmultiplied
  185: *               by diag(C).
  186: *       = 'B':  Both row and column equilibration, i.e., A has been
  187: *               replaced by diag(R) * A * diag(C).
  188: *     EQUED is an input argument if FACT = 'F'; otherwise, it is an
  189: *     output argument.
  190: *
  191: *     R       (input or output) DOUBLE PRECISION array, dimension (N)
  192: *     The row scale factors for A.  If EQUED = 'R' or 'B', A is
  193: *     multiplied on the left by diag(R); if EQUED = 'N' or 'C', R
  194: *     is not accessed.  R is an input argument if FACT = 'F';
  195: *     otherwise, R is an output argument.  If FACT = 'F' and
  196: *     EQUED = 'R' or 'B', each element of R must be positive.
  197: *     If R is output, each element of R is a power of the radix.
  198: *     If R is input, each element of R should be a power of the radix
  199: *     to ensure a reliable solution and error estimates. Scaling by
  200: *     powers of the radix does not cause rounding errors unless the
  201: *     result underflows or overflows. Rounding errors during scaling
  202: *     lead to refining with a matrix that is not equivalent to the
  203: *     input matrix, producing error estimates that may not be
  204: *     reliable.
  205: *
  206: *     C       (input or output) DOUBLE PRECISION array, dimension (N)
  207: *     The column scale factors for A.  If EQUED = 'C' or 'B', A is
  208: *     multiplied on the right by diag(C); if EQUED = 'N' or 'R', C
  209: *     is not accessed.  C is an input argument if FACT = 'F';
  210: *     otherwise, C is an output argument.  If FACT = 'F' and
  211: *     EQUED = 'C' or 'B', each element of C must be positive.
  212: *     If C is output, each element of C is a power of the radix.
  213: *     If C is input, each element of C should be a power of the radix
  214: *     to ensure a reliable solution and error estimates. Scaling by
  215: *     powers of the radix does not cause rounding errors unless the
  216: *     result underflows or overflows. Rounding errors during scaling
  217: *     lead to refining with a matrix that is not equivalent to the
  218: *     input matrix, producing error estimates that may not be
  219: *     reliable.
  220: *
  221: *     B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
  222: *     On entry, the N-by-NRHS right hand side matrix B.
  223: *     On exit,
  224: *     if EQUED = 'N', B is not modified;
  225: *     if TRANS = 'N' and EQUED = 'R' or 'B', B is overwritten by
  226: *        diag(R)*B;
  227: *     if TRANS = 'T' or 'C' and EQUED = 'C' or 'B', B is
  228: *        overwritten by diag(C)*B.
  229: *
  230: *     LDB     (input) INTEGER
  231: *     The leading dimension of the array B.  LDB >= max(1,N).
  232: *
  233: *     X       (output) COMPLEX*16 array, dimension (LDX,NRHS)
  234: *     If INFO = 0, the N-by-NRHS solution matrix X to the original
  235: *     system of equations.  Note that A and B are modified on exit
  236: *     if EQUED .ne. 'N', and the solution to the equilibrated system is
  237: *     inv(diag(C))*X if TRANS = 'N' and EQUED = 'C' or 'B', or
  238: *     inv(diag(R))*X if TRANS = 'T' or 'C' and EQUED = 'R' or 'B'.
  239: *
  240: *     LDX     (input) INTEGER
  241: *     The leading dimension of the array X.  LDX >= max(1,N).
  242: *
  243: *     RCOND   (output) DOUBLE PRECISION
  244: *     Reciprocal scaled condition number.  This is an estimate of the
  245: *     reciprocal Skeel condition number of the matrix A after
  246: *     equilibration (if done).  If this is less than the machine
  247: *     precision (in particular, if it is zero), the matrix is singular
  248: *     to working precision.  Note that the error may still be small even
  249: *     if this number is very small and the matrix appears ill-
  250: *     conditioned.
  251: *
  252: *     RPVGRW  (output) DOUBLE PRECISION
  253: *     Reciprocal pivot growth.  On exit, this contains the reciprocal
  254: *     pivot growth factor norm(A)/norm(U). The "max absolute element"
  255: *     norm is used.  If this is much less than 1, then the stability of
  256: *     the LU factorization of the (equilibrated) matrix A could be poor.
  257: *     This also means that the solution X, estimated condition numbers,
  258: *     and error bounds could be unreliable. If factorization fails with
  259: *     0<INFO<=N, then this contains the reciprocal pivot growth factor
  260: *     for the leading INFO columns of A.  In ZGESVX, this quantity is
  261: *     returned in WORK(1).
  262: *
  263: *     BERR    (output) DOUBLE PRECISION array, dimension (NRHS)
  264: *     Componentwise relative backward error.  This is the
  265: *     componentwise relative backward error of each solution vector X(j)
  266: *     (i.e., the smallest relative change in any element of A or B that
  267: *     makes X(j) an exact solution).
  268: *
  269: *     N_ERR_BNDS (input) INTEGER
  270: *     Number of error bounds to return for each right hand side
  271: *     and each type (normwise or componentwise).  See ERR_BNDS_NORM and
  272: *     ERR_BNDS_COMP below.
  273: *
  274: *     ERR_BNDS_NORM  (output) DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS)
  275: *     For each right-hand side, this array contains information about
  276: *     various error bounds and condition numbers corresponding to the
  277: *     normwise relative error, which is defined as follows:
  278: *
  279: *     Normwise relative error in the ith solution vector:
  280: *             max_j (abs(XTRUE(j,i) - X(j,i)))
  281: *            ------------------------------
  282: *                  max_j abs(X(j,i))
  283: *
  284: *     The array is indexed by the type of error information as described
  285: *     below. There currently are up to three pieces of information
  286: *     returned.
  287: *
  288: *     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
  289: *     right-hand side.
  290: *
  291: *     The second index in ERR_BNDS_NORM(:,err) contains the following
  292: *     three fields:
  293: *     err = 1 "Trust/don't trust" boolean. Trust the answer if the
  294: *              reciprocal condition number is less than the threshold
  295: *              sqrt(n) * dlamch('Epsilon').
  296: *
  297: *     err = 2 "Guaranteed" error bound: The estimated forward error,
  298: *              almost certainly within a factor of 10 of the true error
  299: *              so long as the next entry is greater than the threshold
  300: *              sqrt(n) * dlamch('Epsilon'). This error bound should only
  301: *              be trusted if the previous boolean is true.
  302: *
  303: *     err = 3  Reciprocal condition number: Estimated normwise
  304: *              reciprocal condition number.  Compared with the threshold
  305: *              sqrt(n) * dlamch('Epsilon') to determine if the error
  306: *              estimate is "guaranteed". These reciprocal condition
  307: *              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
  308: *              appropriately scaled matrix Z.
  309: *              Let Z = S*A, where S scales each row by a power of the
  310: *              radix so all absolute row sums of Z are approximately 1.
  311: *
  312: *     See Lapack Working Note 165 for further details and extra
  313: *     cautions.
  314: *
  315: *     ERR_BNDS_COMP  (output) DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS)
  316: *     For each right-hand side, this array contains information about
  317: *     various error bounds and condition numbers corresponding to the
  318: *     componentwise relative error, which is defined as follows:
  319: *
  320: *     Componentwise relative error in the ith solution vector:
  321: *                    abs(XTRUE(j,i) - X(j,i))
  322: *             max_j ----------------------
  323: *                         abs(X(j,i))
  324: *
  325: *     The array is indexed by the right-hand side i (on which the
  326: *     componentwise relative error depends), and the type of error
  327: *     information as described below. There currently are up to three
  328: *     pieces of information returned for each right-hand side. If
  329: *     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
  330: *     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
  331: *     the first (:,N_ERR_BNDS) entries are returned.
  332: *
  333: *     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
  334: *     right-hand side.
  335: *
  336: *     The second index in ERR_BNDS_COMP(:,err) contains the following
  337: *     three fields:
  338: *     err = 1 "Trust/don't trust" boolean. Trust the answer if the
  339: *              reciprocal condition number is less than the threshold
  340: *              sqrt(n) * dlamch('Epsilon').
  341: *
  342: *     err = 2 "Guaranteed" error bound: The estimated forward error,
  343: *              almost certainly within a factor of 10 of the true error
  344: *              so long as the next entry is greater than the threshold
  345: *              sqrt(n) * dlamch('Epsilon'). This error bound should only
  346: *              be trusted if the previous boolean is true.
  347: *
  348: *     err = 3  Reciprocal condition number: Estimated componentwise
  349: *              reciprocal condition number.  Compared with the threshold
  350: *              sqrt(n) * dlamch('Epsilon') to determine if the error
  351: *              estimate is "guaranteed". These reciprocal condition
  352: *              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
  353: *              appropriately scaled matrix Z.
  354: *              Let Z = S*(A*diag(x)), where x is the solution for the
  355: *              current right-hand side and S scales each row of
  356: *              A*diag(x) by a power of the radix so all absolute row
  357: *              sums of Z are approximately 1.
  358: *
  359: *     See Lapack Working Note 165 for further details and extra
  360: *     cautions.
  361: *
  362: *     NPARAMS (input) INTEGER
  363: *     Specifies the number of parameters set in PARAMS.  If .LE. 0, the
  364: *     PARAMS array is never referenced and default values are used.
  365: *
  366: *     PARAMS  (input / output) DOUBLE PRECISION array, dimension NPARAMS
  367: *     Specifies algorithm parameters.  If an entry is .LT. 0.0, then
  368: *     that entry will be filled with default value used for that
  369: *     parameter.  Only positions up to NPARAMS are accessed; defaults
  370: *     are used for higher-numbered parameters.
  371: *
  372: *       PARAMS(LA_LINRX_ITREF_I = 1) : Whether to perform iterative
  373: *            refinement or not.
  374: *         Default: 1.0D+0
  375: *            = 0.0 : No refinement is performed, and no error bounds are
  376: *                    computed.
  377: *            = 1.0 : Use the extra-precise refinement algorithm.
  378: *              (other values are reserved for future use)
  379: *
  380: *       PARAMS(LA_LINRX_ITHRESH_I = 2) : Maximum number of residual
  381: *            computations allowed for refinement.
  382: *         Default: 10
  383: *         Aggressive: Set to 100 to permit convergence using approximate
  384: *                     factorizations or factorizations other than LU. If
  385: *                     the factorization uses a technique other than
  386: *                     Gaussian elimination, the guarantees in
  387: *                     err_bnds_norm and err_bnds_comp may no longer be
  388: *                     trustworthy.
  389: *
  390: *       PARAMS(LA_LINRX_CWISE_I = 3) : Flag determining if the code
  391: *            will attempt to find a solution with small componentwise
  392: *            relative error in the double-precision algorithm.  Positive
  393: *            is true, 0.0 is false.
  394: *         Default: 1.0 (attempt componentwise convergence)
  395: *
  396: *     WORK    (workspace) COMPLEX*16 array, dimension (2*N)
  397: *
  398: *     RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N)
  399: *
  400: *     INFO    (output) INTEGER
  401: *       = 0:  Successful exit. The solution to every right-hand side is
  402: *         guaranteed.
  403: *       < 0:  If INFO = -i, the i-th argument had an illegal value
  404: *       > 0 and <= N:  U(INFO,INFO) is exactly zero.  The factorization
  405: *         has been completed, but the factor U is exactly singular, so
  406: *         the solution and error bounds could not be computed. RCOND = 0
  407: *         is returned.
  408: *       = N+J: The solution corresponding to the Jth right-hand side is
  409: *         not guaranteed. The solutions corresponding to other right-
  410: *         hand sides K with K > J may not be guaranteed as well, but
  411: *         only the first such right-hand side is reported. If a small
  412: *         componentwise error is not requested (PARAMS(3) = 0.0) then
  413: *         the Jth right-hand side is the first with a normwise error
  414: *         bound that is not guaranteed (the smallest J such
  415: *         that ERR_BNDS_NORM(J,1) = 0.0). By default (PARAMS(3) = 1.0)
  416: *         the Jth right-hand side is the first with either a normwise or
  417: *         componentwise error bound that is not guaranteed (the smallest
  418: *         J such that either ERR_BNDS_NORM(J,1) = 0.0 or
  419: *         ERR_BNDS_COMP(J,1) = 0.0). See the definition of
  420: *         ERR_BNDS_NORM(:,1) and ERR_BNDS_COMP(:,1). To get information
  421: *         about all of the right-hand sides check ERR_BNDS_NORM or
  422: *         ERR_BNDS_COMP.
  423: *
  424: *     ==================================================================
  425: *
  426: *     .. Parameters ..
  427:       DOUBLE PRECISION   ZERO, ONE
  428:       PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
  429:       INTEGER            FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
  430:       INTEGER            RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
  431:       INTEGER            CMP_ERR_I, PIV_GROWTH_I
  432:       PARAMETER          ( FINAL_NRM_ERR_I = 1, FINAL_CMP_ERR_I = 2,
  433:      $                   BERR_I = 3 )
  434:       PARAMETER          ( RCOND_I = 4, NRM_RCOND_I = 5, NRM_ERR_I = 6 )
  435:       PARAMETER          ( CMP_RCOND_I = 7, CMP_ERR_I = 8,
  436:      $                   PIV_GROWTH_I = 9 )
  437: *     ..
  438: *     .. Local Scalars ..
  439:       LOGICAL            COLEQU, EQUIL, NOFACT, NOTRAN, ROWEQU
  440:       INTEGER            INFEQU, J
  441:       DOUBLE PRECISION   AMAX, BIGNUM, COLCND, RCMAX, RCMIN,
  442:      $                   ROWCND, SMLNUM
  443: *     ..
  444: *     .. External Functions ..
  445:       EXTERNAL           LSAME, DLAMCH, ZLA_RPVGRW
  446:       LOGICAL            LSAME
  447:       DOUBLE PRECISION   DLAMCH, ZLA_RPVGRW
  448: *     ..
  449: *     .. External Subroutines ..
  450:       EXTERNAL           ZGEEQUB, ZGETRF, ZGETRS, ZLACPY, ZLAQGE,
  451:      $                   XERBLA, ZLASCL2, ZGERFSX
  452: *     ..
  453: *     .. Intrinsic Functions ..
  454:       INTRINSIC          MAX, MIN
  455: *     ..
  456: *     .. Executable Statements ..
  457: *
  458:       INFO = 0
  459:       NOFACT = LSAME( FACT, 'N' )
  460:       EQUIL = LSAME( FACT, 'E' )
  461:       NOTRAN = LSAME( TRANS, 'N' )
  462:       SMLNUM = DLAMCH( 'Safe minimum' )
  463:       BIGNUM = ONE / SMLNUM
  464:       IF( NOFACT .OR. EQUIL ) THEN
  465:          EQUED = 'N'
  466:          ROWEQU = .FALSE.
  467:          COLEQU = .FALSE.
  468:       ELSE
  469:          ROWEQU = LSAME( EQUED, 'R' ) .OR. LSAME( EQUED, 'B' )
  470:          COLEQU = LSAME( EQUED, 'C' ) .OR. LSAME( EQUED, 'B' )
  471:       END IF
  472: *
  473: *     Default is failure.  If an input parameter is wrong or
  474: *     factorization fails, make everything look horrible.  Only the
  475: *     pivot growth is set here, the rest is initialized in ZGERFSX.
  476: *
  477:       RPVGRW = ZERO
  478: *
  479: *     Test the input parameters.  PARAMS is not tested until ZGERFSX.
  480: *
  481:       IF( .NOT.NOFACT .AND. .NOT.EQUIL .AND. .NOT.
  482:      $     LSAME( FACT, 'F' ) ) THEN
  483:          INFO = -1
  484:       ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
  485:      $        LSAME( TRANS, 'C' ) ) THEN
  486:          INFO = -2
  487:       ELSE IF( N.LT.0 ) THEN
  488:          INFO = -3
  489:       ELSE IF( NRHS.LT.0 ) THEN
  490:          INFO = -4
  491:       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
  492:          INFO = -6
  493:       ELSE IF( LDAF.LT.MAX( 1, N ) ) THEN
  494:          INFO = -8
  495:       ELSE IF( LSAME( FACT, 'F' ) .AND. .NOT.
  496:      $        ( ROWEQU .OR. COLEQU .OR. LSAME( EQUED, 'N' ) ) ) THEN
  497:          INFO = -10
  498:       ELSE
  499:          IF( ROWEQU ) THEN
  500:             RCMIN = BIGNUM
  501:             RCMAX = ZERO
  502:             DO 10 J = 1, N
  503:                RCMIN = MIN( RCMIN, R( J ) )
  504:                RCMAX = MAX( RCMAX, R( J ) )
  505:  10         CONTINUE
  506:             IF( RCMIN.LE.ZERO ) THEN
  507:                INFO = -11
  508:             ELSE IF( N.GT.0 ) THEN
  509:                ROWCND = MAX( RCMIN, SMLNUM ) / MIN( RCMAX, BIGNUM )
  510:             ELSE
  511:                ROWCND = ONE
  512:             END IF
  513:          END IF
  514:          IF( COLEQU .AND. INFO.EQ.0 ) THEN
  515:             RCMIN = BIGNUM
  516:             RCMAX = ZERO
  517:             DO 20 J = 1, N
  518:                RCMIN = MIN( RCMIN, C( J ) )
  519:                RCMAX = MAX( RCMAX, C( J ) )
  520:  20         CONTINUE
  521:             IF( RCMIN.LE.ZERO ) THEN
  522:                INFO = -12
  523:             ELSE IF( N.GT.0 ) THEN
  524:                COLCND = MAX( RCMIN, SMLNUM ) / MIN( RCMAX, BIGNUM )
  525:             ELSE
  526:                COLCND = ONE
  527:             END IF
  528:          END IF
  529:          IF( INFO.EQ.0 ) THEN
  530:             IF( LDB.LT.MAX( 1, N ) ) THEN
  531:                INFO = -14
  532:             ELSE IF( LDX.LT.MAX( 1, N ) ) THEN
  533:                INFO = -16
  534:             END IF
  535:          END IF
  536:       END IF
  537: *
  538:       IF( INFO.NE.0 ) THEN
  539:          CALL XERBLA( 'ZGESVXX', -INFO )
  540:          RETURN
  541:       END IF
  542: *
  543:       IF( EQUIL ) THEN
  544: *
  545: *     Compute row and column scalings to equilibrate the matrix A.
  546: *
  547:          CALL ZGEEQUB( N, N, A, LDA, R, C, ROWCND, COLCND, AMAX,
  548:      $        INFEQU )
  549:          IF( INFEQU.EQ.0 ) THEN
  550: *
  551: *     Equilibrate the matrix.
  552: *
  553:             CALL ZLAQGE( N, N, A, LDA, R, C, ROWCND, COLCND, AMAX,
  554:      $           EQUED )
  555:             ROWEQU = LSAME( EQUED, 'R' ) .OR. LSAME( EQUED, 'B' )
  556:             COLEQU = LSAME( EQUED, 'C' ) .OR. LSAME( EQUED, 'B' )
  557:          END IF
  558: *
  559: *     If the scaling factors are not applied, set them to 1.0.
  560: *
  561:          IF ( .NOT.ROWEQU ) THEN
  562:             DO J = 1, N
  563:                R( J ) = 1.0D+0
  564:             END DO
  565:          END IF
  566:          IF ( .NOT.COLEQU ) THEN
  567:             DO J = 1, N
  568:                C( J ) = 1.0D+0
  569:             END DO
  570:          END IF
  571:       END IF
  572: *
  573: *     Scale the right-hand side.
  574: *
  575:       IF( NOTRAN ) THEN
  576:          IF( ROWEQU ) CALL ZLASCL2( N, NRHS, R, B, LDB )
  577:       ELSE
  578:          IF( COLEQU ) CALL ZLASCL2( N, NRHS, C, B, LDB )
  579:       END IF
  580: *
  581:       IF( NOFACT .OR. EQUIL ) THEN
  582: *
  583: *        Compute the LU factorization of A.
  584: *
  585:          CALL ZLACPY( 'Full', N, N, A, LDA, AF, LDAF )
  586:          CALL ZGETRF( N, N, AF, LDAF, IPIV, INFO )
  587: *
  588: *        Return if INFO is non-zero.
  589: *
  590:          IF( INFO.GT.0 ) THEN
  591: *
  592: *           Pivot in column INFO is exactly 0
  593: *           Compute the reciprocal pivot growth factor of the
  594: *           leading rank-deficient INFO columns of A.
  595: *
  596:             RPVGRW = ZLA_RPVGRW( N, INFO, A, LDA, AF, LDAF )
  597:             RETURN
  598:          END IF
  599:       END IF
  600: *
  601: *     Compute the reciprocal pivot growth factor RPVGRW.
  602: *
  603:       RPVGRW = ZLA_RPVGRW( N, N, A, LDA, AF, LDAF )
  604: *
  605: *     Compute the solution matrix X.
  606: *
  607:       CALL ZLACPY( 'Full', N, NRHS, B, LDB, X, LDX )
  608:       CALL ZGETRS( TRANS, N, NRHS, AF, LDAF, IPIV, X, LDX, INFO )
  609: *
  610: *     Use iterative refinement to improve the computed solution and
  611: *     compute error bounds and backward error estimates for it.
  612: *
  613:       CALL ZGERFSX( TRANS, EQUED, N, NRHS, A, LDA, AF, LDAF,
  614:      $     IPIV, R, C, B, LDB, X, LDX, RCOND, BERR,
  615:      $     N_ERR_BNDS, ERR_BNDS_NORM, ERR_BNDS_COMP, NPARAMS, PARAMS,
  616:      $     WORK, RWORK, INFO )
  617: *
  618: *     Scale solutions.
  619: *
  620:       IF ( COLEQU .AND. NOTRAN ) THEN
  621:          CALL ZLASCL2 ( N, NRHS, C, X, LDX )
  622:       ELSE IF ( ROWEQU .AND. .NOT.NOTRAN ) THEN
  623:          CALL ZLASCL2 ( N, NRHS, R, X, LDX )
  624:       END IF
  625: *
  626:       RETURN
  627: *
  628: *     End of ZGESVXX
  629: *
  630:       END

CVSweb interface <joel.bertrand@systella.fr>