la_herfsx_extended(3)
okay so bestie, this is la_herfsx_extended(3), and the manual is Library Functions Manual โ welcome to the group chat. ๐
๐ NAME ๐
la_herfsx_extended - la_herfsx_extended: step in herfsx. Thatโs the name, no cap.
โจ SYNOPSIS โจ
๐ Functions
cla_herfsx_extended
subroutine cla_herfsx_extended (prec_type, uplo, n, nrhs, a, lda, af, ldaf, ipiv, colequ, c, b, ldb, 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)
CLA_HERFSX_EXTENDED improves the computed solution to a system of linear equations for Hermitian indefinite matrices by performing extra-precise iterative refinement and provides error bounds and backward error estimates for the solution.
cla_syrfsx_extended
subroutine cla_syrfsx_extended (prec_type, uplo, n, nrhs, a, lda, af, ldaf, ipiv, colequ, c, b, ldb, 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)
CLA_SYRFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric indefinite matrices by performing extra-precise iterative refinement and provides error bounds and backward error estimates for the solution.
dla_syrfsx_extended
subroutine dla_syrfsx_extended (prec_type, uplo, n, nrhs, a, lda, af, ldaf, ipiv, colequ, c, b, ldb, 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)
DLA_SYRFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric indefinite matrices by performing extra-precise iterative refinement and provides error bounds and backward error estimates for the solution.
sla_syrfsx_extended
subroutine sla_syrfsx_extended (prec_type, uplo, n, nrhs, a, lda, af, ldaf, ipiv, colequ, c, b, ldb, 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)
SLA_SYRFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric indefinite matrices by performing extra-precise iterative refinement and provides error bounds and backward error estimates for the solution.
zla_herfsx_extended
subroutine zla_herfsx_extended (prec_type, uplo, n, nrhs, a, lda, af, ldaf, ipiv, colequ, c, b, ldb, 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)
ZLA_HERFSX_EXTENDED improves the computed solution to a system of linear equations for Hermitian indefinite matrices by performing extra-precise iterative refinement and provides error bounds and backward error estimates for the solution.
zla_syrfsx_extended
subroutine zla_syrfsx_extended (prec_type, uplo, n, nrhs, a, lda, af, ldaf, ipiv, colequ, c, b, ldb, 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)
ZLA_SYRFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric indefinite matrices by performing extra-precise iterative refinement and provides error bounds and backward error estimates for the solution.
๐ Detailed Description ๐
lowkey the detailed description is just the function docs below โ no extra lore, no side quests. ๐ซถ
๐ ๏ธ Function Documentation ๐ ๏ธ
cla_herfsx_extended
subroutine cla_herfsx_extended (integer prec_type, character uplo, integer
n, integer nrhs, complex, dimension( lda, * ) a, integer lda, complex,
dimension( ldaf, * ) af, integer ldaf, integer, dimension( * ) ipiv,
logical colequ, real, dimension( * ) c, complex, dimension( ldb, * ) b,
integer ldb, complex, dimension( ldy, * ) y, integer ldy, real,
dimension( * ) berr_out, integer n_norms, real, dimension( nrhs, * )
err_bnds_norm, real, dimension( nrhs, * ) err_bnds_comp, complex,
dimension( * ) res, real, dimension( * ) ayb, complex, dimension( * )
dy, complex, dimension( * ) y_tail, real rcond, integer ithresh, real
rthresh, real dz_ub, logical ignore_cwise, integer info)
CLA_HERFSX_EXTENDED improves the computed solution to a system of linear equations for Hermitian indefinite matrices by performing extra-precise iterative refinement and provides error bounds and backward error estimates for the solution.
๐ฏ Purpose ๐ฏ
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 responsible for setting the second fields of ERR_BNDS_NORM and ERR_BNDS_COMP.
๐งพ Parameters ๐งพ
PREC_TYPE
PREC_TYPE is INTEGER. It specifies the intermediate precision to be used in refinement. The value is defined by ILAPREC(P) where P is a CHARACTER and:
P = 'S': SingleP = 'D': DoubleP = 'I': IndigenousP = 'X'or'E': Extra
UPLO
UPLO is CHARACTER*1.
= 'U': Upper triangle ofAis stored;= 'L': Lower triangle ofAis stored.
N
N is INTEGER. Itโs the number of linear equations, i.e., the order of the matrix A. N >= 0.
NRHS
NRHS is INTEGER. Itโs the number of right-hand-sides, i.e., the number of columns of the matrix B.
A
A is COMPLEX array, dimension (LDA,N). On entry, the N-by-N matrix A.
LDA
LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
AF
AF is 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
LDAF is INTEGER. The leading dimension of the array AF. LDAF >= max(1,N).
IPIV
IPIV is INTEGER array, dimension (N). Details of the interchanges and the block structure of D as determined by CHETRF.
COLEQU
COLEQU is 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
C is 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
B is COMPLEX array, dimension (LDB,NRHS). The right-hand-side matrix B.
LDB
LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,N).
Y
Y is COMPLEX array, dimension (LDY,NRHS). On entry, the solution matrix X, as computed by CHETRS. On exit, the improved solution matrix Y.
LDY
LDY is INTEGER. The leading dimension of the array Y. LDY >= max(1,N).
BERR_OUT
BERR_OUT is 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
N_NORMS is INTEGER. It determines which error bounds to return (see ERR_BNDS_NORM and ERR_BNDS_COMP).
- If
N_NORMS >= 1return normwise error bounds. - If
N_NORMS >= 2return componentwise error bounds.
ERR_BNDS_NORM
๐ ERR_BNDS_NORM ๐
ERR_BNDS_NORM is a REAL array, dimension (NRHS, N_ERR_BNDS). For each right-hand side, this array is carrying info about various error bounds and condition numbers corresponding to the normwise relative error, which is defined like this:
max_j (abs(XTRUE(j,i) - X(j,i)))
------------------------------
max_j abs(X(j,i))
The array is indexed by the type of error info 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โ boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon').err = 2โ 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 thresholdsqrt(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 thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrixZ. LetZ = S*A, whereSscales each row by a power of the radix so all absolute row sums ofZare 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 ๐
ERR_BNDS_COMP is a REAL array, dimension (NRHS, N_ERR_BNDS). For each right-hand side, this array is holding info about various error bounds and condition numbers corresponding to the componentwise relative error, defined like this:
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 info 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 < 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โ boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon').err = 2โ 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 thresholdsqrt(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 thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrixZ. LetZ = S*(A*diag(x)), wherexis the solution for the current right-hand side andSscales each row ofA*diag(x)by a power of the radix so all absolute row sums ofZare 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 ๐
RES is COMPLEX array, dimension (N). Workspace to hold the intermediate residual.
๐ AYB ๐
AYB is REAL array, dimension (N). Workspace.
๐ฆ DY ๐ฆ
DY is COMPLEX array, dimension (N). Workspace to hold the intermediate solution.
๐ Y_TAIL ๐
Y_TAIL is COMPLEX array, dimension (N). Workspace to hold the trailing bits of the intermediate solution.
๐
RCOND ๐
RCOND is 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 ๐ฅ
ITHRESH is 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 ๐ธ
RTHRESH is 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 ๐ง
DZ_UB is REAL. Determines when to start considering componentwise convergence. Componentwise convergence is only considered after each component of the solution Y is stable, which we define 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 ๐
IGNORE_CWISE is LOGICAL. If .TRUE. then ignore componentwise convergence. Default value is .FALSE..
๐ INFO ๐
INFO is INTEGER
= 0: Successful exit.< 0: ifINFO = -i, the ith argument toCLA_HERFSX_EXTENDEDhad an illegal value
Author
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
๐ Definition at line 388 of file cla_herfsx_extended.f
๐ฆ cla_syrfsx_extended ๐ฆ
subroutine cla_syrfsx_extended (integer prec_type, character uplo, integer
n, integer nrhs, complex, dimension( lda, * ) a, integer lda, complex,
dimension( ldaf, * ) af, integer ldaf, integer, dimension( * ) ipiv,
logical colequ, real, dimension( * ) c, complex, dimension( ldb, * ) b,
integer ldb, complex, dimension( ldy, * ) y, integer ldy, real,
dimension( * ) berr_out, integer n_norms, real, dimension( nrhs, * )
err_bnds_norm, real, dimension( nrhs, * ) err_bnds_comp, complex,
dimension( * ) res, real, dimension( * ) ayb, complex, dimension( * )
dy, complex, dimension( * ) y_tail, real rcond, integer ithresh, real
rthresh, real dz_ub, logical ignore_cwise, integer info)
CLA_SYRFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric indefinite matrices by performing extra-precise iterative refinement and provides error bounds and backward error estimates for the solution.
๐ฏ Purpose ๐ฏ
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 responsible for setting the second fields of ERR_BNDS_NORM and ERR_BNDS_COMP.
๐ธ Parameters ๐ธ
PREC_TYPEโINTEGER. Specifies the intermediate precision to be used in refinement. The value is defined byILAPREC(P)wherePis aCHARACTERandP= 'S': Single= 'D': Double= 'I': Indigenous= 'X'or'E': Extra
UPLOโCHARACTER*1= 'U': Upper triangle ofAis stored;= 'L': Lower triangle ofAis stored.
NโINTEGER. The number of linear equations, i.e., the order of the matrixA.N >= 0.NRHSโINTEGER. The number of right-hand-sides, i.e., the number of columns of the matrixB.AโCOMPLEXarray, dimension(LDA,N). On entry, theN-by-NmatrixA.LDALDAโLDAis INTEGER. It's the leading dimension of the arrayA, and the vibe check it must pass isLDA >= max(1,N). Non-negotiable bestie.AFโAFis COMPLEX array, dimension(LDAF,N). This one's carrying the block diagonal matrixDplus the multipliers used to obtain the factorUorL, exactly as computed byCSYTRF. She's the pre-processed version, basically.LDAFโLDAFis INTEGER. Leading dimension of the arrayAF, and yes, same rule:LDAF >= max(1,N).IPIVโIPIVis INTEGER array, dimension(N). It holds the details of the interchanges and the block structure ofD, as determined byCSYTRF. Receipts for the pivoting, iykyk.COLEQUโCOLEQUis LOGICAL. If.TRUE.then column equilibration was done toAbefore calling this routine. This is genuinely needed to compute the solution and error bounds correctly, so don't be out here lying about it ๐CโCis REAL array, dimension(N). The column scale factors forA. IfCOLEQU = .FALSE.,Cis not accessed at all (she's not even invited). IfCis input, each element ofCshould 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 โ and that is a whole mess you do not want ๐ญBโBis COMPLEX array, dimension(LDB,NRHS). It's the right-hand-side matrixB. The moment. The whole reason we're here.LDBโLDBis INTEGER. Leading dimension of the arrayB, and it's givingLDB >= max(1,N), as always.YโYis COMPLEX array, dimension(LDY,NRHS). On entry, this is the solution matrixX, as computed byCSYTRS. On exit, it's the improved solution matrixY. Glow-up arc, truly โจLDYโLDYis INTEGER. Leading dimension of the arrayY. You already know the drill:LDY >= max(1,N).BERR_OUTโBERR_OUTis REAL array, dimension(NRHS). On exit,BERR_OUT(j)contains the componentwise relative backward error for right-hand-sidej, from this 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, so shoutout to her ๐ซถ
N_NORMSโN_NORMSis INTEGER, and it determines which error bounds to return (seeERR_BNDS_NORMandERR_BNDS_COMP).- If
N_NORMS >= 1return normwise error bounds. - If
N_NORMS >= 2return componentwise error bounds.
- If
ERR_BNDS_NORMโERR_BNDS_NORMis 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 = 1boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon').err = 2error 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 thresholdsqrt(n) * slamch('Epsilon'). This error bound should only be trusted if the previous boolean is true.err = 3Reciprocal condition number: Estimated normwise reciprocal condition number. Compared with the thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrixZ. LetZ = S*A, whereSscales each row by a power of the radix so all absolute row sums ofZare approximately 1.
Okay so that one sentence in err = 3 literally just stops at "is ." in the source โ I'm not gonna invent the missing word for you ๐ the manpage said what it said.
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โERR_BNDS_COMPis 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 < 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 = 1boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon').err = 2error 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 thresholdsqrt(n) * slamch('Epsilon'). This error bound should only be trusted if the previous boolean is true.err = 3Reciprocal condition number: Estimated componentwise reciprocal condition number. Compared with the thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrixZ. LetZ = S*(A*diag(x)), wherexis the solution for the current right-hand side andSscales each row ofA*diag(x)by a power of the radix so all absolute row sums ofZare approximately 1.
Same situation as above, bestie โ "is ." is verbatim what's in the source. Not me filling in blanks ๐
This subroutine is only responsible for setting the second field above. See Lapack Working Note 165 for further details and extra cautions.
RESโRESis COMPLEX array, dimension(N). Workspace to hold the intermediate residual. Just vibing in the back, doing her job.AYBโAYBis REAL array, dimension(N). Workspace. That's it. That's the description ๐DYโDYis COMPLEX array, dimension(N). Workspace to hold the intermediate solution.Y_TAILโY_TAILis COMPLEX array, dimension(N). Workspace to hold the trailing bits of the intermediate solution. The little leftovers, the crumbs, the detail ๐ธRCONDโRCONDis REAL. Reciprocal scaled condition number. This is an estimate of the reciprocal Skeel condition number of the matrixAafter 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 โ so like, don't panic-panic, but do read the whole line ๐ITHRESHโITHRESHis INTEGER. The maximum number of residual computations allowed for refinement. The default is10. For 'aggressive' set to100to permit convergence using approximate factorizations or factorizations other than LU. If the factorization uses a technique other than Gaussian elimination, the guarantees inERR_BNDS_NORMandERR_BNDS_COMPmay no longer be trustworthy. Big warning, no cap โ ๏ธRTHRESHโRTHRESHis REAL. Determines when to stop refinement if the error estimate stops decreasing. Refinement will stop when the next solution no longer satisfiesnorm(dx_{i+1}) < RTHRESH * norm(dx_i)wherenorm(Z)is the infinity norm ofZ.RTHRESHsatisfies0 < RTHRESH <= 1. The default value is0.5. For 'aggressive' set to0.9to permit convergence on extremely ill-conditioned matrices. See LAWN 165 for more details.DZ_UBโDZ_UBis REAL. Determines when to start considering componentwise convergence. Componentwise convergence is only considered after each component of the solutionYis stable, which we define as the relative change in each component being less thanDZ_UB. The default value is0.25, requiring the first bit to be stable. See LAWN 165 for more details.IGNORE_CWISEโIGNORE_CWISEis LOGICAL. If.TRUE.then ignore componentwise convergence. Default value is.FALSE.. Sometimes ignoring your problems is the option, and here it's literally a flag ๐ฆINFOโINFOis INTEGER.= 0: Successful exit. Slay.< 0: ifINFO = -i, the ith argument toCLA_SYRFSX_EXTENDEDhad an illegal value.
๐ Author
Univ. of Tennessee
๐ Definition at line 388 of file cla_syrfsx_extended.f.
๐ฆ dla_syrfsx_extended ๐ฆ
subroutine dla_syrfsx_extended (integer prec_type, character uplo, integer
n, integer nrhs, double precision, dimension( lda, * ) a, integer lda,
double precision, dimension( ldaf, * ) af, integer ldaf, integer,
dimension( * ) ipiv, logical colequ, double precision, dimension( * ) c,
double precision, dimension( ldb, * ) b, integer ldb, double precision,
dimension( ldy, * ) y, integer ldy, double precision, dimension( * )
berr_out, integer n_norms, double precision, dimension( nrhs, * )
err_bnds_norm, double precision, dimension( nrhs, * ) err_bnds_comp,
double precision, dimension( * ) res, double precision, dimension( * )
ayb, double precision, dimension( * ) dy, double precision, dimension( *
) y_tail, double precision rcond, integer ithresh, double precision
rthresh, double precision dz_ub, logical ignore_cwise, integer info)
DLA_SYRFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric indefinite matrices by performing extra-precise iterative refinement and provides error bounds and backward error estimates for the solution. okay so it's the glow-up routine for your solution, basically ๐
๐ Purpose ๐
!> !> !> 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 responsible for setting the second fields of !> ERR_BNDS_NORM and ERR_BNDS_COMP. !>
Translation bestie: it's the muscle behind DSYRFSX. It refines, it bounds the error, and it only fills in field two of those two ERR_BNDS arrays โ the second fields, not the whole thing. Don't @ me, that's literally what it says. ๐ซถ
๐ Parameters ๐
PREC_TYPE โ INTEGER
PREC_TYPE is 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'or'E': Extra
UPLO โ CHARACTER1*
UPLO is CHARACTER*1
= 'U': Upper triangle ofAis stored;= 'L': Lower triangle ofAis stored.
N โ INTEGER
N is INTEGER The number of linear equations, i.e., the order of the matrix A. N >= 0.
NRHS โ INTEGER
NRHS is INTEGER The number of right-hand-sides, i.e., the number of columns of the matrix B.
A โ DOUBLE PRECISION array, dimension (LDA,N)
A is DOUBLE PRECISION array, dimension (LDA,N) On entry, the N-by-N matrix A.
LDA โ INTEGER
LDA is INTEGER The leading dimension of the array A. LDA >= max(1,N).
AF โ DOUBLE PRECISION array, dimension (LDAF,N)
AF is 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 โ INTEGER
LDAF is INTEGER The leading dimension of the array AF. LDAF >= max(1,N).
IPIV โ INTEGER array, dimension (N)
IPIV is INTEGER array, dimension (N) Details of the interchanges and the block structure of D as determined by DSYTRF.
COLEQU โ LOGICAL
COLEQU is 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. (so like, if you equilibrated and didn't tell it, the vibes are off and the bounds are wrong โ set it honestly ๐)
C โ DOUBLE PRECISION array, dimension (N)
C is 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.
๐จ real talk: powers of the radix ONLY, bestie. Rounding errors during scaling mean you're refining against a matrix that isn't even your matrix anymore, and then those error estimates are giving delusion, not accuracy.
B โ DOUBLE PRECISION array, dimension (LDB,NRHS)
B is DOUBLE PRECISION array, dimension (LDB,NRHS) The right-hand-side matrix B.
LDB โ INTEGER
LDB is INTEGER The leading dimension of the array B. LDB >= max(1,N).
Y โ DOUBLE PRECISION array, dimension (LDY,NRHS)
Y is DOUBLE PRECISION array, dimension (LDY,NRHS) On entry, the solution matrix X, as computed by DSYTRS. On exit, the improved solution matrix Y. โจ the glow-up is real: goes in as X, comes out as Y โจ
LDY โ INTEGER
LDY is INTEGER The leading dimension of the array Y. LDY >= max(1,N).
BERR_OUT โ DOUBLE PRECISION array, dimension (NRHS)
BERR_OUT is 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. iykyk ๐งฎ
N_NORMS โ INTEGER
N_NORMS is INTEGER Determines which error bounds to return (see ERR_BNDS_NORM and ERR_BNDS_COMP).
- If
N_NORMS >= 1return normwise error bounds. - If
N_NORMS >= 2return componentwise error bounds.
So like a little menu: 1 gets you normwise, 2 gets you both. Choose your fighter ๐
ERR_BNDS_NORM โ DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS)
ERR_BNDS_NORM is 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:
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 *i*th right-hand side.
The second index in ERR_BNDS_NORM(:,err) contains the following three fields:
err = 1boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon').err = 2error 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 thresholdsqrt(n) * slamch('Epsilon'). This error bound should only be trusted if the previous boolean is true.err = 3Reciprocal condition number: Estimated normwise reciprocal condition number. Compared with the thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrixZ. LetZ = S*A, whereSscales each row by a power of the radix so all absolute row sums ofZare approximately1.
Heads up: the source doc genuinely trails off at "the error estimate is ." โ not my typo, bestie, that's just how it's written ๐ญ I'm not about to invent words for it. Everything else in that field is exactly as documented.
This subroutine is only responsible for setting the second field above. See Lapack Working Note 165 for further details and extra cautions.
LWN 165 is the assigned reading, no skipping ๐
ERR_BNDS_COMP โ and this is exactly where this chunk of the docs cuts off ๐ฆ the componentwise twin of ERR_BNDS_NORM โ its description picks up right where this part ends, so hold that thought ๐
ERR_BNDS_COMPโDOUBLE PRECISIONarray, dimension(NRHS, N_ERR_BNDS)๐ for every right-hand side, this one carries all the tea about error bounds and condition numbers tied to the componentwise relative error, which is defined like this:
abs(XTRUE(j,i) - X(j,i))
max_j ----------------------
abs(X(j,i))
The array is indexed by the right-hand side i (because that's what the componentwise relative error depends on, obvi), and then by the type of error info, as described below. Right now there are up to three pieces of info returned per right-hand side. If componentwise accuracy was not requested (PARAMS(3) = 0.0), then ERR_BNDS_COMP is not accessed at all โ it's giving "you didn't ask, so I'm not telling" energy. And if N_ERR_BNDS < 3, then at most the first (:,N_ERR_BNDS) entries get returned. Lowkey thrifty but valid.
The first index in ERR_BNDS_COMP(i,:) corresponds to the ith right-hand side ๐ซถ
The second index in ERR_BNDS_COMP(:,err) contains these three fields:
err = 1โ boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon'). Basically a vibe check on whether you can believe the number โจerr = 2โ error bound: the estimated forward error, almost certainly within a factor of10of the true error, so long as the next entry is greater than the thresholdsqrt(n) * slamch('Epsilon'). And no cap, this error bound should only be trusted if the previous boolean is true. Package deal, bestie ๐err = 3โ reciprocal condition number: the estimated componentwise reciprocal condition number. Compared with the thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrixZ. LetZ = S*(A*diag(x)), wherexis the solution for the current right-hand side andSscales each row ofA*diag(x)by a power of the radix so all absolute row sums ofZare approximately1. Math girlie behaviour honestly ๐ธ
This subroutine is only responsible for setting the second field above. That's it, that's the whole job. See Lapack Working Note 165 for further details and extra cautions ๐
RESโDOUBLE PRECISIONarray, dimension(N). Workspace to hold the intermediate residual. Scrappy little scratchpad ๐AYBโDOUBLE PRECISIONarray, dimension(N). Workspace. And here's the slay: this can be the same workspace you passed forY_TAILโ sharing is caring, we love a sustainable queen ๐ฆDYโDOUBLE PRECISIONarray, dimension(N). Workspace to hold the intermediate solution. Mid-refinement era, not the final form ๐Y_TAILโDOUBLE PRECISIONarray, dimension(N). Workspace to hold the trailing bits of the intermediate solution. The leftovers, the crumbs, and honestly they matter ๐ญRCONDโDOUBLE PRECISION. Reciprocal scaled condition number. This is an estimate of the reciprocal Skeel condition number of the matrixAafter equilibration (if done). If this is less than the machine precision (in particular, if it is zero), the matrix is singular to working precision โ that's the dramatic part, don't skip it. Note that the error may still be small even if this number is very small and the matrix appears ill-conditioned ๐ซถ (yes, it can look rough and still eat).ITHRESHโINTEGER. The maximum number of residual computations allowed for refinement. The default is10. For'aggressive'set it to100to permit convergence using approximate factorizations or factorizations other than LU. Caveat time: if the factorization uses a technique other than Gaussian elimination, the guarantees inERR_BNDS_NORMandERR_BNDS_COMPmay no longer be trustworthy โ ๏ธ like, proceed but know what you're doing.RTHRESHโDOUBLE PRECISION. Determines when to stop refinement if the error estimate stops decreasing. Refinement will stop when the next solution no longer satisfiesnorm(dx_{i+1}) < RTHRESH * norm(dx_i)wherenorm(Z)is the infinity norm ofZ.RTHRESHsatisfies0 < RTHRESH <= 1. The default value is0.5. For'aggressive'set it to0.9to permit convergence on extremely ill-conditioned matrices. See LAWN 165 for more details ๐ฅDZ_UBโDOUBLE PRECISION. Determines when to start considering componentwise convergence. Componentwise convergence is only considered after each component of the solutionYis stable, which we define as the relative change in each component being less thanDZ_UB. The default value is0.25, requiring the first bit to be stable. See LAWN 165 for more details โญIGNORE_CWISEโLOGICAL. If.TRUE.then ignore componentwise convergence. Default value is.FALSE.. Setting it true is the "I don't want to know" option ๐INFOโINTEGER:= 0: Successful exit. We love a clean finish ๐< 0: ifINFO = -i, theith argument toDLA_SYRFSX_EXTENDEDhad an illegal value. Not iconic, fix your args bestie ๐
๐ธ Author ๐ธ
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Definition at line 389 of file dla_syrfsx_extended.f.
๐ subroutine sla_syrfsx_extended ๐
subroutine sla_syrfsx_extended (integer prec_type, character uplo, integer
n, integer nrhs, real, dimension( lda, * ) a, integer lda, real,
dimension( ldaf, * ) af, integer ldaf, integer, dimension( * ) ipiv,
logical colequ, real, dimension( * ) c, real, dimension( ldb, * ) b,
integer ldb, real, dimension( ldy, * ) y, integer ldy, real, dimension(
* ) berr_out, integer n_norms, real, dimension( nrhs, * ) err_bnds_norm,
real, dimension( nrhs, * ) err_bnds_comp, real, dimension( * ) res,
real, dimension( * ) ayb, real, dimension( * ) dy, real, dimension( * )
y_tail, real rcond, integer ithresh, real rthresh, real dz_ub, logical
ignore_cwise, integer info)
SLA_SYRFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric indefinite matrices by performing extra-precise iterative refinement, and provides error bounds and backward error estimates for the solution. She does it all ๐
โจ Purpose โจ
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 the normwise error bound, the code provides a maximum componentwise error bound if possible. See the comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the error bounds. Note that this subroutine is only responsible for setting the second fields of ERR_BNDS_NORM and ERR_BNDS_COMP โ just the second ones, don't ask her for more ๐
๐ Parameters ๐
PREC_TYPEโINTEGER. Specifies the intermediate precision to be used in refinement. The value is defined byILAPREC(P)wherePis aCHARACTERandP:= 'S': Single= 'D': Double= 'I': Indigenous= 'X'or'E': Extra
Pick your fighter โจ
UPLOโCHARACTER*1:= 'U': Upper triangle ofAis stored;= 'L': Lower triangle ofAis stored.
Half the matrix is all you get, and that's fine ๐ธ
NโINTEGER. The number of linear equations, i.e., the order of the matrixA.N >= 0.NRHSโINTEGER. The number of right-hand-sides, i.e., the number of columns of the matrixB. Multiple problems, one queen ๐AโREALarray, dimension(LDA,N). On entry, theN-by-NmatrixA. The main character herself ๐LDAโINTEGER. The leading dimension of the arrayA.LDA >= max(1,N).AFโREALarray, dimension(LDAF,N). The block diagonal matrixDand the multipliers used to obtain the factorUorLas computed bySSYTRF.LDAFโINTEGER. The leading dimension of the arrayAF.LDAF >= max(1,N).IPIVโINTEGERarray, dimension(N). Details of the interchanges and the block structure ofDas determined bySSYTRF. The receipts of what got swapped where ๐งCOLEQUโLOGICAL. If.TRUE.then column equilibration was done toAbefore calling this routine. This is needed to compute the solution and error bounds correctly โ skip it and everything's just wrong, no cap โ ๏ธCโREALarray, dimension(N). The column scale factors forA. IfCOLEQU = .FALSE.,Cis not accessed (she's off duty). IfCis input, each element ofCshould 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. So bestie: powers of the radix, or risk the consequences ๐ญBโREALarray, dimension(LDB,NRHS). The right-hand-side matrixB.LDBโINTEGER. The leading dimension of the arrayB.LDB >= max(1,N).YโREALarray, dimension(LDY,NRHS). On entry, the solution matrixX, as computed bySSYTRS. On exit, the improved solution matrixY. Glow-up arc, literally ๐LDYโINTEGER. The leading dimension of the arrayY.LDY >= max(1,N).BERR_OUTโBERR_OUTโ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โINTEGER. Determines which error bounds to return (seeERR_BNDS_NORMandERR_BNDS_COMP). IfN_NORMS >= 1return normwise error bounds. IfN_NORMS >= 2return componentwise error bounds.ERR_BNDS_NORMโ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โ boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon').err = 2โ 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 thresholdsqrt(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 thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrix Z. LetZ = 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โ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 < 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โ boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon').err = 2โ 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 thresholdsqrt(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 thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrix Z. LetZ = S*(A*diag(x)), where x is the solution for the current right-hand side and S scales each row ofA*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โREAL array, dimension (N). Workspace to hold the intermediate residual.AYBโREAL array, dimension (N). Workspace. This can be the same workspace passed forY_TAIL.DYโREAL array, dimension (N). Workspace to hold the intermediate solution.Y_TAILโREAL array, dimension (N). Workspace to hold the trailing bits of the intermediate solution.RCONDโ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โ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 inERR_BNDS_NORMandERR_BNDS_COMPmay no longer be trustworthy.RTHRESHโREAL. Determines when to stop refinement if the error estimate stops decreasing. Refinement will stop when the next solution no longer satisfiesnorm(dx_{i+1}) < RTHRESH * norm(dx_i)wherenorm(Z)is the infinity norm of Z.RTHRESHsatisfies0 < 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โREAL. Determines when to start considering componentwise convergence. Componentwise convergence is only considered after each component of the solution Y is stable, which we define as the relative change in each component being less thanDZ_UB. The default value is 0.25, requiring the first bit to be stable. See LAWN 165 for more details.IGNORE_CWISEโLOGICAL. If.TRUE.then ignore componentwise convergence. Default value is.FALSE..INFOโINTEGER.= 0: Successful exit.< 0: ifINFO = -i, the ith argument toSLA_SYRFSX_EXTENDEDhad an illegal value
๐ Author ๐
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Definition at line 389 of file sla_syrfsx_extended.f.
okay bestie, next up is the complex Hermitian version, and she is iconic: zla_herfsx_extended. โจ
subroutine zla_herfsx_extended (integer prec_type, character uplo, integer
n, integer nrhs, complex*16, dimension( lda, * ) a, integer lda,
complex*16, dimension( ldaf, * ) af, integer ldaf, integer, dimension( *
) ipiv, logical colequ, double precision, dimension( * ) c, complex*16,
dimension( ldb, * ) b, integer ldb, complex*16, dimension( ldy, * ) y,
integer ldy, double precision, dimension( * ) berr_out, integer n_norms,
double precision, dimension( nrhs, * ) err_bnds_norm, double precision,
dimension( nrhs, * ) err_bnds_comp, complex*16, dimension( * ) res,
double precision, dimension( * ) ayb, complex*16, dimension( * ) dy,
complex*16, dimension( * ) y_tail, double precision rcond, integer
ithresh, double precision rthresh, double precision dz_ub, logical
ignore_cwise, integer info)
ZLA_HERFSX_EXTENDED improves the computed solution to a system of linear equations for Hermitian indefinite matrices by performing extra-precise iterative refinement and provides error bounds and backward error estimates for the solution. ๐
Purpose
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 responsible for setting the second fields of ERR_BNDS_NORM and ERR_BNDS_COMP. ๐
Parameters
PREC_TYPEโPREC_TYPE(INTEGER) โ this one tells the routine which intermediate precision to use while it's doing the refinement ๐ it's defined byILAPREC(P)wherePis aCHARACTER, and the values are:= 'S'โ Single= 'D'โ Double= 'I'โ Indigenous= 'X'or'E'โ Extra
UPLO(CHARACTER*1) โ which triangle ofAwe actually stored, bestie:= 'U'โ the Upper triangle ofAis stored= 'L'โ the Lower triangle ofAis stored โจ
N(INTEGER) โ how many linear equations we're solving, aka the order of the matrixA. Gotta beN >= 0.NRHS(INTEGER) โ the number of right-hand-sides, meaning the number of columns of the matrixB. So many b's, so little time ๐ซถA(COMPLEX*16 array, dimension(LDA,N)) โ on entry, this is theN-by-NmatrixA. The main character, honestly ๐LDA(INTEGER) โ the leading dimension of the arrayA. Rule:LDA >= max(1,N).AF(COMPLEX*16 array, dimension(LDAF,N)) โ the block diagonal matrixDplus the multipliers used to obtain the factorUorL, all as computed byZHETRF. It's the factorization, already served ๐LDAF(INTEGER) โ the leading dimension of the arrayAF. Rule:LDAF >= max(1,N).IPIV(INTEGER array, dimension(N)) โ the deets on the interchanges and the block structure ofD, as determined byZHETRF. The receipts of who got swapped with whom ๐COLEQU(LOGICAL) โ if.TRUE., then column equilibration was already done toAbefore this routine got called. This matters because it's needed to compute the solution and the error bounds correctly โ so don't lie to it, k? ๐C(DOUBLE PRECISION array, dimension(N)) โ the column scale factors forA. IfCOLEQU = .FALSE., thenCis not accessed at all, it's just vibing. IfCis input, each element ofCshould be a power of the radix so you get a reliable solution and reliable error estimates. Scaling by powers of the radix doesn't cause rounding errors unless the result underflows or overflows โ and rounding errors during scaling lead to refining with a matrix that is not equivalent to the input matrix, which produces error estimates that may not be reliable. So likeโฆ be careful, fr fr ๐ญB(COMPLEX*16 array, dimension(LDB,NRHS)) โ the right-hand-side matrixB. The whole reason we're here ๐LDB(INTEGER) โ the leading dimension of the arrayB. Rule:LDB >= max(1,N).Y(COMPLEX*16 array, dimension(LDY,NRHS)) โ on entry, this holds the solution matrixXas computed byZHETRS; on exit, it's the improved solution matrixY. Glow-up arc โจ๐ฅLDY(INTEGER) โ the leading dimension of the arrayY. Rule:LDY >= max(1,N).BERR_OUT(DOUBLE PRECISION array, dimension(NRHS)) โ on exit,BERR_OUT(j)contains the componentwise relative backward error for right-hand-sidej, straight from this 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. Math slay ๐งฎ๐
N_NORMS(INTEGER) โ decides which error bounds come back to you (peepERR_BNDS_NORMandERR_BNDS_COMP):- if
N_NORMS >= 1โ return normwise error bounds - if
N_NORMS >= 2โ return componentwise error bounds
- if
ERR_BNDS_NORM(DOUBLE PRECISION array, dimension(NRHS, N_ERR_BNDS)) โ for each right-hand side, this array is packed with info about various error bounds and condition numbers for the normwise relative error, defined like this:
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, 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 these three fields:
err = 1โ boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon').err = 2โ error bound: the estimated forward error, almost certainly within a factor of10of the true error so long as the next entry is greater than the thresholdsqrt(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 thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrixZ. LetZ = S*A, whereSscales each row by a power of the radix so all absolute row sums ofZare approximately1.
Heads up: 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(DOUBLE PRECISION array, dimension(NRHS, N_ERR_BNDS)) โ for each right-hand side, this array holds info about various error bounds and condition numbers for the componentwise relative error, defined as:
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 (since the componentwise relative error depends on it) and by the type of error information 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 < 3, then at most the first (:,N_ERR_BNDS) entries are returned โ so you might get a partial drop ๐
The first index in ERR_BNDS_COMP(i,:) corresponds to the ith right-hand side.
The second index in ERR_BNDS_COMP(:,err) contains these three fields:
err = 1โ boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon').err = 2โ error bound: the estimated forward error, almost certainly within a factor of10of the true error so long as the next entry is greater than the thresholdsqrt(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 thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrixZ. LetZ = S*(A*diag(x)), wherexis the solution for the current right-hand side andSscales each row ofA*diag(x)by a power of the radix so all absolute row sums ofZare approximately1.
Again: this subroutine is only responsible for setting the second field above, and you should see Lapack Working Note 165 for further details and extra cautions ๐
RES(COMPLEX*16 array, dimension(N)) โ workspace that holds the intermediate residual. Just a lil scratch pad ๐งAYB(DOUBLE PRECISION array, dimension(N)) โ workspace. That's it, that's the whole description ๐DY(COMPLEX*16 array, dimension(N)) โ workspace that holds the intermediate solution.Y_TAIL(COMPLEX*16 array, dimension(N)) โ workspace that holds the trailing bits of the intermediate solution. The crumbs, the leftover sparkle โจRCOND(DOUBLE PRECISION) โ the reciprocal scaled condition number. It's an estimate of the reciprocal Skeel condition number of the matrixAafter equilibration (if that got done). If this is less than the machine precision (in particular, if it is zero), then the matrix is singular to working precision. Big note though: the error may still be small even if this number is very small and the matrix appears ill-conditioned. Don't panic prematurely, bestie ๐ญ๐ซถITHRESH(INTEGER) โ the max number of residual computations allowed for refinement. Default is10. For'aggressive'set it to100to permit convergence using approximate factorizations, or factorizations other than LU. โ ๏ธ But if the factorization uses a technique other than Gaussian elimination, then the guarantees inERR_BNDS_NORMandERR_BNDS_COMPmay no longer be trustworthy. Slippery slope, no cap.RTHRESHRTHRESHโDOUBLE PRECISION</p>. This is the โจwhen-do-I-give-upโจ knob: it decides when to stop refining if the error estimate stops decreasing. Refinement stops the moment the next solution no longer satisfiesnorm(dx_{i+1}) < RTHRESH * norm(dx_i), wherenorm(Z)is the infinity norm ofZ.RTHRESHsatisfies0 < RTHRESH <= 1. Default is0.5. For the 'aggressive' vibes, set it to0.9to permit convergence on extremely ill-conditioned matrices. See LAWN 165 for more details. ๐DZ_UBโDOUBLE PRECISION</p>. Determines when to start considering componentwise convergence. And no, bestie, componentwise convergence is not invited to the party early โ it's only considered after each component of the solutionYis stable, which we define as the relative change in each component being less thanDZ_UB. Default is0.25, requiring the first bit to be stable. See LAWN 165 for more details. ๐IGNORE_CWISEโLOGICAL</p>. If.TRUE.then ignore componentwise convergence. Default value is.FALSE.. (so by default we do care, bestie ๐)INFOโINTEGER</p>.= 0: Successful exit. slay ๐< 0: ifINFO = -i, theith argument toZLA_HERFSX_EXTENDEDhad an illegal value ๐
๐ธ Author ๐ธ
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Definition at line 388 of file zla_herfsx_extended.f.
subroutine zla_syrfsx_extended
subroutine zla_syrfsx_extended (integer prec_type, character uplo, integer
n, integer nrhs, complex*16, dimension( lda, * ) a, integer lda,
complex*16, dimension( ldaf, * ) af, integer ldaf, integer, dimension( *
) ipiv, logical colequ, double precision, dimension( * ) c, complex*16,
dimension( ldb, * ) b, integer ldb, complex*16, dimension( ldy, * ) y,
integer ldy, double precision, dimension( * ) berr_out, integer n_norms,
double precision, dimension( nrhs, * ) err_bnds_norm, double precision,
dimension( nrhs, * ) err_bnds_comp, complex*16, dimension( * ) res,
double precision, dimension( * ) ayb, complex*16, dimension( * ) dy,
complex*16, dimension( * ) y_tail, double precision rcond, integer
ithresh, double precision rthresh, double precision dz_ub, logical
ignore_cwise, integer info)
ZLA_SYRFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric indefinite matrices by performing extra-precise iterative refinement and provides error bounds and backward error estimates for the solution. ๐ฆ
Purpose
okay so, for real: 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 the normwise error bound, the code provides the maximum componentwise error bound if possible. See the comments for ERR_BNDS_NORM and ERR_BNDS_COMP for details of the error bounds. Note that this subroutine is only responsible for setting the second fields of ERR_BNDS_NORM and ERR_BNDS_COMP. ๐ (yes, only the second field, she's not doing the whole thing, she's got boundaries)
Parameters
PREC_TYPEโINTEGER</p>. Specifies the intermediate precision to be used in refinement. The value is defined byILAPREC(P)wherePis aCHARACTERandP= 'S': Single= 'D': Double= 'I': Indigenous= 'X'or'E': Extra
UPLOโCHARACTER*1</p>.= 'U': Upper triangle ofAis stored;= 'L': Lower triangle ofAis stored.
NโINTEGER</p>. The number of linear equations, i.e., the order of the matrixA.N >= 0.NRHSโINTEGER</p>. The number of right-hand-sides, i.e., the number of columns of the matrixB.AโCOMPLEX*16array, dimension(LDA,N)</p>. On entry, theN-by-NmatrixA. ๐ซถLDAโINTEGER</p>. The leading dimension of the arrayA.LDA >= max(1,N).AFโCOMPLEX*16array, dimension(LDAF,N)</p>. The block diagonal matrixDand the multipliers used to obtain the factorUorLas computed byZSYTRF. literally her whole backstory ๐LDAFโINTEGER</p>. The leading dimension of the arrayAF.LDAF >= max(1,N).IPIVโINTEGERarray, dimension(N)</p>. Details of the interchanges and the block structure ofDas determined byZSYTRF.COLEQUโLOGICAL</p>. If.TRUE.then column equilibration was done toAbefore calling this routine. This is needed to compute the solution and error bounds correctly. (don't lie to her about this one, she will notice ๐ซฃ)CโDOUBLE PRECISIONarray, dimension(N)</p>. The column scale factors forA. IfCOLEQU = .FALSE.,Cis not accessed. IfCis input, each element ofCshould 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. โ ๏ธ (read that twice, bestie, that's the cautionary tale of the whole section)BโCOMPLEX*16array, dimension(LDB,NRHS)</p>. The right-hand-side matrixB.LDBโINTEGER</p>. The leading dimension of the arrayB.LDB >= max(1,N).YโCOMPLEX*16array, dimension(LDY,NRHS)</p>. On entry, the solution matrixX, as computed byZSYTRS. On exit, the improved solution matrixY. โจ glow-up โจLDYโINTEGER</p>. The leading dimension of the arrayY.LDY >= max(1,N).BERR_OUTโDOUBLE PRECISIONarray, dimension(NRHS)</p>. On exit,BERR_OUT(j)contains the componentwise relative backward error for right-hand-sidejfrom 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โINTEGER</p>. Determines which error bounds to return (seeERR_BNDS_NORMandERR_BNDS_COMP).- If
N_NORMS >= 1return normwise error bounds. - If
N_NORMS >= 2return componentwise error bounds.
- If
ERR_BNDS_NORMโDOUBLE PRECISIONarray, dimension(NRHS, N_ERR_BNDS)</p>. 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โ boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon').err = 2โ error bound: The estimated forward error, almost certainly within a factor of10of the true error so long as the next entry is greater than the thresholdsqrt(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 thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrixZ. LetZ = S*A, whereSscales each row by a power of the radix so all absolute row sums ofZare approximately1. ๐ (yeah the sentence just trails off in the source, we don't gatekeep, we report it verbatim)
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
Okay bestie, the parameter section is still going โ these are the final function-doc entries, and they're giving workspace + tuning-knob realness ๐
ERR_BNDS_COMPโ is aDOUBLE PRECISIONarray, 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:
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 < 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โ boolean. Trust the answer if the reciprocal condition number is less than the thresholdsqrt(n) * slamch('Epsilon').err = 2โ 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 thresholdsqrt(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 thresholdsqrt(n) * slamch('Epsilon')to determine if the error estimate is . These reciprocal condition numbers are1 / (norm(Z^{-1},inf) * norm(Z,inf))for some appropriately scaled matrixZ. LetZ = S*(A*diag(x)), wherexis the solution for the current right-hand side andSscales each row ofA*diag(x)by a power of the radix so all absolute row sums ofZare 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โ isCOMPLEX*16array, dimension(N). Workspace to hold the intermediate residual.AYBโ isDOUBLE PRECISIONarray, dimension(N). Workspace.DYโ isCOMPLEX*16array, dimension(N). Workspace to hold the intermediate solution.Y_TAILโ isCOMPLEX*16array, dimension(N). Workspace to hold the trailing bits of the intermediate solution.RCONDโ isDOUBLE PRECISION. Reciprocal scaled condition number. This is an estimate of the reciprocal Skeel condition number of the matrixAafter 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โ isINTEGER. The maximum number of residual computations allowed for refinement. The default is10. For'aggressive'set to100to permit convergence using approximate factorizations or factorizations other than LU. If the factorization uses a technique other than Gaussian elimination, the guarantees inERR_BNDS_NORMandERR_BNDS_COMPmay no longer be trustworthy.RTHRESHโ isDOUBLE PRECISION. Determines when to stop refinement if the error estimate stops decreasing. Refinement will stop when the next solution no longer satisfiesnorm(dx_{i+1}) < RTHRESH * norm(dx_i)wherenorm(Z)is the infinity norm ofZ.RTHRESHsatisfies0 < RTHRESH <= 1. The default value is0.5. For'aggressive'set to0.9to permit convergence on extremely ill-conditioned matrices. See LAWN 165 for more details.DZ_UBโ isDOUBLE PRECISION. Determines when to start considering componentwise convergence. Componentwise convergence is only considered after each component of the solutionYis stable, which we define as the relative change in each component being less thanDZ_UB. The default value is0.25, requiring the first bit to be stable. See LAWN 165 for more details.IGNORE_CWISEโ isLOGICAL. If.TRUE.then ignore componentwise convergence. Default value is.FALSE..INFOโ isINTEGER.= 0: Successful exit.< 0: ifINFO = -i, the ith argument toZLA_HERFSX_EXTENDEDhad an illegal value.
Author ๐
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Definition at line 388 of file zla_syrfsx_extended.f.
Author ๐งพ
Generated automatically by Doxygen for LAPACK from the source code.
That's the whole page, bestie ๐ซถ โ official footer sign-off: LAPACK Version 3.12.0, manual page la_herfsx_extended(3). That's the source/version + date-stamp energy at the very bottom, and we are done slaying this manpage ๐โจ
๐ฆ where this page comes from
- arch rolling: lapack-doc 3.12.1-2 ยท custom
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms