Updated documentation for EPIR routines. Changed ERRS_{N,C} variable names. Other...
authordeaglanhalligan <deaglanhalligan@8a072113-8704-0410-8d35-dd094bca7971>
Wed, 8 Apr 2009 00:05:18 +0000 (00:05 +0000)
committerdeaglanhalligan <deaglanhalligan@8a072113-8704-0410-8d35-dd094bca7971>
Wed, 8 Apr 2009 00:05:18 +0000 (00:05 +0000)
100 files changed:
SRC/cgbrfsx.f
SRC/cgerfsx.f
SRC/cherfsx.f
SRC/chesvxx.f
SRC/cla_gbrcond_c.f
SRC/cla_gbrcond_x.f
SRC/cla_gbrfsx_extended.f
SRC/cla_gbrpvgrw.f
SRC/cla_gercond_c.f
SRC/cla_gercond_x.f
SRC/cla_gerfsx_extended.f
SRC/cla_hercond_c.f
SRC/cla_hercond_x.f
SRC/cla_herfsx_extended.f
SRC/cla_herpvgrw.f
SRC/cla_lin_berr.f
SRC/cla_porcond_c.f
SRC/cla_porcond_x.f
SRC/cla_porfsx_extended.f
SRC/cla_porpvgrw.f
SRC/cla_rpvgrw.f
SRC/cla_syrcond_c.f
SRC/cla_syrcond_x.f
SRC/cla_syrfsx_extended.f
SRC/cla_syrpvgrw.f
SRC/clarscl2.f
SRC/clascl2.f
SRC/cporfsx.f
SRC/csyrfsx.f
SRC/csysvxx.f
SRC/dgbrfsx.f
SRC/dgerfsx.f
SRC/dla_gbrcond.f
SRC/dla_gbrfsx_extended.f
SRC/dla_gbrpvgrw.f
SRC/dla_gercond.f
SRC/dla_gerfsx_extended.f
SRC/dla_lin_berr.f
SRC/dla_porcond.f
SRC/dla_porfsx_extended.f
SRC/dla_porpvgrw.f
SRC/dla_rpvgrw.f
SRC/dla_syrcond.f
SRC/dla_syrfsx_extended.f
SRC/dla_syrpvgrw.f
SRC/dlarscl2.f
SRC/dlascl2.f
SRC/dporfsx.f
SRC/dsyrfsx.f
SRC/dsysvxx.f
SRC/sgbrfsx.f
SRC/sgerfsx.f
SRC/sla_gbrcond.f
SRC/sla_gbrfsx_extended.f
SRC/sla_gbrpvgrw.f
SRC/sla_gercond.f
SRC/sla_gerfsx_extended.f
SRC/sla_lin_berr.f
SRC/sla_porcond.f
SRC/sla_porfsx_extended.f
SRC/sla_porpvgrw.f
SRC/sla_rpvgrw.f
SRC/sla_syrcond.f
SRC/sla_syrfsx_extended.f
SRC/sla_syrpvgrw.f
SRC/slarscl2.f
SRC/slascl2.f
SRC/sporfsx.f
SRC/ssyrfsx.f
SRC/ssysvxx.f
SRC/zgbrfsx.f
SRC/zgerfsx.f
SRC/zherfsx.f
SRC/zhesvxx.f
SRC/zla_gbrcond_c.f
SRC/zla_gbrcond_x.f
SRC/zla_gbrfsx_extended.f
SRC/zla_gbrpvgrw.f
SRC/zla_gercond_c.f
SRC/zla_gercond_x.f
SRC/zla_gerfsx_extended.f
SRC/zla_hercond_c.f
SRC/zla_hercond_x.f
SRC/zla_herfsx_extended.f
SRC/zla_herpvgrw.f
SRC/zla_lin_berr.f
SRC/zla_porcond_c.f
SRC/zla_porcond_x.f
SRC/zla_porfsx_extended.f
SRC/zla_porpvgrw.f
SRC/zla_rpvgrw.f
SRC/zla_syrcond_c.f
SRC/zla_syrcond_x.f
SRC/zla_syrfsx_extended.f
SRC/zla_syrpvgrw.f
SRC/zlarscl2.f
SRC/zlascl2.f
SRC/zporfsx.f
SRC/zsyrfsx.f
SRC/zsysvxx.f

index adfc943a05556848cc3d491feb9d0163009aa95a..4f6cd4341644e76c76de20047465fa26b854c1bb 100644 (file)
@@ -36,8 +36,8 @@
 *     equations and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS_N and ERR_BNDS_C for details of the error
-*     bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED, R
index 910297ef553a46d4ffd2fe6f26184a71b550879a..0f18369df59b6e05dadb5025ef7acfa64525038f 100644 (file)
@@ -35,8 +35,8 @@
 *     equations and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS_N and ERR_BNDS_C for details of the error
-*     bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED, R
index 92fe9529a5456bc57da6f54040af050df525ad6f..757624cba88040a13ae4bbc7291c68728f29e0de 100644 (file)
@@ -1,4 +1,4 @@
-      Subroutine CHERFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, IPIV,
+      SUBROUTINE CHERFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, IPIV,
      $                    S, B, LDB, X, LDX, RCOND, BERR, N_ERR_BNDS,
      $                    ERR_BNDS_NORM, ERR_BNDS_COMP, NPARAMS, PARAMS,
      $                    WORK, RWORK, INFO )
@@ -35,7 +35,7 @@
 *     provides error bounds and backward error estimates for the
 *     solution.  In addition to normwise error bound, the code provides
 *     maximum componentwise error bound if possible.  See comments for
-*     ERR_BNDS_N and ERR_BNDS_C for details of the error bounds.
+*     ERR_BNDS_NORM and ERR_BNDS_COMP for details of the error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED and S
index 1fffb046bdf0946ac2a150b83ab0dd27afb259c8..b7de77819ebd173faf33101327b917b502da4caf 100644 (file)
 *     IPIV    (input or output) INTEGER array, dimension (N)
 *     If FACT = 'F', then IPIV is an input argument and on entry
 *     contains details of the interchanges and the block
-*     structure of D, as determined by SSYTRF.  If IPIV(k) > 0,
+*     structure of D, as determined by CHETRF.  If IPIV(k) > 0,
 *     then rows and columns k and IPIV(k) were interchanged and
 *     D(k,k) is a 1-by-1 diagonal block.  If UPLO = 'U' and
 *     IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and
 *
 *     If FACT = 'N', then IPIV is an output argument and on exit
 *     contains details of the interchanges and the block
-*     structure of D, as determined by SSYTRF.
+*     structure of D, as determined by CHETRF.
 *
 *     EQUED   (input or output) CHARACTER*1
 *     Specifies the form of equilibration that was done.
index 0eee2f4713a921b4c521c0666e71e364473dbdef..2851b1478ef15631af1cd8f91adfba6260df598c 100644 (file)
 *  Arguments
 *  =========
 *
-*  C      REAL vector.
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  WORK   COMPLEX workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK  REAL workspace of size N.
+*     KL      (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU      (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0.
+*
+*     AB      (input) COMPLEX array, dimension (LDAB,N)
+*     On entry, the matrix A in band storage, in rows 1 to KL+KU+1.
+*     The j-th column of A is stored in the j-th column of the
+*     array AB as follows:
+*     AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl)
+*
+*     LDAB    (input) INTEGER
+*     The leading dimension of the array AB.  LDAB >= KL+KU+1.
+*
+*     AFB     (input) COMPLEX array, dimension (LDAFB,N)
+*     Details of the LU factorization of the band matrix A, as
+*     computed by CGBTRF.  U is stored as an upper triangular
+*     band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1,
+*     and the multipliers used during the factorization are stored
+*     in rows KL+KU+2 to 2*KL+KU+1.
+*
+*     LDAFB   (input) INTEGER
+*     The leading dimension of the array AFB.  LDAFB >= 2*KL+KU+1.
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by CGBTRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     C       (input) REAL array, dimension (N)
+*     The vector C in the formula op(A) * inv(diag(C)).
+*
+*     CAPPLY  (input) LOGICAL
+*     If .TRUE. then access the vector C in the formula above.
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) REAL array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
       NOTRANS = LSAME( TRANS, 'N' )
       IF ( .NOT. NOTRANS .AND. .NOT. LSAME( TRANS, 'T' ) .AND. .NOT.
      $     LSAME( TRANS, 'C' ) ) THEN
+         INFO = -1
       ELSE IF( N.LT.0 ) THEN
          INFO = -2
       ELSE IF( KL.LT.0 .OR. KL.GT.N-1 ) THEN
-         INFO = -4
+         INFO = -3
       ELSE IF( KU.LT.0 .OR. KU.GT.N-1 ) THEN
-         INFO = -5
+         INFO = -4
       ELSE IF( LDAB.LT.KL+KU+1 ) THEN
-         INFO = -8
+         INFO = -6
       ELSE IF( LDAFB.LT.2*KL+KU+1 ) THEN
-         INFO = -10
+         INFO = -8
       END IF
       IF( INFO.NE.0 ) THEN
          CALL XERBLA( 'CLA_GBRCOND_C', -INFO )
index 42a3d664b5292e6449cb45bef827d4aaa94fdbd6..74be832034c6df0b1fe3a2b312bbc1fe8da63af9 100644 (file)
 *  Arguments
 *  =========
 *
-*  X      COMPLEX vector.
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  WORK   COMPLEX workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK  REAL workspace of size N.
+*     KL      (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU      (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0.
+*
+*     AB      (input) COMPLEX array, dimension (LDAB,N)
+*     On entry, the matrix A in band storage, in rows 1 to KL+KU+1.
+*     The j-th column of A is stored in the j-th column of the
+*     array AB as follows:
+*     AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl)
+*
+*     LDAB    (input) INTEGER
+*     The leading dimension of the array AB.  LDAB >= KL+KU+1.
+*
+*     AFB     (input) COMPLEX array, dimension (LDAFB,N)
+*     Details of the LU factorization of the band matrix A, as
+*     computed by CGBTRF.  U is stored as an upper triangular
+*     band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1,
+*     and the multipliers used during the factorization are stored
+*     in rows KL+KU+2 to 2*KL+KU+1.
+*
+*     LDAFB   (input) INTEGER
+*     The leading dimension of the array AFB.  LDAFB >= 2*KL+KU+1.
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by CGBTRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     X       (input) COMPLEX array, dimension (N)
+*     The vector X in the formula op(A) * diag(X).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) REAL array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
       ELSE IF( N.LT.0 ) THEN
          INFO = -2
       ELSE IF( KL.LT.0 .OR. KL.GT.N-1 ) THEN
-         INFO = -4
+         INFO = -3
       ELSE IF( KU.LT.0 .OR. KU.GT.N-1 ) THEN
-         INFO = -5
+         INFO = -4
       ELSE IF( LDAB.LT.KL+KU+1 ) THEN
-         INFO = -8
+         INFO = -6
       ELSE IF( LDAFB.LT.2*KL+KU+1 ) THEN
-         INFO = -10
+         INFO = -8
       END IF
       IF( INFO.NE.0 ) THEN
          CALL XERBLA( 'CLA_GBRCOND_X', -INFO )
index 1dce776ca0c98e31b9a0c91c9f4ac035cefcfbe7..552bf47e4bbbe7340eb7161a02fbe2a263cdaaab 100644 (file)
@@ -1,10 +1,10 @@
       SUBROUTINE CLA_GBRFSX_EXTENDED ( PREC_TYPE, TRANS_TYPE, N, KL, KU,
      $                                NRHS, AB, LDAB, AFB, LDAFB, IPIV,
      $                                COLEQU, C, B, LDB, Y, LDY,
-     $                                BERR_OUT, N_NORMS, ERRS_N, ERRS_C,
-     $                                RES, AYB, DY, Y_TAIL, RCOND,
-     $                                ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                BERR_OUT, N_NORMS, ERR_BNDS_NORM,
+     $                                ERR_BNDS_COMP, RES, AYB, DY,
+     $                                Y_TAIL, RCOND, ITHRESH, RTHRESH,
+     $                                DZ_UB, IGNORE_CWISE, INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       COMPLEX            AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       REAL               C( * ), AYB(*), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
 *
-*  CLA_GBRFSX_EXTENDED computes ... .
+*  CLA_GBRFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by CGBRFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     TRANS_TYPE     (input) INTEGER
+*     Specifies the transposition operation on A.
+*     The value is defined by ILATRANS(T) where T is a CHARACTER and
+*     T    = 'N':  No transpose
+*          = 'T':  Transpose
+*          = 'C':  Conjugate transpose
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     KL             (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU             (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     AB             (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDAB           (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AFB            (input) COMPLEX array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by CGBTRF.
+*
+*     LDAFB          (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by CGBTRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) REAL array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) COMPLEX array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) COMPLEX array, dimension (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by CGBTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) REAL array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by CLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) REAL array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) REAL array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) COMPLEX array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) REAL array, dimension (N)
+*     Workspace.
+*
+*     DY             (input) COMPLEX array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) COMPLEX array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) REAL
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) REAL
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) REAL
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to CGBTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF ( N_NORMS .GE. 2 ) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index 0d7443c4ef35617f27c20a588a97210048f18a60..5eef387a03b0fa61c7bc48d066c731e4d0a90461 100644 (file)
 *
 *  Purpose
 *  =======
-* 
-*  CLA_GBRPVGRW computes ... .
+*
+*  CLA_GBRPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     KL      (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU      (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A.  NCOLS >= 0.
+*
+*     AB      (input) COMPLEX array, dimension (LDAB,N)
+*     On entry, the matrix A in band storage, in rows 1 to KL+KU+1.
+*     The j-th column of A is stored in the j-th column of the
+*     array AB as follows:
+*     AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl)
+*
+*     LDAB    (input) INTEGER
+*     The leading dimension of the array AB.  LDAB >= KL+KU+1.
+*
+*     AFB     (input) COMPLEX array, dimension (LDAFB,N)
+*     Details of the LU factorization of the band matrix A, as
+*     computed by CGBTRF.  U is stored as an upper triangular
+*     band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1,
+*     and the multipliers used during the factorization are stored
+*     in rows KL+KU+2 to 2*KL+KU+1.
+*
+*     LDAFB   (input) INTEGER
+*     The leading dimension of the array AFB.  LDAFB >= 2*KL+KU+1.
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
@@ -45,7 +82,7 @@
 *     .. Executable Statements ..
 *
       RPVGRW = 1.0
-*
+
       KD = KU + 1
       DO J = 1, NCOLS
          AMAX = 0.0
index 06cfb618a28e5000bd3c523bff17bf167967c1a1..c61cd8d173f04da96b4932fac2ad517de1e16184 100644 (file)
 *  Arguments
 *  =========
 *
-*  C       REAL vector.
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  WORK    COMPLEX workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK   REAL workspace of size N.
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by CGETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by CGETRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     C       (input) REAL array, dimension (N)
+*     The vector C in the formula op(A) * inv(diag(C)).
+*
+*     CAPPLY  (input) LOGICAL
+*     If .TRUE. then access the vector C in the formula above.
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) REAL array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index 9104a9b7e072a7071cf1242a4ddf0eb96dbb9a73..5848ad7f24cc26e9f801da41d99c7d2545bdba0b 100644 (file)
 *  Arguments
 *  =========
 *
-*  X       COMPLEX vector.
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  WORK    COMPLEX workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK   REAL workspace of size N.
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by CGETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by CGETRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     X       (input) COMPLEX array, dimension (N)
+*     The vector X in the formula op(A) * diag(X).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) REAL array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index af66812bed10fe770f12e6b49ff3a0fc91b0372f..6c7f4ed9a932c30d349d65af8a2dd09dfce92cd6 100644 (file)
 *  Purpose
 *  =======
 * 
-*  CLA_GERFSX_EXTENDED computes ... .
+*  CLA_GERFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by CGERFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     TRANS_TYPE     (input) INTEGER
+*     Specifies the transposition operation on A.
+*     The value is defined by ILATRANS(T) where T is a CHARACTER and
+*     T    = 'N':  No transpose
+*          = 'T':  Transpose
+*          = 'C':  Conjugate transpose
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) COMPLEX array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by CGETRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by CGETRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) REAL array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) COMPLEX array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) COMPLEX array, dimension (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by CGETRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) REAL array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by CLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) REAL array, dimension (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) REAL array, dimension (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) COMPLEX array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) REAL array, dimension (N)
+*     Workspace.
+*
+*     DY             (input) COMPLEX array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) COMPLEX array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) REAL
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) REAL
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) REAL
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to CGETRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 80ae92e9d73022138ee2289672855c234aded842..1f56fd6a7e1f58960f86be9d39f79037e10557c1 100644 (file)
 *  Arguments
 *  =========
 *
-*  C      REAL vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK   COMPLEX workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK  REAL workspace of size N.
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by CHETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by CHETRF.
+*
+*     C       (input) REAL array, dimension (N)
+*     The vector C in the formula op(A) * inv(diag(C)).
+*
+*     CAPPLY  (input) LOGICAL
+*     If .TRUE. then access the vector C in the formula above.
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) REAL array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index 1610e8eae6bdb082437ea5d0bfb94aec315fdbec..63add72e561163dbfb3e0c62ac1986bbb4cb55cc 100644 (file)
 *  Arguments
 *  =========
 *
-*  X      COMPLEX vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK   COMPLEX workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK  REAL workspace of size N.
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by CHETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by CHETRF.
+*
+*     X       (input) COMPLEX array, dimension (N)
+*     The vector X in the formula op(A) * diag(X).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) REAL array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index 8c3dd66d4ed45532623ebf592868267bff8bbf6b..eaeddfd94d8fe81a224869f9682b537d4ef7b294 100644 (file)
@@ -1,9 +1,10 @@
       SUBROUTINE CLA_HERFSX_EXTENDED( PREC_TYPE, UPLO, N, NRHS, A, LDA,
      $                                AF, LDAF, IPIV, COLEQU, C, B, LDB,
-     $                                Y, LDY, BERR_OUT, N_NORMS, ERRS_N,
-     $                                ERRS_C, RES, AYB, DY, Y_TAIL,
-     $                                RCOND, ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                Y, LDY, BERR_OUT, N_NORMS,
+     $                                ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
+     $                                AYB, DY, Y_TAIL, RCOND, ITHRESH,
+     $                                RTHRESH, DZ_UB, IGNORE_CWISE,
+     $                                INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       COMPLEX            A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       REAL               C( * ), AYB( * ), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
-* 
-*  CLA_HERFSX_EXTENDED computes ... .
+*
+*  CLA_HERFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by CHERFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) COMPLEX array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by CHETRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by CHETRF.
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) REAL array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) COMPLEX array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) COMPLEX array, dimension
+*                    (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by CHETRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) REAL array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by CLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) REAL array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) REAL array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) COMPLEX array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) REAL array, dimension (N)
+*     Workspace.
+*
+*     DY             (input) COMPLEX array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) COMPLEX array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) REAL
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) REAL
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) REAL
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to CHETRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF (N_NORMS .GE. 2) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index 04b77e7a943e0917d23382af5ff748806111ef1d..7b97af0ede10178c537b8f2ae6e62c706d3f789c 100644 (file)
 *  Purpose
 *  =======
 * 
-*  CLA_HERPVGRW computes ... .
+*  CLA_HERPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     INFO    (input) INTEGER
+*     The value of INFO returned from SSYTRF, .i.e., the pivot in
+*     column INFO is exactly 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by CHETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by CHETRF.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N)
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 7d1480c6fd166f822fa937e14e46636b06c3275c..73d849d362a81c6d9dbc42f190a6af0aeadbf8ae 100644 (file)
 *  Purpose
 *  =======
 *
-*     CLA_LIN_BERR computes component-wise relative backward error from
+*     CLA_LIN_BERR computes componentwise relative backward error from
 *     the formula
 *         max(i) ( abs(R(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
-*     where abs(Z) is the component-wise absolute value of the matrix
+*     where abs(Z) is the componentwise absolute value of the matrix
 *     or vector Z.
 *
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NZ      (input) INTEGER
+*     We add (NZ+1)*SLAMCH( 'Safe minimum' ) to R(i) in the numerator to
+*     guard against spuriously zero residuals. Default value is N.
+*
+*     NRHS    (input) INTEGER
+*     The number of right hand sides, i.e., the number of columns
+*     of the matrices AYB, RES, and BERR.  NRHS >= 0.
+*
+*     RES    (input) DOUBLE PRECISION array, dimension (N,NRHS)
+*     The residual matrix, i.e., the matrix R in the relative backward
+*     error formula above.
+*
+*     AYB    (input) DOUBLE PRECISION array, dimension (N, NRHS)
+*     The denominator in the relative backward error formula above, i.e.,
+*     the matrix abs(op(A_s))*abs(Y) + abs(B_s). The matrices A, Y, and B
+*     are from iterative refinement (see cla_gerfsx_extended.f).
+*     
+*     RES    (output) COMPLEX array, dimension (NRHS)
+*     The componentwise relative backward error from the formula above.
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index eb1fee0c2f05310d3454847dd8dd3986101adf27..5f4ec437d38aac8de1f0e30032481ad5c4f11a6d 100644 (file)
 *  Arguments
 *  =========
 *
-*  C     REAL vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK  COMPLEX workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK REAL workspace of size N.
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by CPOTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     C       (input) REAL array, dimension (N)
+*     The vector C in the formula op(A) * inv(diag(C)).
+*
+*     CAPPLY  (input) LOGICAL
+*     If .TRUE. then access the vector C in the formula above.
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) REAL array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index 355b7ed435c33c4c806b5f7e91c03fc30c52863d..ef98df012ec162bb4dac82bfd6e0abb376cb65b8 100644 (file)
 *  Arguments
 *  =========
 *
-*  X       COMPLEX vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK    COMPLEX workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK   REAL workspace of size N.
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by CPOTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     X       (input) COMPLEX array, dimension (N)
+*     The vector X in the formula op(A) * diag(X).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) REAL array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index 756a2e2804b21a7b56eaa87c582b7745264cb628..4963b6a1190af93e862679444a0f1eb8748a4567 100644 (file)
@@ -1,9 +1,10 @@
       SUBROUTINE CLA_PORFSX_EXTENDED( PREC_TYPE, UPLO, N, NRHS, A, LDA,
      $                                AF, LDAF, COLEQU, C, B, LDB, Y,
-     $                                LDY, BERR_OUT, N_NORMS, ERRS_N,
-     $                                ERRS_C, RES, AYB, DY, Y_TAIL,
-     $                                RCOND, ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                LDY, BERR_OUT, N_NORMS,
+     $                                ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
+     $                                AYB, DY, Y_TAIL, RCOND, ITHRESH,
+     $                                RTHRESH, DZ_UB, IGNORE_CWISE,
+     $                                INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       COMPLEX            A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       REAL               C( * ), AYB( * ), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
-* 
-*  CLA_PORFSX_EXTENDED computes ... .
+*
+*  CLA_PORFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by CPORFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) COMPLEX array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by CPOTRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) REAL array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) COMPLEX array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) COMPLEX array, dimension
+*                    (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by CPOTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) REAL array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by CLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) REAL array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) REAL array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) COMPLEX array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) REAL array, dimension (N)
+*     Workspace.
+*
+*     DY             (input) COMPLEX array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) COMPLEX array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) REAL
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) REAL
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) REAL
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to CPOTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds.
 *
          IF (N_NORMS .GE. 1) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF (N_NORMS .GE. 2) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index 93808203047d9d19699dbf3a6d7af1a744797088..f94aac27034b2be321e878064915445a4acf3724 100644 (file)
 *  Purpose
 *  =======
 * 
-*  CLA_PORPVGRW computes ... .
+*  CLA_PORPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by CPOTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     WORK    (input) COMPLEX array, dimension (2*N)
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 3cfa3fb1e30f56d021c9549b73e4064e00384603..699e041049a9317a380c1ad5a9978fe8defe5d76 100644 (file)
 *  Purpose
 *  =======
 * 
-*  CLA_RPVGRW computes ... .
+*  CLA_RPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by CGETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
@@ -44,7 +69,7 @@
 *     .. Executable Statements ..
 *
       RPVGRW = 1.0
-*
+
       DO J = 1, NCOLS
          AMAX = 0.0
          UMAX = 0.0
index b902bd4dd60957ccd8c60b1849dbf40014231e2c..4df92b13e236b5dfe778f13bfac3205d68ac1352 100644 (file)
 *  Arguments
 *  =========
 *
-*  C       REAL vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK    COMPLEX workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK   REAL workspace of size N.
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by CSYTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by CSYTRF.
+*
+*     C       (input) REAL array, dimension (N)
+*     The vector C in the formula op(A) * inv(diag(C)).
+*
+*     CAPPLY  (input) LOGICAL
+*     If .TRUE. then access the vector C in the formula above.
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) REAL array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index b8f092d5fc0e6f1c23ffd72c69ed3a460f545dff..b686755fb32bb538aca04978dc8ba41f92ec652d 100644 (file)
 *  Arguments
 *  =========
 *
-*  X       COMPLEX vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK    COMPLEX workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK   REAL workspace of size N.
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by CSYTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by CSYTRF.
+*
+*     X       (input) COMPLEX array, dimension (N)
+*     The vector X in the formula op(A) * diag(X).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) REAL array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index ee9fdaac714cdc006b4278e02db5583e0718f870..1abd33c5b7369bc6dc78bde42a430a6ae4630274 100644 (file)
@@ -1,9 +1,10 @@
       SUBROUTINE CLA_SYRFSX_EXTENDED( PREC_TYPE, UPLO, N, NRHS, A, LDA,
      $                                AF, LDAF, IPIV, COLEQU, C, B, LDB,
-     $                                Y, LDY, BERR_OUT, N_NORMS, ERRS_N,
-     $                                ERRS_C, RES, AYB, DY, Y_TAIL,
-     $                                RCOND, ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                Y, LDY, BERR_OUT, N_NORMS,
+     $                                ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
+     $                                AYB, DY, Y_TAIL, RCOND, ITHRESH,
+     $                                RTHRESH, DZ_UB, IGNORE_CWISE,
+     $                                INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       COMPLEX            A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       REAL               C( * ), AYB( * ), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
-* 
-*  CLA_SYRFSX_EXTENDED computes ... .
+*
+*  CLA_SYRFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by CSYRFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) COMPLEX array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by CSYTRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by CSYTRF.
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) REAL array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) COMPLEX array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) COMPLEX array, dimension
+*                    (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by CSYTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) REAL array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by CLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) REAL array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) REAL array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) COMPLEX array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) REAL array, dimension (N)
+*     Workspace.
+*
+*     DY             (input) COMPLEX array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) COMPLEX array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) REAL
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) REAL
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) REAL
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to CSYTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF ( N_NORMS .GE. 2 ) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index 66c6adbe9a5b790c71474cf1f7000e3dbfd41756..94f9be2b54edc1c809de286267643babfc3c6b52 100644 (file)
 *  Purpose
 *  =======
 * 
-*  CLA_SYRPVGRW computes ... .
+*  CLA_SYRPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     INFO    (input) INTEGER
+*     The value of INFO returned from CSYTRF, .i.e., the pivot in
+*     column INFO is exactly 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) COMPLEX array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by CSYTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by CSYTRF.
+*
+*     WORK    (input) COMPLEX array, dimension (2*N)
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 22c54c09aa116f6af3b8db26c88d3f277aa363d0..42294f7eec0c3611be44fd63d6d8b8fd3803db2b 100644 (file)
 *
 *  CLARSCL2 performs a reciprocal diagonal scaling on an vector:
 *    x <-- inv(D) * x
-*  where the diagonal matrix D is stored as a vector.
-*  Eventually to be replaced by BLAS_sge_diag_scale in the new BLAS
+*  where the REAL diagonal matrix D is stored as a vector.
+*
+*  Eventually to be replaced by BLAS_cge_diag_scale in the new BLAS
 *  standard.
 *
 *  Arguments
 *  =========
-*  N      (input) INTEGER
-*         The size of the vectors X and D.
-*
-*  D      (input) REAL array, length N
-*         Diagonal matrix D, stored as a vector of length N.
-*  X      (input/output) COMPLEX array, length N
-*         On entry, the vector X to be scaled by D.
-*         On exit, the scaled vector.
-*     ..
+*
+*     M       (input) INTEGER
+*     The number of rows of D and X. M >= 0.
+*
+*     N       (input) INTEGER
+*     The number of columns of D and X. N >= 0.
+*
+*     D       (input) REAL array, length M
+*     Diagonal matrix D, stored as a vector of length M.
+*
+*     X       (input/output) COMPLEX array, dimension (LDX,N)
+*     On entry, the vector X to be scaled by D.
+*     On exit, the scaled vector.
+*
+*     LDX     (input) INTEGER
+*     The leading dimension of the vector X. LDX >= 0.
+*
+*  =====================================================================
+*
 *     .. Local Scalars ..
       INTEGER            I, J
 *     ..
 *
       DO J = 1, N
          DO I = 1, M
-            X(I,J) = X(I,J) / D(I)
+            X( I, J ) = X( I, J ) / D( I )
          END DO
       END DO
-*
+
       RETURN
       END
-*
+
index 9712f4d962de3c6a32b43caa292e32b61a4c109b..12efe2cd1cd4791784187ec22ddbe62aa4c60629 100644 (file)
 *
 *  CLASCL2 performs a diagonal scaling on a vector:
 *    x <-- D * x
-*  where the diagonal matrix D is stored as a vector.
-*  Eventually to be replaced by BLAS_sge_diag_scale in the new BLAS
+*  where the diagonal REAL matrix D is stored as a vector.
+*
+*  Eventually to be replaced by BLAS_cge_diag_scale in the new BLAS
 *  standard.
 *
 *  Arguments
 *  =========
-*  N      (input) INTEGER
-*         The size of the vectors X and D.
-*
-*  D      (input) REAL array, length N
-*         Diagonal matrix D, stored as a vector of length N.
-*  X      (input/output) COMPLEX array, length N
-*         On entry, the vector X to be scaled by D.
-*         On exit, the scaled vector.
-*     ..
+*
+*     M       (input) INTEGER
+*     The number of rows of D and X. M >= 0.
+*
+*     N       (input) INTEGER
+*     The number of columns of D and X. N >= 0.
+*
+*     D       (input) REAL array, length M
+*     Diagonal matrix D, stored as a vector of length M.
+*
+*     X       (input/output) COMPLEX array, dimension (LDX,N)
+*     On entry, the vector X to be scaled by D.
+*     On exit, the scaled vector.
+*
+*     LDX     (input) INTEGER
+*     The leading dimension of the vector X. LDX >= 0.
+*
+*  =====================================================================
+*
 *     .. Local Scalars ..
       INTEGER            I, J
 *     ..
 *
       DO J = 1, N
          DO I = 1, M
-            X(I,J) = X(I,J) * D(I)
+            X( I, J ) = X( I, J ) * D( I )
          END DO
       END DO
-*
+
       RETURN
       END
-*
+
index 740a347725ab35502256bbda6f6bc20b900b4bf4..0f914231372362b55c2f78d6e82025582fedc7e1 100644 (file)
@@ -1,4 +1,4 @@
-      Subroutine CPORFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, S, B,
+      SUBROUTINE CPORFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, S, B,
      $                    LDB, X, LDX, RCOND, BERR, N_ERR_BNDS,
      $                    ERR_BNDS_NORM, ERR_BNDS_COMP, NPARAMS, PARAMS,
      $                    WORK, RWORK, INFO )
@@ -35,7 +35,8 @@
 *     definite, and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS for details of the error bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED and S
index 71b864f9b95f881ba9257eff84cb6df193fc102d..6c0692d307fbc38134b820dec4683a9d1fc24af7 100644 (file)
@@ -1,4 +1,4 @@
-      Subroutine CSYRFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, IPIV,
+      SUBROUTINE CSYRFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, IPIV,
      $                    S, B, LDB, X, LDX, RCOND, BERR, N_ERR_BNDS,
      $                    ERR_BNDS_NORM, ERR_BNDS_COMP, NPARAMS, PARAMS,
      $                    WORK, RWORK, INFO )
@@ -36,7 +36,7 @@
 *     provides error bounds and backward error estimates for the
 *     solution.  In addition to normwise error bound, the code provides
 *     maximum componentwise error bound if possible.  See comments for
-*     ERR_BNDS_N and ERR_BNDS_C for details of the error bounds.
+*     ERR_BNDS_NORM and ERR_BNDS_COMP for details of the error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED and S
index 42f3d89efdee10623215f9c558fecaf40c845833..ae76d119fff0acda91bb8f62947b646ecf123d91 100644 (file)
 *       = 'E':  The matrix A will be equilibrated if necessary, then
 *               copied to AF and factored.
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
 *     N       (input) INTEGER
 *     The number of linear equations, i.e., the order of the
 *     matrix A.  N >= 0.
index d6dbd184b785d5e1342577ca7262e26070203b53..1161c069ce6ef4442068d09b32e3c131c0456c6c 100644 (file)
@@ -36,8 +36,8 @@
 *     equations and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS_N and ERR_BNDS_C for details of the error
-*     bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED, R
index bb1878cbf498041dc51c7fc085ac9d6e0b24a7bd..b2908a8c24d41ee2a88db18d8280a000eb2b4587 100644 (file)
@@ -35,8 +35,8 @@
 *     equations and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS_N and ERR_BNDS_C for details of the error
-*     bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED, R
index cf2c5ca39a9b636860808e9c9955b7d570c501eb..3fe18704466a87832a1a858cdfbf1f91c5435f26 100644 (file)
@@ -1,6 +1,6 @@
       DOUBLE PRECISION FUNCTION DLA_GBRCOND( TRANS, N, KL, KU, AB, LDAB,
-     $                            AFB, LDAFB, IPIV, CMODE, C, INFO,
-     $     WORK, IWORK )
+     $                                       AFB, LDAFB, IPIV, CMODE, C,
+     $                                       INFO, WORK, IWORK )
 *
 *     -- LAPACK routine (version 3.2.1)                               --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  =========
 *
-*  WORK    double precision workspace of size 5*N.
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  IWORK   integer workspace of size N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     KL      (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU      (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0.
+*
+*     AB      (input) DOUBLE PRECISION array, dimension (LDAB,N)
+*     On entry, the matrix A in band storage, in rows 1 to KL+KU+1.
+*     The j-th column of A is stored in the j-th column of the
+*     array AB as follows:
+*     AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl)
+*
+*     LDAB    (input) INTEGER
+*     The leading dimension of the array AB.  LDAB >= KL+KU+1.
+*
+*     AFB     (input) DOUBLE PRECISION array, dimension (LDAFB,N)
+*     Details of the LU factorization of the band matrix A, as
+*     computed by DGBTRF.  U is stored as an upper triangular
+*     band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1,
+*     and the multipliers used during the factorization are stored
+*     in rows KL+KU+2 to 2*KL+KU+1.
+*
+*     LDAFB   (input) INTEGER
+*     The leading dimension of the array AFB.  LDAFB >= 2*KL+KU+1.
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by DGBTRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     CMODE   (input) INTEGER
+*     Determines op2(C) in the formula op(A) * op2(C) as follows:
+*     CMODE =  1    op2(C) = C
+*     CMODE =  0    op2(C) = I
+*     CMODE = -1    op2(C) = inv(C)
+*
+*     C       (input) DOUBLE PRECISION array, dimension (N)
+*     The vector C in the formula op(A) * op2(C).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) DOUBLE PRECISION array, dimension (5*N).
+*     Workspace.
+*
+*     IWORK   (input) INTEGER array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
       ELSE IF( N.LT.0 ) THEN
          INFO = -2
       ELSE IF( KL.LT.0 .OR. KL.GT.N-1 ) THEN
-         INFO = -4
+         INFO = -3
       ELSE IF( KU.LT.0 .OR. KU.GT.N-1 ) THEN
-         INFO = -5
+         INFO = -4
       ELSE IF( LDAB.LT.KL+KU+1 ) THEN
-         INFO = -8
+         INFO = -6
       ELSE IF( LDAFB.LT.2*KL+KU+1 ) THEN
-         INFO = -10
+         INFO = -8
       END IF
       IF( INFO.NE.0 ) THEN
          CALL XERBLA( 'DLA_GBRCOND', -INFO )
index 88c1003ab223878c84071a28466820d87469b169..be7e162bc3b3a5d118a11f7d646e8dc6ec5aadd4 100644 (file)
@@ -1,10 +1,10 @@
       SUBROUTINE DLA_GBRFSX_EXTENDED( PREC_TYPE, TRANS_TYPE, N, KL, KU,
      $                                NRHS, AB, LDAB, AFB, LDAFB, IPIV,
      $                                COLEQU, C, B, LDB, Y, LDY,
-     $                                BERR_OUT, N_NORMS, ERRS_N, ERRS_C,
-     $                                RES, AYB, DY, Y_TAIL, RCOND,
-     $                                ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                BERR_OUT, N_NORMS, ERR_BNDS_NORM,
+     $                                ERR_BNDS_COMP, RES, AYB, DY,
+     $                                Y_TAIL, RCOND, ITHRESH, RTHRESH,
+     $                                DZ_UB, IGNORE_CWISE, INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       DOUBLE PRECISION   AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES(*), DY(*), Y_TAIL(*)
       DOUBLE PRECISION   C( * ), AYB(*), RCOND, BERR_OUT(*),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
 * 
-*  DLA_GBRFSX_EXTENDED computes ... .
+*  DLA_GBRFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by DGBRFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     TRANS_TYPE     (input) INTEGER
+*     Specifies the transposition operation on A.
+*     The value is defined by ILATRANS(T) where T is a CHARACTER and
+*     T    = 'N':  No transpose
+*          = 'T':  Transpose
+*          = 'C':  Conjugate transpose
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     KL             (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU             (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) DOUBLE PRECISION array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) DOUBLE PRECISION array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by DGBTRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by DGBTRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) DOUBLE PRECISION array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) DOUBLE PRECISION array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) DOUBLE PRECISION array, dimension 
+*                    (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by DGBTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) DOUBLE PRECISION array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by DLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) DOUBLE PRECISION array, dimension 
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) DOUBLE PRECISION array, dimension 
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace. This can be the same workspace passed for Y_TAIL.
+*
+*     DY             (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) DOUBLE PRECISION
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) DOUBLE PRECISION
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) DOUBLE PRECISION
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to DGBTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF (N_NORMS .GE. 2) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index e7e3fa2e85b48985bca8cade5aa629b19435d230..c0a79a3d1969343c3cf34f3f46b1b37cee02a7db 100644 (file)
@@ -1,5 +1,5 @@
-      DOUBLE PRECISION FUNCTION DLA_GBRPVGRW( N, KL, KU, NCOLS, AB, 
-     $                            LDAB, AFB, LDAFB )
+      DOUBLE PRECISION FUNCTION DLA_GBRPVGRW( N, KL, KU, NCOLS, AB,
+     $                                        LDAB, AFB, LDAFB )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *
 *  Purpose
 *  =======
-* 
-*  DLA_GBRPVGRW computes ... .
+*
+*  DLA_GBRPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     KL      (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU      (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A.  NCOLS >= 0.
+*
+*     AB      (input) DOUBLE PRECISION array, dimension (LDAB,N)
+*     On entry, the matrix A in band storage, in rows 1 to KL+KU+1.
+*     The j-th column of A is stored in the j-th column of the
+*     array AB as follows:
+*     AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl)
+*
+*     LDAB    (input) INTEGER
+*     The leading dimension of the array AB.  LDAB >= KL+KU+1.
+*
+*     AFB     (input) DOUBLE PRECISION array, dimension (LDAFB,N)
+*     Details of the LU factorization of the band matrix A, as
+*     computed by DGBTRF.  U is stored as an upper triangular
+*     band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1,
+*     and the multipliers used during the factorization are stored
+*     in rows KL+KU+2 to 2*KL+KU+1.
+*
+*     LDAFB   (input) INTEGER
+*     The leading dimension of the array AFB.  LDAFB >= 2*KL+KU+1.
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
@@ -38,7 +75,7 @@
 *     .. Executable Statements ..
 *
       RPVGRW = 1.0D+0
-*
+
       KD = KU + 1
       DO J = 1, NCOLS
          AMAX = 0.0D+0
index de7ef9d2ce58b251a07a91422240403afd296aa3..732cdd245cf444946c26b5539b9757c19ab09d8b 100644 (file)
@@ -1,6 +1,6 @@
-      DOUBLE PRECISION FUNCTION DLA_GERCOND ( TRANS, N, A, LDA, AF, 
-     $                            LDAF, IPIV, CMODE, C, INFO, WORK, 
-     $     IWORK )
+      DOUBLE PRECISION FUNCTION DLA_GERCOND ( TRANS, N, A, LDA, AF,
+     $                                        LDAF, IPIV, CMODE, C,
+     $                                        INFO, WORK, IWORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  ==========
 *
-*  WORK    DOUBLE PRECISION workspace of size 3*N, and
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  IWORK   INTEGER workspace of size N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     A       (input) DOUBLE PRECISION array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) DOUBLE PRECISION array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by DGETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by DGETRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     CMODE   (input) INTEGER
+*     Determines op2(C) in the formula op(A) * op2(C) as follows:
+*     CMODE =  1    op2(C) = C
+*     CMODE =  0    op2(C) = I
+*     CMODE = -1    op2(C) = inv(C)
+*
+*     C       (input) DOUBLE PRECISION array, dimension (N)
+*     The vector C in the formula op(A) * op2(C).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) DOUBLE PRECISION array, dimension (3*N).
+*     Workspace.
+*
+*     IWORK   (input) INTEGER array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
          INFO = -1
       ELSE IF( N.LT.0 ) THEN
          INFO = -2
+      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
+         INFO = -4
+      ELSE IF( LDAF.LT.MAX( 1, N ) ) THEN
+         INFO = -6
       END IF
       IF( INFO.NE.0 ) THEN
          CALL XERBLA( 'DLA_GERCOND', -INFO )
index 31fcf0bc667dc7b01e75c83496955c84a0d94a8a..f5bd1048451ee9167348dea6b2393ef5896f5faa 100644 (file)
 *  Purpose
 *  =======
 * 
-*  DLA_GERFSX_EXTENDED computes ... .
+*  DLA_GERFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by DGERFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     TRANS_TYPE     (input) INTEGER
+*     Specifies the transposition operation on A.
+*     The value is defined by ILATRANS(T) where T is a CHARACTER and
+*     T    = 'N':  No transpose
+*          = 'T':  Transpose
+*          = 'C':  Conjugate transpose
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) DOUBLE PRECISION array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) DOUBLE PRECISION array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by DGETRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by DGETRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) DOUBLE PRECISION  array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) DOUBLE PRECISION array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) DOUBLE PRECISION array, dimension
+*                    (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by DGETRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) DOUBLE PRECISION array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by DLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace. This can be the same workspace passed for Y_TAIL.
+*
+*     DY             (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) DOUBLE PRECISION
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) DOUBLE PRECISION
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) DOUBLE PRECISION
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to DGETRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 991dfffd78a966fe42ff17a9d277db1909ee043b..04163a15656ce4abaf9819fcb1d9841f7eefcba5 100644 (file)
 *  Purpose
 *  =======
 *
-*     DLA_LIN_BERR computes component-wise relative backward error from
+*     DLA_LIN_BERR computes componentwise relative backward error from
 *     the formula
 *         max(i) ( abs(R(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
-*     where abs(Z) is the component-wise absolute value of the matrix
+*     where abs(Z) is the componentwise absolute value of the matrix
 *     or vector Z.
 *
+*  Arguments
+*  ==========
+*
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NZ      (input) INTEGER
+*     We add (NZ+1)*SLAMCH( 'Safe minimum' ) to R(i) in the numerator to
+*     guard against spuriously zero residuals. Default value is N.
+*
+*     NRHS    (input) INTEGER
+*     The number of right hand sides, i.e., the number of columns
+*     of the matrices AYB, RES, and BERR.  NRHS >= 0.
+*
+*     RES    (input) DOUBLE PRECISION array, dimension (N,NRHS)
+*     The residual matrix, i.e., the matrix R in the relative backward
+*     error formula above.
+*
+*     AYB    (input) DOUBLE PRECISION array, dimension (N, NRHS)
+*     The denominator in the relative backward error formula above, i.e.,
+*     the matrix abs(op(A_s))*abs(Y) + abs(B_s). The matrices A, Y, and B
+*     are from iterative refinement (see dla_gerfsx_extended.f).
+*     
+*     RES    (output) DOUBLE PRECISION array, dimension (NRHS)
+*     The componentwise relative backward error from the formula above.
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 1a7ac25e07648e7696f21b748da99705e880165c..be4b06136eea6a46b490c2d87440dd9e320ba359 100644 (file)
@@ -1,5 +1,6 @@
-      DOUBLE PRECISION FUNCTION DLA_PORCOND( UPLO, N, A, LDA, AF, LDAF, 
-     $                           CMODE, C, INFO, WORK, IWORK )
+      DOUBLE PRECISION FUNCTION DLA_PORCOND( UPLO, N, A, LDA, AF, LDAF,
+     $                                       CMODE, C, INFO, WORK,
+     $                                       IWORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  ==========
 *
-*  WORK    double precision workspace of size 3*N.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  IWORK   integer workspace of size N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     A       (input) REAL array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) DOUBLE PRECISION array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by DPOTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     CMODE   (input) INTEGER
+*     Determines op2(C) in the formula op(A) * op2(C) as follows:
+*     CMODE =  1    op2(C) = C
+*     CMODE =  0    op2(C) = I
+*     CMODE = -1    op2(C) = inv(C)
+*
+*     C       (input) DOUBLE PRECISION array, dimension (N)
+*     The vector C in the formula op(A) * op2(C).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) DOUBLE PRECISION array, dimension (3*N).
+*     Workspace.
+*
+*     IWORK   (input) INTEGER array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index 80fe5dc07540b4cc5698eeaa5696a493ce684301..1bdcaa69be3a4d9ba6970a92fcffd70689d07c81 100644 (file)
@@ -1,9 +1,10 @@
       SUBROUTINE DLA_PORFSX_EXTENDED( PREC_TYPE, UPLO, N, NRHS, A, LDA,
      $                                AF, LDAF, COLEQU, C, B, LDB, Y,
-     $                                LDY, BERR_OUT, N_NORMS, ERRS_N,
-     $                                ERRS_C, RES, AYB, DY, Y_TAIL,
-     $                                RCOND, ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                LDY, BERR_OUT, N_NORMS,
+     $                                ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
+     $                                AYB, DY, Y_TAIL, RCOND, ITHRESH,
+     $                                RTHRESH, DZ_UB, IGNORE_CWISE,
+     $                                INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       DOUBLE PRECISION   A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       DOUBLE PRECISION   C( * ), AYB(*), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
 *
-*  DLA_PORFSX_EXTENDED computes ... .
+*  DLA_PORFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by DPORFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) DOUBLE PRECISION array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) DOUBLE PRECISION array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by DPOTRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) DOUBLE PRECISION array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) DOUBLE PRECISION array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) DOUBLE PRECISION array, dimension
+*                    (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by DPOTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) DOUBLE PRECISION array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by DLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace. This can be the same workspace passed for Y_TAIL.
+*
+*     DY             (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) DOUBLE PRECISION
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) DOUBLE PRECISION
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) DOUBLE PRECISION
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to DPOTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF ( N_NORMS .GE. 2 ) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index 05ce8f8b85a7a24917d673f7960749f14f2a39ac..dc17d30f6f601f180b185ce58d7ad1dcec8538bd 100644 (file)
@@ -1,5 +1,5 @@
       DOUBLE PRECISION FUNCTION DLA_PORPVGRW( UPLO, NCOLS, A, LDA, AF, 
-     $     LDAF, WORK )
+     $                                        LDAF, WORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Purpose
 *  =======
 * 
-*  DLA_PORPVGRW computes ... .
+*  DLA_PORPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) DOUBLE PRECISION array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) DOUBLE PRECISION array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by DPOTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     WORK    (input) DOUBLE PRECISION array, dimension (2*N)
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 41da7a44da0f1d6e3e9f5d298426b5ce4abfed2e..92faa67a0b77b8371216d8c3be24414ad6d2d599 100644 (file)
 *  Purpose
 *  =======
 * 
-*  DLA_RPVGRW computes ... .
+*  DLA_RPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) DOUBLE PRECISION array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) DOUBLE PRECISION array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by DGETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
@@ -37,7 +62,7 @@
 *     .. Executable Statements ..
 *
       RPVGRW = 1.0D+0
-*
+
       DO J = 1, NCOLS
          AMAX = 0.0D+0
          UMAX = 0.0D+0
index 2a69e7c0e1976b5df7685024b1754ce120512147..3ce366e09a94f94c0cc1ee5a230f470064db48ac 100644 (file)
@@ -1,5 +1,6 @@
       DOUBLE PRECISION FUNCTION DLA_SYRCOND( UPLO, N, A, LDA, AF, LDAF, 
-     $                           IPIV, CMODE, C, INFO, WORK, IWORK )
+     $                                       IPIV, CMODE, C, INFO, WORK,
+     $                                       IWORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  ==========
 *
-*   WORK     double precision workspace of size 3*N.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*   IWORK    integer workspace of size N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     A       (input) DOUBLE PRECISION array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) DOUBLE PRECISION array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by DSYTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by DSYTRF.
+*
+*     CMODE   (input) INTEGER
+*     Determines op2(C) in the formula op(A) * op2(C) as follows:
+*     CMODE =  1    op2(C) = C
+*     CMODE =  0    op2(C) = I
+*     CMODE = -1    op2(C) = inv(C)
+*
+*     C       (input) DOUBLE PRECISION array, dimension (N)
+*     The vector C in the formula op(A) * op2(C).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) DOUBLE PRECISION array, dimension (3*N).
+*     Workspace.
+*
+*     IWORK   (input) INTEGER array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
             END DO
 
             IF ( UP ) THEN
-               call dsytrs( 'U', n, 1, af, ldaf, ipiv, work, n, info )
+               CALL DSYTRS( 'U', N, 1, AF, LDAF, IPIV, WORK, N, INFO )
             ELSE
-               call dsytrs( 'L', n, 1, af, ldaf, ipiv, work, n, info )
+               CALL DSYTRS( 'L', N, 1, AF, LDAF, IPIV, WORK, N, INFO )
             ENDIF
 *
 *           Multiply by inv(C).
             END IF
 
             IF ( UP ) THEN
-               call dsytrs( 'U', n, 1, af, ldaf, ipiv, work, n, info )
+               CALL DSYTRS( 'U', N, 1, AF, LDAF, IPIV, WORK, N, INFO )
             ELSE
-               call dsytrs( 'L', n, 1, af, ldaf, ipiv, work, n, info )
+               CALL DSYTRS( 'L', N, 1, AF, LDAF, IPIV, WORK, N, INFO )
             ENDIF
 *
 *           Multiply by R.
index 618fc4166ba06da59b7132d9e7c8728441556e09..0a892aa36b8ccbe7bbde4b093c8c0052e0aac11c 100644 (file)
@@ -1,9 +1,10 @@
       SUBROUTINE DLA_SYRFSX_EXTENDED( PREC_TYPE, UPLO, N, NRHS, A, LDA,
      $                                AF, LDAF, IPIV, COLEQU, C, B, LDB,
-     $                                Y, LDY, BERR_OUT, N_NORMS, ERRS_N,
-     $                                ERRS_C, RES, AYB, DY, Y_TAIL,
-     $                                RCOND, ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                Y, LDY, BERR_OUT, N_NORMS,
+     $                                ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
+     $                                AYB, DY, Y_TAIL, RCOND, ITHRESH,
+     $                                RTHRESH, DZ_UB, IGNORE_CWISE,
+     $                                INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       DOUBLE PRECISION   A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       DOUBLE PRECISION   C( * ), AYB( * ), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
 * 
-*  DLA_SYRFSX_EXTENDED computes ... .
+*  DLA_SYRFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by DSYRFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) DOUBLE PRECISION array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) DOUBLE PRECISION array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by DSYTRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by DSYTRF.
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) DOUBLE PRECISION array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) DOUBLE PRECISION array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) DOUBLE PRECISION array, dimension
+*                    (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by DSYTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) DOUBLE PRECISION array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by DLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace. This can be the same workspace passed for Y_TAIL.
+*
+*     DY             (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) DOUBLE PRECISION
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) DOUBLE PRECISION
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) DOUBLE PRECISION
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to DSYTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF ( N_NORMS .GE. 2 ) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index 99b5c09647dac10bedbcc58c5fba3a010e4e2626..d3899fa774b2bb5dd4465e075e8254a75f5d1eb6 100644 (file)
@@ -1,5 +1,5 @@
       DOUBLE PRECISION FUNCTION DLA_SYRPVGRW( UPLO, N, INFO, A, LDA, AF,
-     $                             LDAF, IPIV, WORK )
+     $                                        LDAF, IPIV, WORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Purpose
 *  =======
 * 
-*  DLA_SYRPVGRW computes ... .
+*  DLA_SYRPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     INFO    (input) INTEGER
+*     The value of INFO returned from DSYTRF, .i.e., the pivot in
+*     column INFO is exactly 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) DOUBLE PRECISION array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) DOUBLE PRECISION array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by DSYTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by DSYTRF.
+*
+*     WORK    (input) DOUBLE PRECISION array, dimension (2*N)
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index e000f6bb3b88935d3859e968524690fcce4d2cb6..b0dca822350f9b434e24c3624de9ec80d8517d7b 100644 (file)
 *    x <-- inv(D) * x
 *  where the diagonal matrix D is stored as a vector.
 *
-*  Eventually to be replaced by BLAS_sge_diag_scale in the new BLAS
+*  Eventually to be replaced by BLAS_dge_diag_scale in the new BLAS
 *  standard.
 *
 *  Arguments
 *  =========
 *
-*  N      (input) INTEGER
-*         The size of the vectors X and D.
+*     M       (input) INTEGER
+*     The number of rows of D and X. M >= 0.
 *
-*  D      (input) DOUBLE PRECISION array, length N
-*         Diagonal matrix D, stored as a vector of length N.
+*     N       (input) INTEGER
+*     The number of columns of D and X. N >= 0.
+*
+*     D       (input) DOUBLE PRECISION array, length M
+*     Diagonal matrix D, stored as a vector of length M.
+*
+*     X       (input/output) DOUBLE PRECISION array, dimension (LDX,N)
+*     On entry, the vector X to be scaled by D.
+*     On exit, the scaled vector.
+*
+*     LDX     (input) INTEGER
+*     The leading dimension of the vector X. LDX >= 0.
+*
+*  =====================================================================
 *
-*  X      (input/output) DOUBLE PRECISION array, length N
-*         On entry, the vector X to be scaled by D.
-*         On exit, the scaled vector.
-*     ..
 *     .. Local Scalars ..
       INTEGER            I, J
 *     ..
@@ -47,9 +55,9 @@
 *
       DO J = 1, N
          DO I = 1, M
-            X(I,J) = X(I,J) / D(I)
+            X( I, J ) = X( I, J ) / D( I )
          END DO
       END DO
-*
+
       RETURN
       END
index 025ddaf2b1194f69436e68d6de0acfb2c381faa2..acc2782a9a13c437a9b00823eae91d61a52d9e27 100644 (file)
 *    x <-- D * x
 *  where the diagonal matrix D is stored as a vector.
 *
-*  Eventually to be replaced by BLAS_sge_diag_scale in the new BLAS
+*  Eventually to be replaced by BLAS_dge_diag_scale in the new BLAS
 *  standard.
 *
 *  Arguments
 *  =========
 *
-*  N      (input) INTEGER
-*         The size of the vectors X and D.
+*     M       (input) INTEGER
+*     The number of rows of D and X. M >= 0.
 *
-*  D      (input) DOUBLE PRECISION array, length N
-*         Diagonal matrix D, stored as a vector of length N.
+*     N       (input) INTEGER
+*     The number of columns of D and X. N >= 0.
+*
+*     D       (input) DOUBLE PRECISION array, length M
+*     Diagonal matrix D, stored as a vector of length M.
+*
+*     X       (input/output) DOUBLE PRECISION array, dimension (LDX,N)
+*     On entry, the vector X to be scaled by D.
+*     On exit, the scaled vector.
+*
+*     LDX     (input) INTEGER
+*     The leading dimension of the vector X. LDX >= 0.
+*
+*  =====================================================================
 *
-*  X      (input/output) DOUBLE PRECISION array, length N
-*         On entry, the vector X to be scaled by D.
-*         On exit, the scaled vector.
-*     ..
 *     .. Local Scalars ..
       INTEGER            I, J
 *     ..
@@ -47,9 +55,9 @@
 *
       DO J = 1, N
          DO I = 1, M
-            X(I,J) = X(I,J) * D(I)
+            X( I, J ) = X( I, J ) * D( I )
          END DO
       END DO
-*
+
       RETURN
       END
index 4a0cbb92903d99022c63de52b1e5001efd63439e..a1469d817c14c4578220a65434a5481d28fb7a97 100644 (file)
@@ -36,7 +36,8 @@
 *     definite, and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS for details of the error bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED and S
index 7a05326475f195036a9dfa8671a6f2232572fd86..9024c022b739cbdc20deff79bde8a2cacbdbe395 100644 (file)
@@ -36,7 +36,7 @@
 *     provides error bounds and backward error estimates for the
 *     solution.  In addition to normwise error bound, the code provides
 *     maximum componentwise error bound if possible.  See comments for
-*     ERR_BNDS_N and ERR_BNDS_C for details of the error bounds.
+*     ERR_BNDS_NORM and ERR_BNDS_COMP for details of the error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED and S
index a9a5e031b4100662d969e17ac39a0157ac3793f9..022ecc8abc60dd24d60a0088a21a97db77747efb 100644 (file)
 *       = 'E':  The matrix A will be equilibrated if necessary, then
 *               copied to AF and factored.
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
 *     N       (input) INTEGER
 *     The number of linear equations, i.e., the order of the
 *     matrix A.  N >= 0.
index b43b63d53acb7781f66b79a6a1df619473c5cfd6..c0926b4da55c050b54a90769ae5c82ae1e98e9a0 100644 (file)
@@ -36,8 +36,8 @@
 *     equations and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS_N and ERR_BNDS_C for details of the error
-*     bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED, R
index 67625446ec45eee392519ea1a7803fe5c02bbd88..e21daf2330c5588fa5b8967612cf1fd89b60c8e3 100644 (file)
@@ -35,8 +35,8 @@
 *     equations and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS_N and ERR_BNDS_C for details of the error
-*     bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED, R
index ee18d28c4fdc6545e5ead51b35be6753cb71e195..77ffcdfd80c4f0729cb105ea1b5fcdda51b08b61 100644 (file)
 *  Arguments
 *  ==========
 *
-*  WORK     real workspace of size 5*N.
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  IWORK    integer workspace of size N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     KL      (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU      (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0.
+*
+*     AB      (input) REAL array, dimension (LDAB,N)
+*     On entry, the matrix A in band storage, in rows 1 to KL+KU+1.
+*     The j-th column of A is stored in the j-th column of the
+*     array AB as follows:
+*     AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl)
+*
+*     LDAB    (input) INTEGER
+*     The leading dimension of the array AB.  LDAB >= KL+KU+1.
+*
+*     AFB     (input) REAL array, dimension (LDAFB,N)
+*     Details of the LU factorization of the band matrix A, as
+*     computed by SGBTRF.  U is stored as an upper triangular
+*     band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1,
+*     and the multipliers used during the factorization are stored
+*     in rows KL+KU+2 to 2*KL+KU+1.
+*
+*     LDAFB   (input) INTEGER
+*     The leading dimension of the array AFB.  LDAFB >= 2*KL+KU+1.
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by SGBTRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     CMODE   (input) INTEGER
+*     Determines op2(C) in the formula op(A) * op2(C) as follows:
+*     CMODE =  1    op2(C) = C
+*     CMODE =  0    op2(C) = I
+*     CMODE = -1    op2(C) = inv(C)
+*
+*     C       (input) REAL array, dimension (N)
+*     The vector C in the formula op(A) * op2(C).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) REAL array, dimension (5*N).
+*     Workspace.
+*
+*     IWORK   (input) INTEGER array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
       ELSE IF( N.LT.0 ) THEN
          INFO = -2
       ELSE IF( KL.LT.0 .OR. KL.GT.N-1 ) THEN
-         INFO = -4
+         INFO = -3
       ELSE IF( KU.LT.0 .OR. KU.GT.N-1 ) THEN
-         INFO = -5
+         INFO = -4
       ELSE IF( LDAB.LT.KL+KU+1 ) THEN
-         INFO = -8
+         INFO = -6
       ELSE IF( LDAFB.LT.2*KL+KU+1 ) THEN
-         INFO = -10
+         INFO = -8
       END IF
       IF( INFO.NE.0 ) THEN
          CALL XERBLA( 'SLA_GBRCOND', -INFO )
index 7a5825afc5e904bf2feb23394e7d39ae36fe49cf..f5bfe3fc386e116938b402ff4da374bf8eaa0df4 100644 (file)
@@ -1,10 +1,10 @@
       SUBROUTINE SLA_GBRFSX_EXTENDED( PREC_TYPE, TRANS_TYPE, N, KL, KU,
      $                                NRHS, AB, LDAB, AFB, LDAFB, IPIV,
      $                                COLEQU, C, B, LDB, Y, LDY,
-     $                                BERR_OUT, N_NORMS, ERRS_N, ERRS_C,
-     $                                RES, AYB, DY, Y_TAIL, RCOND,
-     $                                ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                BERR_OUT, N_NORMS, ERR_BNDS_NORM,
+     $                                ERR_BNDS_COMP, RES, AYB, DY,
+     $                                Y_TAIL, RCOND, ITHRESH, RTHRESH,
+     $                                DZ_UB, IGNORE_CWISE, INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       REAL               AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES(*), DY(*), Y_TAIL(*)
       REAL               C( * ), AYB(*), RCOND, BERR_OUT(*),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
 *
-*  SLA_GBRFSX_EXTENDED computes ... .
+*  SLA_GBRFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by SGBRFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     TRANS_TYPE     (input) INTEGER
+*     Specifies the transposition operation on A.
+*     The value is defined by ILATRANS(T) where T is a CHARACTER and
+*     T    = 'N':  No transpose
+*          = 'T':  Transpose
+*          = 'C':  Conjugate transpose
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     KL             (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU             (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) REAL array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) REAL array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by SGBTRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by SGBTRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) REAL array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) REAL array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) REAL array, dimension (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by SGBTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) REAL array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by SLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) REAL array, dimension 
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) REAL array, dimension 
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) REAL array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) REAL array, dimension (N)
+*     Workspace. This can be the same workspace passed for Y_TAIL.
+*
+*     DY             (input) REAL array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) REAL array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) REAL
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) REAL
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) REAL
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to SGBTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF (N_NORMS .GE. 2) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index a1fdffdfb9415a7f98d332515637f6d47a78d6a4..33339eb1ac54c125c45f7a836a6a81701cc1eb9f 100644 (file)
 *
 *  Purpose
 *  =======
-* 
-*  SLA_GBRPVGRW computes ... .
+*
+*  SLA_GBRPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     KL      (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU      (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A.  NCOLS >= 0.
+*
+*     AB      (input) REAL array, dimension (LDAB,N)
+*     On entry, the matrix A in band storage, in rows 1 to KL+KU+1.
+*     The j-th column of A is stored in the j-th column of the
+*     array AB as follows:
+*     AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl)
+*
+*     LDAB    (input) INTEGER
+*     The leading dimension of the array AB.  LDAB >= KL+KU+1.
+*
+*     AFB     (input) REAL array, dimension (LDAFB,N)
+*     Details of the LU factorization of the band matrix A, as
+*     computed by SGBTRF.  U is stored as an upper triangular
+*     band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1,
+*     and the multipliers used during the factorization are stored
+*     in rows KL+KU+2 to 2*KL+KU+1.
+*
+*     LDAFB   (input) INTEGER
+*     The leading dimension of the array AFB.  LDAFB >= 2*KL+KU+1.
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
@@ -38,7 +75,7 @@
 *     .. Executable Statements ..
 *
       RPVGRW = 1.0
-*
+
       KD = KU + 1
       DO J = 1, NCOLS
          AMAX = 0.0
index 776d4900953745fc8cdffa8a9d2ae75b765a5622..47bb58e1df59475367eb0e381a9249748b57f37b 100644 (file)
 *  Arguments
 *  ==========
 *
-*  WORK     REAL workspace of size 3*N.
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  IWORK    INTEGER workspace of size N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     A       (input) REAL array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) REAL array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by SGETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by SGETRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     CMODE   (input) INTEGER
+*     Determines op2(C) in the formula op(A) * op2(C) as follows:
+*     CMODE =  1    op2(C) = C
+*     CMODE =  0    op2(C) = I
+*     CMODE = -1    op2(C) = inv(C)
+*
+*     C       (input) REAL array, dimension (N)
+*     The vector C in the formula op(A) * op2(C).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) REAL array, dimension (3*N).
+*     Workspace.
+*
+*     IWORK   (input) INTEGER array, dimension (N).
+*     Workspace.2
 *
 *  =====================================================================
 *
          INFO = -1
       ELSE IF( N.LT.0 ) THEN
          INFO = -2
+      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
+         INFO = -4
+      ELSE IF( LDAF.LT.MAX( 1, N ) ) THEN
+         INFO = -6
       END IF
       IF( INFO.NE.0 ) THEN
          CALL XERBLA( 'SLA_GERCOND', -INFO )
index 6681e5b073e136c39ff82eac85a9684d955245a8..c3a4478e6ab1f84bf79648facbffeb1d66e4bfb2 100644 (file)
@@ -1,9 +1,10 @@
       SUBROUTINE SLA_GERFSX_EXTENDED( PREC_TYPE, TRANS_TYPE, N, NRHS, A,
      $                                LDA, AF, LDAF, IPIV, COLEQU, C, B,
      $                                LDB, Y, LDY, BERR_OUT, N_NORMS,
-     $                                ERRS_N, ERRS_C, RES, AYB, DY,
-     $                                Y_TAIL, RCOND, ITHRESH, RTHRESH,
-     $                                DZ_UB, IGNORE_CWISE, INFO )
+     $                                ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
+     $                                AYB, DY, Y_TAIL, RCOND, ITHRESH,
+     $                                RTHRESH, DZ_UB, IGNORE_CWISE,
+     $                                INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       REAL               A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       REAL               C( * ), AYB( * ), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
-* 
-*  SLA_GERFSX_EXTENDED computes ... .
+*
+*  SLA_GERFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by SGERFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     TRANS_TYPE     (input) INTEGER
+*     Specifies the transposition operation on A.
+*     The value is defined by ILATRANS(T) where T is a CHARACTER and
+*     T    = 'N':  No transpose
+*          = 'T':  Transpose
+*          = 'C':  Conjugate transpose
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) REAL array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) REAL array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by SGETRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by SGETRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) REAL array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) REAL array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) REAL array, dimension (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by SGETRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) REAL array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by SLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) REAL array, dimension (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) REAL array, dimension (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) REAL array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) REAL array, dimension (N)
+*     Workspace. This can be the same workspace passed for Y_TAIL.
+*
+*     DY             (input) REAL array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) REAL array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) REAL
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) REAL
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) REAL
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to SGETRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds
 *
          IF (N_NORMS .GE. 1) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF ( N_NORMS .GE. 2 ) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index 74cb2c9f99367506d922f521716636a6c89a0292..7a92d17aa03692841d09c6a0633d6c8c958d497c 100644 (file)
 *  Purpose
 *  =======
 *
-*     SLA_LIN_BERR computes component-wise relative backward error from
+*     SLA_LIN_BERR computes componentwise relative backward error from
 *     the formula
 *         max(i) ( abs(R(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
-*     where abs(Z) is the component-wise absolute value of the matrix
+*     where abs(Z) is the componentwise absolute value of the matrix
 *     or vector Z.
 *
+*  Arguments
+*  ==========
+*
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NZ      (input) INTEGER
+*     We add (NZ+1)*SLAMCH( 'Safe minimum' ) to R(i) in the numerator to
+*     guard against spuriously zero residuals. Default value is N.
+*
+*     NRHS    (input) INTEGER
+*     The number of right hand sides, i.e., the number of columns
+*     of the matrices AYB, RES, and BERR.  NRHS >= 0.
+*
+*     RES    (input) REAL array, dimension (N,NRHS)
+*     The residual matrix, i.e., the matrix R in the relative backward
+*     error formula above.
+*
+*     AYB    (input) REAL array, dimension (N, NRHS)
+*     The denominator in the relative backward error formula above, i.e.,
+*     the matrix abs(op(A_s))*abs(Y) + abs(B_s). The matrices A, Y, and B
+*     are from iterative refinement (see sla_gerfsx_extended.f).
+*     
+*     RES    (output) REAL array, dimension (NRHS)
+*     The componentwise relative backward error from the formula above.
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 65134d9dcadf84107c8d6cbf6f2f51ea4cc9ae5b..c64a2cb13c7fe1f85fefd416f72cac5cdf931bd0 100644 (file)
 *  Arguments
 *  ==========
 *
-*     WORK    real workspace of size 3*N, and
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*     IWORK   integer workspace of size N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     A       (input) REAL array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) REAL array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by SPOTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     CMODE   (input) INTEGER
+*     Determines op2(C) in the formula op(A) * op2(C) as follows:
+*     CMODE =  1    op2(C) = C
+*     CMODE =  0    op2(C) = I
+*     CMODE = -1    op2(C) = inv(C)
+*
+*     C       (input) REAL array, dimension (N)
+*     The vector C in the formula op(A) * op2(C).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) REAL array, dimension (3*N).
+*     Workspace.
+*
+*     IWORK   (input) INTEGER array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index 06c7efffa9b26fe93e2079cc97708de664b15c79..e314098e316fde2691c98486b8f62961b634ab62 100644 (file)
@@ -1,9 +1,10 @@
       SUBROUTINE SLA_PORFSX_EXTENDED( PREC_TYPE, UPLO, N, NRHS, A, LDA,
      $                                AF, LDAF, COLEQU, C, B, LDB, Y,
-     $                                LDY, BERR_OUT, N_NORMS, ERRS_N,
-     $                                ERRS_C, RES, AYB, DY, Y_TAIL,
-     $                                RCOND, ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                LDY, BERR_OUT, N_NORMS,
+     $                                ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
+     $                                AYB, DY, Y_TAIL, RCOND, ITHRESH,
+     $                                RTHRESH, DZ_UB, IGNORE_CWISE,
+     $                                INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       REAL               A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       REAL               C( * ), AYB(*), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
 *
-*  SLA_PORFSX_EXTENDED computes ... .
+*  SLA_PORFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by SPORFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) REAL array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) REAL array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by SPOTRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) REAL array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) REAL array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) REAL array, dimension (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by SPOTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) REAL array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by SLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) REAL array, dimension (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) REAL array, dimension (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) REAL array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) REAL array, dimension (N)
+*     Workspace. This can be the same workspace passed for Y_TAIL.
+*
+*     DY             (input) REAL array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) REAL array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) REAL
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) REAL
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) REAL
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to SPOTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF ( N_NORMS .GE. 2 ) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index 05b89df04825e86382a29d7a2b0c331deaae59c2..aba969a0d7f8f060a342f99e10ba2ab481ddc230 100644 (file)
 *  Purpose
 *  =======
 * 
-*  SLA_PORPVGRW computes ... .
+*  SLA_PORPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) REAL array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) REAL array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by SPOTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     WORK    (input) REAL array, dimension (2*N)
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 1eba009fd9583025368341f636c1d643c384d85e..ecd0369fd8224f49767385c7b1c5a35067d011a4 100644 (file)
 *
 *  Purpose
 *  =======
-* 
-*  SLA_RPVGRW computes ... .
+*
+*  SLA_RPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) REAL array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) REAL array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by SGETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
@@ -37,7 +62,7 @@
 *     .. Executable Statements ..
 *
       RPVGRW = 1.0
-*
+
       DO J = 1, NCOLS
          AMAX = 0.0
          UMAX = 0.0
index 564b6578233f564ccfec068633e35514c75d204e..514e79fe7b553b9a23adb1060d239e8ac37f1ba2 100644 (file)
 *  Arguments
 *  ==========
 *
-*  WORK    real workspace of size 3*N.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  IWORK   integer workspace of size N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     A       (input) REAL array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) REAL array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by SSYTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by SSYTRF.
+*
+*     CMODE   (input) INTEGER
+*     Determines op2(C) in the formula op(A) * op2(C) as follows:
+*     CMODE =  1    op2(C) = C
+*     CMODE =  0    op2(C) = I
+*     CMODE = -1    op2(C) = inv(C)
+*
+*     C       (input) REAL array, dimension (N)
+*     The vector C in the formula op(A) * op2(C).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) REAL array, dimension (3*N).
+*     Workspace.
+*
+*     IWORK   (input) INTEGER array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
             END DO
 
             IF ( UP ) THEN
-               call ssytrs( 'U', n, 1, af, ldaf, ipiv, work, n, info )
+               CALL SSYTRS( 'U', N, 1, AF, LDAF, IPIV, WORK, N, INFO )
             ELSE
-               call ssytrs( 'L', n, 1, af, ldaf, ipiv, work, n, info )
+               CALL SSYTRS( 'L', N, 1, AF, LDAF, IPIV, WORK, N, INFO )
             ENDIF
 *
 *           Multiply by inv(C).
             END IF
 
             IF ( UP ) THEN
-               call ssytrs( 'U', n, 1, af, ldaf, ipiv, work, n, info )
+               CALL SSYTRS( 'U', N, 1, AF, LDAF, IPIV, WORK, N, INFO )
             ELSE
-               call ssytrs( 'L', n, 1, af, ldaf, ipiv, work, n, info )
+               CALL SSYTRS( 'L', N, 1, AF, LDAF, IPIV, WORK, N, INFO )
             ENDIF
 *
 *           Multiply by R.
index 332316c1526f809ff0c45ddb5538a6ce335c17c5..ae2b279377f938c2bed2be2f0cae0c9a236b4eb9 100644 (file)
@@ -1,9 +1,10 @@
       SUBROUTINE SLA_SYRFSX_EXTENDED( PREC_TYPE, UPLO, N, NRHS, A, LDA,
      $                                AF, LDAF, IPIV, COLEQU, C, B, LDB,
-     $                                Y, LDY, BERR_OUT, N_NORMS, ERRS_N,
-     $                                ERRS_C, RES, AYB, DY, Y_TAIL,
-     $                                RCOND, ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                Y, LDY, BERR_OUT, N_NORMS,
+     $                                ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
+     $                                AYB, DY, Y_TAIL, RCOND, ITHRESH,
+     $                                RTHRESH, DZ_UB, IGNORE_CWISE,
+     $                                INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       REAL               A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       REAL               C( * ), AYB( * ), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
 * 
-*  SLA_SYRFSX_EXTENDED computes ... .
+*  SLA_SYRFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by SSYRFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) REAL array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) REAL array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by SSYTRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by SSYTRF.
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) REAL array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) REAL array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) REAL array, dimension (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by SSYTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) REAL array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by SLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) REAL array, dimension (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) REAL array, dimension (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) REAL array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) REAL array, dimension (N)
+*     Workspace. This can be the same workspace passed for Y_TAIL.
+*
+*     DY             (input) REAL array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) REAL array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) REAL
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) REAL
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) REAL
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to SSYTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF ( N_NORMS .GE. 2 ) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index a61e6e4add487c19f95585478078bc0ec4640793..7d435d65d04a71fdaab700b3f3013e75a3cce691 100644 (file)
 *  Purpose
 *  =======
 * 
-*  SLA_SYRPVGRW computes ... .
+*  SLA_SYRPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     INFO    (input) INTEGER
+*     The value of INFO returned from SSYTRF, .i.e., the pivot in
+*     column INFO is exactly 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) REAL array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) REAL array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by SSYTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by SSYTRF.
+*
+*     WORK    (input) REAL array, dimension (2*N)
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 01a72a646ab59d2381d817cd0f900270a511d3c4..db524fca4b6f3fbe414e0009491ebc257dc3af0c 100644 (file)
 *  Arguments
 *  =========
 *
-*  N      (input) INTEGER
-*         The size of the vectors X and D.
+*     M       (input) INTEGER
+*     The number of rows of D and X. M >= 0.
 *
-*  D      (input) REAL array, length N
-*         Diagonal matrix D, stored as a vector of length N.
+*     N       (input) INTEGER
+*     The number of columns of D and X. N >= 0.
+*
+*     D       (input) REAL array, length M
+*     Diagonal matrix D, stored as a vector of length M.
+*
+*     X       (input/output) REAL array, dimension (LDX,N)
+*     On entry, the vector X to be scaled by D.
+*     On exit, the scaled vector.
+*
+*     LDX     (input) INTEGER
+*     The leading dimension of the vector X. LDX >= 0.
+*
+*  =====================================================================
 *
-*  X      (input/output) REAL array, length N
-*         On entry, the vector X to be scaled by D.
-*         On exit, the scaled vector.
-*     ..
 *     .. Local Scalars ..
       INTEGER            I, J
 *     ..
@@ -47,9 +55,9 @@
 *
       DO J = 1, N
          DO I = 1, M
-            X(I,J) = X(I,J) / D(I)
+            X( I, J ) = X( I, J ) / D( I )
          END DO
       END DO
-*
+
       RETURN
       END
index 1435a86f7821b3d37857753f30218477efb66606..b2802299476a5ca3ceb971183eab7b148a6ea7a0 100644 (file)
 *  Arguments
 *  =========
 *
-*  N      (input) INTEGER
-*         The size of the vectors X and D.
+*     M       (input) INTEGER
+*     The number of rows of D and X. M >= 0.
 *
-*  D      (input) REAL array, length N
-*         Diagonal matrix D, stored as a vector of length N.
+*     N       (input) INTEGER
+*     The number of columns of D and X. N >= 0.
+*
+*     D       (input) REAL array, length M
+*     Diagonal matrix D, stored as a vector of length M.
+*
+*     X       (input/output) REAL array, dimension (LDX,N)
+*     On entry, the vector X to be scaled by D.
+*     On exit, the scaled vector.
+*
+*     LDX     (input) INTEGER
+*     The leading dimension of the vector X. LDX >= 0.
+*
+*  =====================================================================
 *
-*  X      (input/output) REAL array, length N
-*         On entry, the vector X to be scaled by D.
-*         On exit, the scaled vector.
-*     ..
 *     .. Local Scalars ..
       INTEGER            I, J
 *     ..
@@ -47,9 +55,9 @@
 *
       DO J = 1, N
          DO I = 1, M
-            X(I,J) = X(I,J) * D(I)
+            X( I, J ) = X( I, J ) * D( I )
          END DO
       END DO
-*
+
       RETURN
       END
index f9d3bba11f777f971c6417ae3db1c74dbc9c65b9..e6d548c7e688bdfa4df9324ebe0eeece01f727ae 100644 (file)
@@ -36,7 +36,8 @@
 *     definite, and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS for details of the error bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED and S
index b7f9fe206e4aecda362b7d8b2fa8c68c12b9187f..07d3c85b5571810259b68f370908d97fc30450b6 100644 (file)
@@ -36,7 +36,7 @@
 *     provides error bounds and backward error estimates for the
 *     solution.  In addition to normwise error bound, the code provides
 *     maximum componentwise error bound if possible.  See comments for
-*     ERR_BNDS_N and ERR_BNDS_C for details of the error bounds.
+*     ERR_BNDS_NORM and ERR_BNDS_COMP for details of the error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED and S
index 810a3259f882695c6551c787b8a1fade535ec468..d4121db366c048f4e3b7b79f3922943604319928 100644 (file)
 *       = 'E':  The matrix A will be equilibrated if necessary, then
 *               copied to AF and factored.
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
 *     N       (input) INTEGER
 *     The number of linear equations, i.e., the order of the
 *     matrix A.  N >= 0.
index 6ec6c24a843df48465ed9d5cfd81477d709470ea..c2b59a983e597026c0db5a458ef1e8c313c53ffe 100644 (file)
@@ -36,8 +36,8 @@
 *     equations and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS_N and ERR_BNDS_C for details of the error
-*     bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED, R
index 62046b310746b9775f4532de60f9d256c77b945f..386e92d78ec68e83973604f3f94de6672160f5fa 100644 (file)
@@ -35,8 +35,8 @@
 *     equations and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS_N and ERR_BNDS_C for details of the error
-*     bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED, R
index 35a1fd08ceae091f69a560f6ece4916809469d3c..18bed507496aa1e18eabf579a8dd825b5694c4be 100644 (file)
@@ -1,4 +1,4 @@
-      Subroutine ZHERFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, IPIV,
+      SUBROUTINE ZHERFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, IPIV,
      $                    S, B, LDB, X, LDX, RCOND, BERR, N_ERR_BNDS,
      $                    ERR_BNDS_NORM, ERR_BNDS_COMP, NPARAMS, PARAMS,
      $                    WORK, RWORK, INFO )
@@ -35,7 +35,7 @@
 *     provides error bounds and backward error estimates for the
 *     solution.  In addition to normwise error bound, the code provides
 *     maximum componentwise error bound if possible.  See comments for
-*     ERR_BNDS_N and ERR_BNDS_C for details of the error bounds.
+*     ERR_BNDS_NORM and ERR_BNDS_COMP for details of the error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED and S
index a703c97a1cd48808c3226f81b08a594baeb0ff70..40d28ab880043f8bf08431a1b9137d319d38a967 100644 (file)
 *     IPIV    (input or output) INTEGER array, dimension (N)
 *     If FACT = 'F', then IPIV is an input argument and on entry
 *     contains details of the interchanges and the block
-*     structure of D, as determined by DSYTRF.  If IPIV(k) > 0,
+*     structure of D, as determined by ZHETRF.  If IPIV(k) > 0,
 *     then rows and columns k and IPIV(k) were interchanged and
 *     D(k,k) is a 1-by-1 diagonal block.  If UPLO = 'U' and
 *     IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and
 *
 *     If FACT = 'N', then IPIV is an output argument and on exit
 *     contains details of the interchanges and the block
-*     structure of D, as determined by DSYTRF.
+*     structure of D, as determined by ZHETRF.
 *
 *     EQUED   (input or output) CHARACTER*1
 *     Specifies the form of equilibration that was done.
index 7e6e5765c07c4148134be0a24ae012cf0761b60a..16cc3dd660043e24ce7e2a1169c67a7c1ef0a1fe 100644 (file)
@@ -1,6 +1,7 @@
-      DOUBLE PRECISION FUNCTION ZLA_GBRCOND_C( TRANS, N, KL, KU, AB,
-     $                             LDAB, AFB, LDAFB, IPIV, C, CAPPLY,
-     $                             INFO, WORK, RWORK )
+      DOUBLE PRECISION FUNCTION ZLA_GBRCOND_C( TRANS, N, KL, KU, AB, 
+     $                                         LDAB, AFB, LDAFB, IPIV,
+     $                                         C, CAPPLY, INFO, WORK,
+     $                                         RWORK )
 *
 *     -- LAPACK routine (version 3.2.1)                               --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  =========
 *
-*  C      DOUBLE PRECISION vector.
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  WORK   COMPLEX*16 workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK  DOUBLE PRECISION workspace of size N.
+*     KL      (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU      (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0.
+*
+*     AB      (input) COMPLEX*16 array, dimension (LDAB,N)
+*     On entry, the matrix A in band storage, in rows 1 to KL+KU+1.
+*     The j-th column of A is stored in the j-th column of the
+*     array AB as follows:
+*     AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl)
+*
+*     LDAB    (input) INTEGER
+*     The leading dimension of the array AB.  LDAB >= KL+KU+1.
+*
+*     AFB     (input) COMPLEX*16 array, dimension (LDAFB,N)
+*     Details of the LU factorization of the band matrix A, as
+*     computed by ZGBTRF.  U is stored as an upper triangular
+*     band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1,
+*     and the multipliers used during the factorization are stored
+*     in rows KL+KU+2 to 2*KL+KU+1.
+*
+*     LDAFB   (input) INTEGER
+*     The leading dimension of the array AFB.  LDAFB >= 2*KL+KU+1.
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by ZGBTRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     C       (input) DOUBLE PRECISION array, dimension (N)
+*     The vector C in the formula op(A) * inv(diag(C)).
+*
+*     CAPPLY  (input) LOGICAL
+*     If .TRUE. then access the vector C in the formula above.
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) DOUBLE PRECISION array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
       NOTRANS = LSAME( TRANS, 'N' )
       IF ( .NOT. NOTRANS .AND. .NOT. LSAME( TRANS, 'T' ) .AND. .NOT.
      $     LSAME( TRANS, 'C' ) ) THEN
+         INFO = -1
       ELSE IF( N.LT.0 ) THEN
          INFO = -2
       ELSE IF( KL.LT.0 .OR. KL.GT.N-1 ) THEN
-         INFO = -4
+         INFO = -3
       ELSE IF( KU.LT.0 .OR. KU.GT.N-1 ) THEN
-         INFO = -5
+         INFO = -4
       ELSE IF( LDAB.LT.KL+KU+1 ) THEN
-         INFO = -8
+         INFO = -6
       ELSE IF( LDAFB.LT.2*KL+KU+1 ) THEN
-         INFO = -10
+         INFO = -8
       END IF
       IF( INFO.NE.0 ) THEN
          CALL XERBLA( 'ZLA_GBRCOND_C', -INFO )
index ac4d6471b816333c409a3102a5512a6c25fcf066..b719a2eb54259ed20e4ec086f31488bd2a57ebc0 100644 (file)
@@ -1,6 +1,6 @@
       DOUBLE PRECISION FUNCTION ZLA_GBRCOND_X( TRANS, N, KL, KU, AB,
-     $                             LDAB, AFB, LDAFB, IPIV, X, INFO,
-     $     WORK, RWORK )
+     $                                         LDAB, AFB, LDAFB, IPIV,
+     $                                         X, INFO, WORK, RWORK )
 *
 *     -- LAPACK routine (version 3.2.1)                               --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  =========
 *
-*  X      COMPLEX*16 vector.
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  WORK   COMPLEX*16 workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK  DOUBLE PRECISION workspace of size N.
+*     KL      (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU      (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0.
+*
+*     AB      (input) COMPLEX*16 array, dimension (LDAB,N)
+*     On entry, the matrix A in band storage, in rows 1 to KL+KU+1.
+*     The j-th column of A is stored in the j-th column of the
+*     array AB as follows:
+*     AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl)
+*
+*     LDAB    (input) INTEGER
+*     The leading dimension of the array AB.  LDAB >= KL+KU+1.
+*
+*     AFB     (input) COMPLEX*16 array, dimension (LDAFB,N)
+*     Details of the LU factorization of the band matrix A, as
+*     computed by ZGBTRF.  U is stored as an upper triangular
+*     band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1,
+*     and the multipliers used during the factorization are stored
+*     in rows KL+KU+2 to 2*KL+KU+1.
+*
+*     LDAFB   (input) INTEGER
+*     The leading dimension of the array AFB.  LDAFB >= 2*KL+KU+1.
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by ZGBTRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     X       (input) COMPLEX*16 array, dimension (N)
+*     The vector X in the formula op(A) * diag(X).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) DOUBLE PRECISION array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
       ELSE IF( N.LT.0 ) THEN
          INFO = -2
       ELSE IF( KL.LT.0 .OR. KL.GT.N-1 ) THEN
-         INFO = -4
+         INFO = -3
       ELSE IF( KU.LT.0 .OR. KU.GT.N-1 ) THEN
-         INFO = -5
+         INFO = -4
       ELSE IF( LDAB.LT.KL+KU+1 ) THEN
-         INFO = -8
+         INFO = -6
       ELSE IF( LDAFB.LT.2*KL+KU+1 ) THEN
-         INFO = -10
+         INFO = -8
       END IF
       IF( INFO.NE.0 ) THEN
          CALL XERBLA( 'ZLA_GBRCOND_X', -INFO )
index 72ccb7930c1ea9063242c74456f9702c114d0dfa..abd046cd6c9ce5e62e1e051887e89c04a9f1d6b0 100644 (file)
@@ -1,10 +1,10 @@
       SUBROUTINE ZLA_GBRFSX_EXTENDED( PREC_TYPE, TRANS_TYPE, N, KL, KU,
      $                                NRHS, AB, LDAB, AFB, LDAFB, IPIV,
      $                                COLEQU, C, B, LDB, Y, LDY,
-     $                                BERR_OUT, N_NORMS, ERRS_N, ERRS_C,
-     $                                RES, AYB, DY, Y_TAIL, RCOND,
-     $                                ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                BERR_OUT, N_NORMS, ERR_BNDS_NORM,
+     $                                ERR_BNDS_COMP, RES, AYB, DY,
+     $                                Y_TAIL, RCOND, ITHRESH, RTHRESH,
+     $                                DZ_UB, IGNORE_CWISE, INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       COMPLEX*16         AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       DOUBLE PRECISION   C( * ), AYB(*), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
-* 
-*  ZLA_GBRFSX_EXTENDED computes ... .
+*
+*  ZLA_GBRFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by ZGBRFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     TRANS_TYPE     (input) INTEGER
+*     Specifies the transposition operation on A.
+*     The value is defined by ILATRANS(T) where T is a CHARACTER and
+*     T    = 'N':  No transpose
+*          = 'T':  Transpose
+*          = 'C':  Conjugate transpose
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     KL             (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU             (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     AB             (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDAB           (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AFB            (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by ZGBTRF.
+*
+*     LDAFB          (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by ZGBTRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) DOUBLE PRECISION array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) COMPLEX*16 array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) COMPLEX*16 array, dimension (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by ZGBTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) DOUBLE PRECISION array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by ZLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace.
+*
+*     DY             (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) DOUBLE PRECISION
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) DOUBLE PRECISION
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) DOUBLE PRECISION
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to ZGBTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF ( N_NORMS .GE. 2 ) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index c0c74477b55f0023a235c698f8d3f33c24006ca8..6ef64db588412352f3b9e557ea43034f0b645cce 100644 (file)
@@ -1,5 +1,5 @@
-      DOUBLE PRECISION FUNCTION ZLA_GBRPVGRW( N, KL, KU, NCOLS, AB, 
-     $                            LDAB, AFB, LDAFB )
+      DOUBLE PRECISION FUNCTION ZLA_GBRPVGRW( N, KL, KU, NCOLS, AB,
+     $                                        LDAB, AFB, LDAFB )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *
 *  Purpose
 *  =======
-* 
-*  ZLA_GBRPVGRW computes ... .
+*
+*  ZLA_GBRPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     KL      (input) INTEGER
+*     The number of subdiagonals within the band of A.  KL >= 0.
+*
+*     KU      (input) INTEGER
+*     The number of superdiagonals within the band of A.  KU >= 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A.  NCOLS >= 0.
+*
+*     AB      (input) COMPLEX*16 array, dimension (LDAB,N)
+*     On entry, the matrix A in band storage, in rows 1 to KL+KU+1.
+*     The j-th column of A is stored in the j-th column of the
+*     array AB as follows:
+*     AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl)
+*
+*     LDAB    (input) INTEGER
+*     The leading dimension of the array AB.  LDAB >= KL+KU+1.
+*
+*     AFB     (input) COMPLEX*16 array, dimension (LDAFB,N)
+*     Details of the LU factorization of the band matrix A, as
+*     computed by ZGBTRF.  U is stored as an upper triangular
+*     band matrix with KL+KU superdiagonals in rows 1 to KL+KU+1,
+*     and the multipliers used during the factorization are stored
+*     in rows KL+KU+2 to 2*KL+KU+1.
+*
+*     LDAFB   (input) INTEGER
+*     The leading dimension of the array AFB.  LDAFB >= 2*KL+KU+1.
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
@@ -45,7 +82,7 @@
 *     .. Executable Statements ..
 *
       RPVGRW = 1.0D+0
-*
+
       KD = KU + 1
       DO J = 1, NCOLS
          AMAX = 0.0D+0
index 26ec26b2b9cc223fb30725fc8c0c18b5b36ce461..9eefdc96877965889a544cac8f48139fbe47ced8 100644 (file)
@@ -1,6 +1,6 @@
       DOUBLE PRECISION FUNCTION ZLA_GERCOND_C( TRANS, N, A, LDA, AF, 
-     $                             LDAF, IPIV, C, CAPPLY, INFO, WORK, 
-     $     RWORK )
+     $                                         LDAF, IPIV, C, CAPPLY,
+     $                                         INFO, WORK, RWORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  =========
 *
-*  C     DOUBLE PRECISION vector.
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  WORK  COMPLEX*16 workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK DOUBLE PRECISION workspace of size N.
+*     A       (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by ZGETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by ZGETRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     C       (input) DOUBLE PRECISION array, dimension (N)
+*     The vector C in the formula op(A) * inv(diag(C)).
+*
+*     CAPPLY  (input) LOGICAL
+*     If .TRUE. then access the vector C in the formula above.
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) DOUBLE PRECISION array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index 1f9ea9cf13ad9c4f38290a53c45fd1e5760c315b..988fb4286f99dadae8eacc3c1d75d23f7af34217 100644 (file)
@@ -1,5 +1,6 @@
-      DOUBLE PRECISION FUNCTION ZLA_GERCOND_X( TRANS, N, A, LDA, AF, 
-     $                             LDAF, IPIV, X, INFO, WORK, RWORK )
+      DOUBLE PRECISION FUNCTION ZLA_GERCOND_X( TRANS, N, A, LDA, AF,
+     $                                         LDAF, IPIV, X, INFO,
+     $                                         WORK, RWORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  =========
 *
-*  C     COMPLEX*16 vector.
+*     TRANS   (input) CHARACTER*1
+*     Specifies the form of the system of equations:
+*       = 'N':  A * X = B     (No transpose)
+*       = 'T':  A**T * X = B  (Transpose)
+*       = 'C':  A**H * X = B  (Conjugate Transpose = Transpose)
 *
-*  WORK  COMPLEX*16 workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK DOUBLE PRECISION workspace of size N.
+*     A       (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by ZGETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by ZGETRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     X       (input) COMPLEX*16 array, dimension (N)
+*     The vector X in the formula op(A) * diag(X).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) DOUBLE PRECISION array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index a572550564dddc2dfc846056c820e9b5be8d33d9..e2a38d68580ae6b5a753c5f2078e2dc0ae17c5b0 100644 (file)
 *
 *  Purpose
 *  =======
-* 
-*  ZLA_GERFSX_EXTENDED computes ... .
+*
+*  ZLA_GERFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by ZGERFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     TRANS_TYPE     (input) INTEGER
+*     Specifies the transposition operation on A.
+*     The value is defined by ILATRANS(T) where T is a CHARACTER and
+*     T    = 'N':  No transpose
+*          = 'T':  Transpose
+*          = 'C':  Conjugate transpose
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by ZGETRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     The pivot indices from the factorization A = P*L*U
+*     as computed by ZGETRF; row i of the matrix was interchanged
+*     with row IPIV(i).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) DOUBLE PRECISION array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) COMPLEX*16 array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) COMPLEX*16 array, dimension (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by ZGETRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) DOUBLE PRECISION array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by ZLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace.
+*
+*     DY             (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) DOUBLE PRECISION
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) DOUBLE PRECISION
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) DOUBLE PRECISION
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to ZGETRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 5334234be6d2bc447cb2552dac1799281f7d701a..b893ad3fb0220f5240a83663b4a313116cf429d8 100644 (file)
@@ -1,6 +1,6 @@
       DOUBLE PRECISION FUNCTION ZLA_HERCOND_C( UPLO, N, A, LDA, AF, 
-     $                             LDAF, IPIV, C, CAPPLY, INFO, WORK, 
-     $     RWORK )
+     $                                         LDAF, IPIV, C, CAPPLY,
+     $                                         INFO, WORK, RWORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  =========
 *
-*  C     DOUBLE PRECISION  vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK  COMPLEX*16 workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK DOUBLE PRECISION workspace of size N.
+*     A       (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by ZHETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by CHETRF.
+*
+*     C       (input) DOUBLE PRECISION array, dimension (N)
+*     The vector C in the formula op(A) * inv(diag(C)).
+*
+*     CAPPLY  (input) LOGICAL
+*     If .TRUE. then access the vector C in the formula above.
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) DOUBLE PRECISION array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index a082dd775ed9216fd9603d1e4f119f7d530f71fe..391492342b28cdbe9fdeafd1c7c62683df875439 100644 (file)
@@ -1,5 +1,6 @@
-      DOUBLE PRECISION FUNCTION ZLA_HERCOND_X( UPLO, N, A, LDA, AF, 
-     $                             LDAF, IPIV, X, INFO, WORK, RWORK )
+      DOUBLE PRECISION FUNCTION ZLA_HERCOND_X( UPLO, N, A, LDA, AF,
+     $                                         LDAF, IPIV, X, INFO,
+     $                                         WORK, RWORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  =========
 *
-*  C     COMPLEX*16 vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK  COMPLEX*16 workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK DOUBLE PRECISION workspace of size N.
+*     A       (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by ZHETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by CHETRF.
+*
+*     X       (input) COMPLEX*16 array, dimension (N)
+*     The vector X in the formula op(A) * diag(X).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) DOUBLE PRECISION array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index d172b87345f89b2791fe715d7d312ee2e6c5650f..f7926300ac2d91b74df12ba080dc68f4b80319ac 100644 (file)
@@ -1,9 +1,10 @@
       SUBROUTINE ZLA_HERFSX_EXTENDED( PREC_TYPE, UPLO, N, NRHS, A, LDA,
      $                                AF, LDAF, IPIV, COLEQU, C, B, LDB,
-     $                                Y, LDY, BERR_OUT, N_NORMS, ERRS_N,
-     $                                ERRS_C, RES, AYB, DY, Y_TAIL,
-     $                                RCOND, ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                Y, LDY, BERR_OUT, N_NORMS,
+     $                                ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
+     $                                AYB, DY, Y_TAIL, RCOND, ITHRESH,
+     $                                RTHRESH, DZ_UB, IGNORE_CWISE,
+     $                                INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       COMPLEX*16         A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       DOUBLE PRECISION   C( * ), AYB( * ), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
 *
-*  ZLA_HERFSX_EXTENDED computes ... .
+*  ZLA_HERFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by ZHERFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by ZHETRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by ZHETRF.
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) DOUBLE PRECISION array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) COMPLEX*16 array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) COMPLEX*16 array, dimension
+*                    (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by ZHETRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) DOUBLE PRECISION array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by ZLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace.
+*
+*     DY             (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) DOUBLE PRECISION
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) DOUBLE PRECISION
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) DOUBLE PRECISION
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to ZHETRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
       DOUBLE PRECISION   DLAMCH
 *     ..
 *     .. Intrinsic Functions ..
-      INTRINSIC          ABS, REAL, DIMAG, MAX, MIN
+      INTRINSIC          ABS, DBLE, DIMAG, MAX, MIN
 *     ..
 *     .. Statement Functions ..
       DOUBLE PRECISION   CABS1
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF (N_NORMS .GE. 2) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index 425258317907a62869d34e8b3d11e36f50706dee..f93c1ad694f6287142a1640360f988cb039714a3 100644 (file)
@@ -1,5 +1,5 @@
       DOUBLE PRECISION FUNCTION ZLA_HERPVGRW( UPLO, N, INFO, A, LDA, AF,
-     $                             LDAF, IPIV, WORK )
+     $                                        LDAF, IPIV, WORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Purpose
 *  =======
 * 
-*  ZLA_HERPVGRW computes ... .
+*  ZLA_HERPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     INFO    (input) INTEGER
+*     The value of INFO returned from ZHETRF, .i.e., the pivot in
+*     column INFO is exactly 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by ZHETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by ZHETRF.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N)
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 02a81f5b72e022a69b30ef4ad9d1ef4c2a9fc906..7a21e4e92b71664042091cbe3b811affcc3d385c 100644 (file)
 *     where abs(Z) is the componentwise absolute value of the matrix
 *     or vector Z.
 *
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NZ      (input) INTEGER
+*     We add (NZ+1)*SLAMCH( 'Safe minimum' ) to R(i) in the numerator to
+*     guard against spuriously zero residuals. Default value is N.
+*
+*     NRHS    (input) INTEGER
+*     The number of right hand sides, i.e., the number of columns
+*     of the matrices AYB, RES, and BERR.  NRHS >= 0.
+*
+*     RES    (input) DOUBLE PRECISION array, dimension (N,NRHS)
+*     The residual matrix, i.e., the matrix R in the relative backward
+*     error formula above.
+*
+*     AYB    (input) DOUBLE PRECISION array, dimension (N, NRHS)
+*     The denominator in the relative backward error formula above, i.e.,
+*     the matrix abs(op(A_s))*abs(Y) + abs(B_s). The matrices A, Y, and B
+*     are from iterative refinement (see zla_gerfsx_extended.f).
+*     
+*     RES    (output) COMPLEX*16 array, dimension (NRHS)
+*     The componentwise relative backward error from the formula above.
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 17b01967217d6dd7717ab1bc7b84e920e30144a6..14f54cce9126ec0b32e2a1222beace9f2aa69c09 100644 (file)
@@ -1,5 +1,6 @@
       DOUBLE PRECISION FUNCTION ZLA_PORCOND_C( UPLO, N, A, LDA, AF, 
-     $                             LDAF, C, CAPPLY, INFO, WORK, RWORK )
+     $                                         LDAF, C, CAPPLY, INFO,
+     $                                         WORK, RWORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Purpose
 *  =======
 *
-*     DLA_PORCOND_C Computes the infinity norm condition number of
+*     ZLA_PORCOND_C Computes the infinity norm condition number of
 *     op(A) * inv(diag(C)) where C is a DOUBLE PRECISION vector
 *
 *  Arguments
 *  =========
 *
-*  C     DOUBLE PRECISION  vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK  COMPLEX*16 workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK DOUBLE PRECISION workspace of size N.
+*     A       (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by ZPOTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     C       (input) DOUBLE PRECISION array, dimension (N)
+*     The vector C in the formula op(A) * inv(diag(C)).
+*
+*     CAPPLY  (input) LOGICAL
+*     If .TRUE. then access the vector C in the formula above.
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) DOUBLE PRECISION array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index 3b93670ea3cf37177acda2893672db959a5d75bc..93b292e83e5201a32ffe569752a51032aae5cfda 100644 (file)
@@ -1,5 +1,6 @@
-      DOUBLE PRECISION FUNCTION ZLA_PORCOND_X( UPLO, N, A, LDA, AF, 
-     $                             LDAF, X, INFO, WORK, RWORK )
+      DOUBLE PRECISION FUNCTION ZLA_PORCOND_X( UPLO, N, A, LDA, AF,
+     $                                         LDAF, X, INFO, WORK,
+     $                                         RWORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  =========
 *
-*  C     COMPLEX*16 vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK  COMPLEX*16 workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK DOUBLE PRECISION workspace of size N.
+*     A       (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by ZPOTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     X       (input) COMPLEX*16 array, dimension (N)
+*     The vector X in the formula op(A) * diag(X).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) DOUBLE PRECISION array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index d619232ac62ca66e81158567b77d4e024dc52045..88e4bfb644616106468cf04fbed39d121c976cbb 100644 (file)
@@ -1,9 +1,10 @@
       SUBROUTINE ZLA_PORFSX_EXTENDED( PREC_TYPE, UPLO, N, NRHS, A, LDA,
      $                                AF, LDAF, COLEQU, C, B, LDB, Y,
-     $                                LDY, BERR_OUT, N_NORMS, ERRS_N,
-     $                                ERRS_C, RES, AYB, DY, Y_TAIL,
-     $                                RCOND, ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                LDY, BERR_OUT, N_NORMS,
+     $                                ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
+     $                                AYB, DY, Y_TAIL, RCOND, ITHRESH,
+     $                                RTHRESH, DZ_UB, IGNORE_CWISE,
+     $                                INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       COMPLEX*16         A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       DOUBLE PRECISION   C( * ), AYB( * ), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
 *
-*  ZLA_PORFSX_EXTENDED computes ... .
+*  ZLA_PORFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by ZPORFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
-
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by ZPOTRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) DOUBLE PRECISION array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) COMPLEX*16 array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) COMPLEX*16 array, dimension
+*                    (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by ZPOTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) DOUBLE PRECISION array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by ZLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace.
+*
+*     DY             (input) COMPLEX*16 PRECISION array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) DOUBLE PRECISION
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) DOUBLE PRECISION
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) DOUBLE PRECISION
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to ZPOTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
       DOUBLE PRECISION   DLAMCH
 *     ..
 *     .. Intrinsic Functions ..
-      INTRINSIC          ABS, REAL, DIMAG, MAX, MIN
+      INTRINSIC          ABS, DBLE, DIMAG, MAX, MIN
 *     ..
 *     .. Statement Functions ..
       DOUBLE PRECISION   CABS1
 *     Compute error bounds.
 *
          IF (N_NORMS .GE. 1) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF (N_NORMS .GE. 2) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index 0c0008819f850059a69a1f29dd9877593c49d1aa..8d9e68c6f54f28e1c7d17c5de237ce8e2b8f81a9 100644 (file)
@@ -1,5 +1,5 @@
       DOUBLE PRECISION FUNCTION ZLA_PORPVGRW( UPLO, NCOLS, A, LDA, AF, 
-     $     LDAF, WORK )
+     $                                        LDAF, WORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Purpose
 *  =======
 * 
-*  ZLA_PORPVGRW computes ... .
+*  ZLA_PORPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The triangular factor U or L from the Cholesky factorization
+*     A = U**T*U or A = L*L**T, as computed by ZPOTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N)
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index 7bd5420e7cbda2b65a079acb2ae554c8c01d5451..b448b4805ef60008e58b6d39ab75b356f95c18e2 100644 (file)
 *  Purpose
 *  =======
 * 
-*  ZLA_RPVGRW computes ... .
+*  ZLA_RPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) DOUBLE PRECISION array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) DOUBLE PRECISION array, dimension (LDAF,N)
+*     The factors L and U from the factorization
+*     A = P*L*U as computed by ZGETRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
@@ -44,7 +69,7 @@
 *     .. Executable Statements ..
 *
       RPVGRW = 1.0D+0
-*
+
       DO J = 1, NCOLS
          AMAX = 0.0D+0
          UMAX = 0.0D+0
index d80af17aa5eed5f13a70b150930d3cad177984dd..4cd0de6286d904844d81e1fa72789f90244209dd 100644 (file)
@@ -1,6 +1,6 @@
-      DOUBLE PRECISION FUNCTION ZLA_SYRCOND_C( UPLO, N, A, LDA, AF, 
-     $                             LDAF, IPIV, C, CAPPLY, INFO, WORK, 
-     $     RWORK )
+      DOUBLE PRECISION FUNCTION ZLA_SYRCOND_C( UPLO, N, A, LDA, AF,
+     $                                         LDAF, IPIV, C, CAPPLY,
+     $                                         INFO, WORK, RWORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  =========
 *
-*  C     DOUBLE PRECISION  vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK  COMPLEX*16 workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK DOUBLE PRECISION workspace of size N.
+*     A       (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by ZSYTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by ZSYTRF.
+*
+*     C       (input) DOUBLE PRECISION array, dimension (N)
+*     The vector C in the formula op(A) * inv(diag(C)).
+*
+*     CAPPLY  (input) LOGICAL
+*     If .TRUE. then access the vector C in the formula above.
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) DOUBLE PRECISION array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index 49c07c67aab75c5c844c0d552460019caef62266..bfcebc57946bd9ab80b1a6685ad5ddcc7670ba83 100644 (file)
@@ -1,5 +1,6 @@
-      DOUBLE PRECISION FUNCTION ZLA_SYRCOND_X( UPLO, N, A, LDA, AF, 
-     $                             LDAF, IPIV, X, INFO, WORK, RWORK )
+      DOUBLE PRECISION FUNCTION ZLA_SYRCOND_X( UPLO, N, A, LDA, AF,
+     $                                         LDAF, IPIV, X, INFO,
+     $                                         WORK, RWORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Arguments
 *  =========
 *
-*  C     COMPLEX*16 vector.
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
 *
-*  WORK  COMPLEX*16 workspace of size 2*N.
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
 *
-*  RWORK DOUBLE PRECISION workspace of size N.
+*     A       (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by ZSYTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by ZSYTRF.
+*
+*     X       (input) COMPLEX*16 array, dimension (N)
+*     The vector X in the formula op(A) * diag(X).
+*
+*     INFO    (output) INTEGER
+*       = 0:  Successful exit.
+*     i > 0:  The ith argument is invalid.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N).
+*     Workspace.
+*
+*     RWORK   (input) DOUBLE PRECISION array, dimension (N).
+*     Workspace.
 *
 *  =====================================================================
 *
index 6d92b5621bcca8d15a6c4a1b96c8297a3122ff6b..5b3c439a25f78279400457c8a0e8193c13966f07 100644 (file)
@@ -1,9 +1,10 @@
       SUBROUTINE ZLA_SYRFSX_EXTENDED( PREC_TYPE, UPLO, N, NRHS, A, LDA,
      $                                AF, LDAF, IPIV, COLEQU, C, B, LDB,
-     $                                Y, LDY, BERR_OUT, N_NORMS, ERRS_N,
-     $                                ERRS_C, RES, AYB, DY, Y_TAIL,
-     $                                RCOND, ITHRESH, RTHRESH, DZ_UB,
-     $                                IGNORE_CWISE, INFO )
+     $                                Y, LDY, BERR_OUT, N_NORMS,
+     $                                ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
+     $                                AYB, DY, Y_TAIL, RCOND, ITHRESH,
+     $                                RTHRESH, DZ_UB, IGNORE_CWISE,
+     $                                INFO )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
       COMPLEX*16         A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
      $                   Y( LDY, * ), RES( * ), DY( * ), Y_TAIL( * )
       DOUBLE PRECISION   C( * ), AYB( * ), RCOND, BERR_OUT( * ),
-     $                   ERRS_N( NRHS, * ), ERRS_C( NRHS, * )
+     $                   ERR_BNDS_NORM( NRHS, * ),
+     $                   ERR_BNDS_COMP( NRHS, * )
 *     ..
 *
 *  Purpose
 *  =======
-* 
-*  ZLA_SYRFSX_EXTENDED computes ... .
+*
+*  ZLA_SYRFSX_EXTENDED improves the computed solution to a system of
+*  linear equations by performing extra-precise iterative refinement
+*  and provides error bounds and backward error estimates for the solution.
+*  This subroutine is called by ZSYRFSX to perform iterative refinement.
+*  In addition to normwise error bound, the code provides maximum
+*  componentwise error bound if possible. See comments for ERR_BNDS_NORM
+*  and ERR_BNDS_COMP for details of the error bounds. Note that this
+*  subroutine is only resonsible for setting the second fields of
+*  ERR_BNDS_NORM and ERR_BNDS_COMP.
 *
 *  Arguments
 *  =========
 *
+*     PREC_TYPE      (input) INTEGER
+*     Specifies the intermediate precision to be used in refinement.
+*     The value is defined by ILAPREC(P) where P is a CHARACTER and
+*     P    = 'S':  Single
+*          = 'D':  Double
+*          = 'I':  Indigenous
+*          = 'X', 'E':  Extra
+*
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N              (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     NRHS           (input) INTEGER
+*     The number of right-hand-sides, i.e., the number of columns of the
+*     matrix B.
+*
+*     A              (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA            (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF             (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by ZSYTRF.
+*
+*     LDAF           (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV           (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by ZSYTRF.
+*
+*     COLEQU         (input) LOGICAL
+*     If .TRUE. then column equilibration was done to A before calling
+*     this routine. This is needed to compute the solution and error
+*     bounds correctly.
+*
+*     C              (input) DOUBLE PRECISION array, dimension (N)
+*     The column scale factors for A. If COLEQU = .FALSE., C
+*     is not accessed. If C is input, each element of C should be a power
+*     of the radix to ensure a reliable solution and error estimates.
+*     Scaling by powers of the radix does not cause rounding errors unless
+*     the result underflows or overflows. Rounding errors during scaling
+*     lead to refining with a matrix that is not equivalent to the
+*     input matrix, producing error estimates that may not be
+*     reliable.
+*
+*     B              (input) COMPLEX*16 array, dimension (LDB,NRHS)
+*     The right-hand-side matrix B.
+*
+*     LDB            (input) INTEGER
+*     The leading dimension of the array B.  LDB >= max(1,N).
+*
+*     Y              (input/output) COMPLEX*16 array, dimension
+*                    (LDY,NRHS)
+*     On entry, the solution matrix X, as computed by ZSYTRS.
+*     On exit, the improved solution matrix Y.
+*
+*     LDY            (input) INTEGER
+*     The leading dimension of the array Y.  LDY >= max(1,N).
+*
+*     BERR_OUT       (output) DOUBLE PRECISION array, dimension (NRHS)
+*     On exit, BERR_OUT(j) contains the componentwise relative backward
+*     error for right-hand-side j from the formula
+*         max(i) ( abs(RES(i)) / ( abs(op(A_s))*abs(Y) + abs(B_s) )(i) )
+*     where abs(Z) is the componentwise absolute value of the matrix
+*     or vector Z. This is computed by ZLA_LIN_BERR.
+*
+*     N_NORMS        (input) INTEGER
+*     Determines which error bounds to return (see ERR_BNDS_NORM
+*     and ERR_BNDS_COMP).
+*     If N_NORMS >= 1 return normwise error bounds.
+*     If N_NORMS >= 2 return componentwise error bounds.
+*
+*     ERR_BNDS_NORM  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     normwise relative error, which is defined as follows:
+*
+*     Normwise relative error in the ith solution vector:
+*             max_j (abs(XTRUE(j,i) - X(j,i)))
+*            ------------------------------
+*                  max_j abs(X(j,i))
+*
+*     The array is indexed by the type of error information as described
+*     below. There currently are up to three pieces of information
+*     returned.
+*
+*     The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_NORM(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated normwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*A, where S scales each row by a power of the
+*              radix so all absolute row sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     ERR_BNDS_COMP  (input/output) DOUBLE PRECISION array, dimension
+*                    (NRHS, N_ERR_BNDS)
+*     For each right-hand side, this array contains information about
+*     various error bounds and condition numbers corresponding to the
+*     componentwise relative error, which is defined as follows:
+*
+*     Componentwise relative error in the ith solution vector:
+*                    abs(XTRUE(j,i) - X(j,i))
+*             max_j ----------------------
+*                         abs(X(j,i))
+*
+*     The array is indexed by the right-hand side i (on which the
+*     componentwise relative error depends), and the type of error
+*     information as described below. There currently are up to three
+*     pieces of information returned for each right-hand side. If
+*     componentwise accuracy is not requested (PARAMS(3) = 0.0), then
+*     ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS .LT. 3, then at most
+*     the first (:,N_ERR_BNDS) entries are returned.
+*
+*     The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
+*     right-hand side.
+*
+*     The second index in ERR_BNDS_COMP(:,err) contains the following
+*     three fields:
+*     err = 1 "Trust/don't trust" boolean. Trust the answer if the
+*              reciprocal condition number is less than the threshold
+*              sqrt(n) * slamch('Epsilon').
+*
+*     err = 2 "Guaranteed" error bound: The estimated forward error,
+*              almost certainly within a factor of 10 of the true error
+*              so long as the next entry is greater than the threshold
+*              sqrt(n) * slamch('Epsilon'). This error bound should only
+*              be trusted if the previous boolean is true.
+*
+*     err = 3  Reciprocal condition number: Estimated componentwise
+*              reciprocal condition number.  Compared with the threshold
+*              sqrt(n) * slamch('Epsilon') to determine if the error
+*              estimate is "guaranteed". These reciprocal condition
+*              numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
+*              appropriately scaled matrix Z.
+*              Let Z = S*(A*diag(x)), where x is the solution for the
+*              current right-hand side and S scales each row of
+*              A*diag(x) by a power of the radix so all absolute row
+*              sums of Z are approximately 1.
+*
+*     This subroutine is only responsible for setting the second field
+*     above.
+*     See Lapack Working Note 165 for further details and extra
+*     cautions.
+*
+*     RES            (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the intermediate residual.
+*
+*     AYB            (input) DOUBLE PRECISION array, dimension (N)
+*     Workspace.
+*
+*     DY             (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the intermediate solution.
+*
+*     Y_TAIL         (input) COMPLEX*16 array, dimension (N)
+*     Workspace to hold the trailing bits of the intermediate solution.
+*
+*     RCOND          (input) DOUBLE PRECISION
+*     Reciprocal scaled condition number.  This is an estimate of the
+*     reciprocal Skeel condition number of the matrix A after
+*     equilibration (if done).  If this is less than the machine
+*     precision (in particular, if it is zero), the matrix is singular
+*     to working precision.  Note that the error may still be small even
+*     if this number is very small and the matrix appears ill-
+*     conditioned.
+*
+*     ITHRESH        (input) INTEGER
+*     The maximum number of residual computations allowed for
+*     refinement. The default is 10. For 'aggressive' set to 100 to
+*     permit convergence using approximate factorizations or
+*     factorizations other than LU. If the factorization uses a
+*     technique other than Gaussian elimination, the guarantees in
+*     ERR_BNDS_NORM and ERR_BNDS_COMP may no longer be trustworthy.
+*
+*     RTHRESH        (input) DOUBLE PRECISION
+*     Determines when to stop refinement if the error estimate stops
+*     decreasing. Refinement will stop when the next solution no longer
+*     satisfies norm(dx_{i+1}) < RTHRESH * norm(dx_i) where norm(Z) is
+*     the infinity norm of Z. RTHRESH satisfies 0 < RTHRESH <= 1. The
+*     default value is 0.5. For 'aggressive' set to 0.9 to permit
+*     convergence on extremely ill-conditioned matrices. See LAWN 165
+*     for more details.
+*
+*     DZ_UB          (input) DOUBLE PRECISION
+*     Determines when to start considering componentwise convergence.
+*     Componentwise convergence is only considered after each component
+*     of the solution Y is stable, which we definte as the relative
+*     change in each component being less than DZ_UB. The default value
+*     is 0.25, requiring the first bit to be stable. See LAWN 165 for
+*     more details.
+*
+*     IGNORE_CWISE   (input) LOGICAL
+*     If .TRUE. then ignore componentwise convergence. Default value
+*     is .FALSE..
+*
+*     INFO           (output) INTEGER
+*       = 0:  Successful exit.
+*       < 0:  if INFO = -i, the ith argument to ZSYTRS had an illegal
+*             value
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
      $              Y( 1, J ), 1, DCMPLX(1.0D+0), RES, 1, PREC_TYPE )
             ELSE
                CALL BLAS_ZSYMV2_X(UPLO2, N, DCMPLX(-1.0D+0), A, LDA,
-     $              Y(1, J), Y_TAIL, 1, DCMPLX(1.0D+0), RES, 1, 
+     $              Y(1, J), Y_TAIL, 1, DCMPLX(1.0D+0), RES, 1,
      $     PREC_TYPE)
             END IF
 
 *     Compute error bounds.
 *
          IF ( N_NORMS .GE. 1 ) THEN
-            ERRS_N( J, LA_LINRX_ERR_I ) = FINAL_DX_X / (1 - DXRATMAX)
+            ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DX_X / (1 - DXRATMAX)
          END IF
          IF ( N_NORMS .GE. 2 ) THEN
-            ERRS_C( J, LA_LINRX_ERR_I ) = FINAL_DZ_Z / (1 - DZRATMAX)
+            ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
+     $           FINAL_DZ_Z / (1 - DZRATMAX)
          END IF
 *
 *     Compute componentwise relative backward error from formula
index bbcd01b32019c7e7eb377998584b792ccae94998..749cf6f6f1f5be0a79ce542791c353e62c22d312 100644 (file)
@@ -1,5 +1,5 @@
       DOUBLE PRECISION FUNCTION ZLA_SYRPVGRW( UPLO, N, INFO, A, LDA, AF,
-     $                             LDAF, IPIV, WORK )
+     $                                        LDAF, IPIV, WORK )
 *
 *     -- LAPACK routine (version 3.2)                                 --
 *     -- Contributed by James Demmel, Deaglan Halligan, Yozo Hida and --
 *  Purpose
 *  =======
 * 
-*  ZLA_SYRPVGRW computes ... .
+*  ZLA_SYRPVGRW computes the reciprocal pivot growth factor
+*  norm(A)/norm(U). The "max absolute element" norm is used. If this is
+*  much less than 1, the stability of the LU factorization of the
+*  (equilibrated) matrix A could be poor. This also means that the
+*  solution X, estimated condition numbers, and error bounds could be
+*  unreliable.
 *
 *  Arguments
 *  =========
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
+*     N       (input) INTEGER
+*     The number of linear equations, i.e., the order of the
+*     matrix A.  N >= 0.
+*
+*     INFO    (input) INTEGER
+*     The value of INFO returned from ZSYTRF, .i.e., the pivot in
+*     column INFO is exactly 0.
+*
+*     NCOLS   (input) INTEGER
+*     The number of columns of the matrix A. NCOLS >= 0.
+*
+*     A       (input) COMPLEX*16 array, dimension (LDA,N)
+*     On entry, the N-by-N matrix A.
+*
+*     LDA     (input) INTEGER
+*     The leading dimension of the array A.  LDA >= max(1,N).
+*
+*     AF      (input) COMPLEX*16 array, dimension (LDAF,N)
+*     The block diagonal matrix D and the multipliers used to
+*     obtain the factor U or L as computed by ZSYTRF.
+*
+*     LDAF    (input) INTEGER
+*     The leading dimension of the array AF.  LDAF >= max(1,N).
+*
+*     IPIV    (input) INTEGER array, dimension (N)
+*     Details of the interchanges and the block structure of D
+*     as determined by ZSYTRF.
+*
+*     WORK    (input) COMPLEX*16 array, dimension (2*N)
+*
 *  =====================================================================
 *
 *     .. Local Scalars ..
index c5af11a2d4320aa443977540640d70f2bc80fa40..dc6c012473f128f52bc77a2ed03131b3190f2dfa 100644 (file)
 *
 *  ZLARSCL2 performs a reciprocal diagonal scaling on an vector:
 *    x <-- inv(D) * x
-*  where the diagonal matrix D is stored as a vector.
-*  Eventually to be replaced by BLAS_sge_diag_scale in the new BLAS
+*  where the DOUBLE PRECISION diagonal matrix D is stored as a vector.
+*
+*  Eventually to be replaced by BLAS_zge_diag_scale in the new BLAS
 *  standard.
 *
 *  Arguments
 *  =========
-*  N      (input) INTEGER
-*         The size of the vectors X and D.
-*
-*  D      (input) DOUBLE PRECISION array, length N
-*         Diagonal matrix D, stored as a vector of length N.
-*  X      (input/output) COMPLEX*16 array, length N
-*         On entry, the vector X to be scaled by D.
-*         On exit, the scaled vector.
-*     ..
+*
+*     M       (input) INTEGER
+*     The number of rows of D and X. M >= 0.
+*
+*     N       (input) INTEGER
+*     The number of columns of D and X. N >= 0.
+*
+*     D       (input) DOUBLE PRECISION array, length M
+*     Diagonal matrix D, stored as a vector of length M.
+*
+*     X       (input/output) COMPLEX*16 array, dimension (LDX,N)
+*     On entry, the vector X to be scaled by D.
+*     On exit, the scaled vector.
+*
+*     LDX     (input) INTEGER
+*     The leading dimension of the vector X. LDX >= 0.
+*
+*  =====================================================================
+*
 *     .. Local Scalars ..
       INTEGER            I, J
 *     ..
 *
       DO J = 1, N
          DO I = 1, M
-            X(I,J) = X(I,J) / D(I)
+            X( I, J ) = X( I, J ) / D( I )
          END DO
       END DO
-*
+
       RETURN
       END
-*
+
index ba0b29b9e7af22190a803d99187edbf38150b8cb..bb176016d2acf58bd71765878a5c2a668ed56ffc 100644 (file)
 *
 *  ZLASCL2 performs a diagonal scaling on a vector:
 *    x <-- D * x
-*  where the diagonal matrix D is stored as a vector.
-*  Eventually to be replaced by BLAS_sge_diag_scale in the new BLAS
+*  where the DOUBLE PRECISION diagonal matrix D is stored as a vector.
+*
+*  Eventually to be replaced by BLAS_zge_diag_scale in the new BLAS
 *  standard.
 *
 *  Arguments
 *  =========
-*  N      (input) INTEGER
-*         The size of the vectors X and D.
-*
-*  D      (input) DOUBLE PRECISION array, length N
-*         Diagonal matrix D, stored as a vector of length N.
-*  X      (input/output) COMPLEX*16 array, length N
-*         On entry, the vector X to be scaled by D.
-*         On exit, the scaled vector.
-*     ..
+*
+*     M       (input) INTEGER
+*     The number of rows of D and X. M >= 0.
+*
+*     N       (input) INTEGER
+*     The number of columns of D and X. N >= 0.
+*
+*     D       (input) DOUBLE PRECISION array, length M
+*     Diagonal matrix D, stored as a vector of length M.
+*
+*     X       (input/output) COMPLEX*16 array, dimension (LDX,N)
+*     On entry, the vector X to be scaled by D.
+*     On exit, the scaled vector.
+*
+*     LDX     (input) INTEGER
+*     The leading dimension of the vector X. LDX >= 0.
+*
+*  =====================================================================
+*
 *     .. Local Scalars ..
       INTEGER            I, J
 *     ..
 *
       DO J = 1, N
          DO I = 1, M
-            X(I,J) = X(I,J) * D(I)
+            X( I, J ) = X( I, J ) * D( I )
          END DO
       END DO
-*
+
       RETURN
       END
-*
+
index a66af9a88a21a14709d00cbe3b87593a811a4b7e..500dcd34d687234d903ab7b052b409f96930f128 100644 (file)
@@ -1,4 +1,4 @@
-      Subroutine ZPORFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, S, B,
+      SUBROUTINE ZPORFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, S, B,
      $                    LDB, X, LDX, RCOND, BERR, N_ERR_BNDS,
      $                    ERR_BNDS_NORM, ERR_BNDS_COMP, NPARAMS, PARAMS,
      $                    WORK, RWORK, INFO )
@@ -35,7 +35,8 @@
 *     definite, and provides error bounds and backward error estimates
 *     for the solution.  In addition to normwise error bound, the code
 *     provides maximum componentwise error bound if possible.  See
-*     comments for ERR_BNDS for details of the error bounds.
+*     comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the
+*     error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED and S
index e08f1784169073fb3e90a433bec80c3908e25d1e..bf856c7151e98d60d3451e1026e0885b7fa16e68 100644 (file)
@@ -1,4 +1,4 @@
-      Subroutine ZSYRFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, IPIV,
+      SUBROUTINE ZSYRFSX( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, IPIV,
      $                    S, B, LDB, X, LDX, RCOND, BERR, N_ERR_BNDS,
      $                    ERR_BNDS_NORM, ERR_BNDS_COMP, NPARAMS, PARAMS,
      $                    WORK, RWORK, INFO )
@@ -36,7 +36,7 @@
 *     provides error bounds and backward error estimates for the
 *     solution.  In addition to normwise error bound, the code provides
 *     maximum componentwise error bound if possible.  See comments for
-*     ERR_BNDS_N and ERR_BNDS_C for details of the error bounds.
+*     ERR_BNDS_NORM and ERR_BNDS_COMP for details of the error bounds.
 *
 *     The original system of linear equations may have been equilibrated
 *     before calling this routine, as described by arguments EQUED and S
index 2ad998adba094b3547d983e58e643888c0f6b865..95c18f86a233ae7ceb338375c535b762e8c51dde 100644 (file)
 *       = 'E':  The matrix A will be equilibrated if necessary, then
 *               copied to AF and factored.
 *
+*     UPLO    (input) CHARACTER*1
+*       = 'U':  Upper triangle of A is stored;
+*       = 'L':  Lower triangle of A is stored.
+*
 *     N       (input) INTEGER
 *     The number of linear equations, i.e., the order of the
 *     matrix A.  N >= 0.