SRC/cppsvx.f(3)
β¨ NAME β¨
okay so this is the SRC/cppsvx.f page from the Library Functions Manual β section (3), bestie π. We're talking about the cppsvx subroutine today, and she's here to solve linear systems with packed Hermitian positive-definite matrices.
πΈ SYNOPSIS πΈ
π§ Functions/Subroutines
subroutine cppsvx (fact, uplo, n, nrhs, ap, afp, equed, s, b, ldb, x,
ldx, rcond, ferr, berr, work, rwork, info)
CPPSVX computes the solution to system of linear equations A * X =
B for OTHER matrices
The headline is literally CPPSVX computes the solution to system of linear equations A * X = B for OTHER matrices. Yes, OTHER is doing its own thing and we're keeping it exactly as written π.
π» FUNCTION/SUBROUTINE DOCUMENTATION π»
subroutine cppsvx (character fact, character uplo, integer n, integer nrhs,
complex, dimension( * ) ap, complex, dimension( * ) afp, character
equed, real, dimension( * ) s, complex, dimension( ldb, * ) b, integer
ldb, complex, dimension( ldx, * ) x, integer ldx, real rcond, real,
dimension( * ) ferr, real, dimension( * ) berr, complex, dimension( * )
work, real, dimension( * ) rwork, integer info)
Same energy: CPPSVX computes the solution to system of linear equations A * X = B for OTHER matrices.
π«Ά Purpose
CPPSVX is giving Cholesky-factorization main character energy β¨. She uses either A = U**H*U or A = L*L**H to solve the complex system of linear equations
A * X = B,
where A is an N-by-N Hermitian positive definite matrix stored in packed format, and X and B are N-by-NRHS matrices.
She also hands you error bounds on the solution plus a condition estimate. Obsessed.
π§ Description
The full glow-up sequence is:
- If
FACT = 'E', real scaling factors are computed to equilibrate the system:
diag(S) * A * diag(S) * inv(diag(S)) * X = diag(S) * B
Whether the system gets equilibrated depends on how A is scaled, but if equilibration happens, A is overwritten by diag(S)*A*diag(S) and B by diag(S)*B.
- If
FACT = 'N'or'E', the Cholesky decomposition factorsA(after equilibration ifFACT = 'E') as:
A = U**H * U , if UPLO = 'U', or
A = L * L**H, if UPLO = 'L',
where U is an upper triangular matrix, L is a lower triangular matrix, and **H means conjugate transpose. Periodt.
- If the leading principal minor of order
iis not positive, the routine returns withINFO = i. Otherwise, the factored form ofAis used to estimate the condition number ofA. If the reciprocal of the condition number is less than machine precision,INFO = N+1is returned as a warning, but the routine still goes on to solve forXand compute error bounds as described below. She's dramatic but functional π . - The system of equations is solved for
Xusing the factored form ofA. - Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it.
- If equilibration was used, the matrix
Xis premultiplied bydiag(S)so that it solves the original system before equilibration.
π Parameters
FACT
FACT is CHARACTER*1
Tells us whether the factored form of matrix A is supplied on entry, and if not, whether A should be equilibrated before it is factored. The options are:
= 'F'β On entry,AFPcontains the factored form ofA. IfEQUED = 'Y', the matrixAhas been equilibrated with scaling factors given byS.APandAFPwill not be modified.= 'N'β The matrixAwill be copied toAFPand factored.= 'E'β The matrixAwill be equilibrated if necessary, then copied toAFPand factored.
UPLO
UPLO is CHARACTER*1
= 'U'β Upper triangle ofAis stored.= 'L'β Lower triangle ofAis stored.
N
N is INTEGER
The number of linear equations, i.e., the order of the matrix A. N >= 0.
NRHS
NRHS is INTEGER
The number of right hand sides, i.e., the number of columns of the matrices B and X. NRHS >= 0.
AP
AP is COMPLEX array, dimension (N*(N+1)/2)
On entry, this is the upper or lower triangle of the Hermitian matrix A, packed columnwise in a linear array. Exception: if FACT = 'F' and EQUED = 'Y', then A must contain the equilibrated matrix diag(S)*A*diag(S). The j-th column of A is stored in AP as follows:
if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j;
if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n.
See below for further details. A is not modified if FACT = 'F' or 'N', or if FACT = 'E' and EQUED = 'N' on exit.
On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by diag(S)*A*diag(S).
AFP
AFP is COMPLEX array, dimension (N*(N+1)/2)
- If
FACT = 'F', thenAFPis an input argument and on entry contains the triangular factorUorLfrom the Cholesky factorizationA = U**H*UorA = L*L**H, in the same storage format asA. IfEQUED .ne. 'N', thenAFPis the factored form of the equilibrated matrixA. - If
FACT = 'N', thenAFPis an output argument and on exit returns the triangular factorUorLfrom the Cholesky factorizationA = U**H * UorA = L * L**Hof the original matrixA. - If
FACT = 'E', thenAFPis an output argument and on exit returns the triangular factorUorLfrom the Cholesky factorizationA = U**H*UorA = L*L**Hof the equilibrated matrixA(see the description ofAPfor the form of the equilibrated matrix).
EQUED
EQUED is CHARACTER*1
Specifies the form of equilibration that was done.
= 'N'β No equilibration (always true ifFACT = 'N').= 'Y'β Equilibration was done, i.e.,Ahas been replaced bydiag(S) * A * diag(S).
EQUED is an input argument if FACT = 'F'; otherwise, it is an output argument.
S
S is REAL array, dimension (N)
The scale factors for A; not accessed if EQUED = 'N'. S is an input argument if FACT = 'F'; otherwise, S is an output argument. If FACT = 'F' and EQUED = 'Y', each element of S must be positive.
B
B is COMPLEX array, dimension (LDB,NRHS)
On entry, the N-by-NRHS right hand side matrix B. On exit, if EQUED = 'N', B is not modified; if EQUED = 'Y', B is overwritten by diag(S) * B.
LDB
LDB is INTEGER
The leading dimension of the array B. LDB >= max(1,N).
X
X is COMPLEX array, dimension (LDX,NRHS)
If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X to the original system of equations. Note that if EQUED = 'Y', A and B are modified on exit, and the solution to the equilibrated system is inv(diag(S))*X.
LDX
LDX is INTEGER
The leading dimension of the array X. LDX >= max(1,N).
RCOND
RCOND is REAL
The estimate of the reciprocal condition number of the matrix A after equilibration (if done). If RCOND is less than the machine precision (in particular, if RCOND = 0), the matrix is singular to working precision. This condition is indicated by a return code of INFO > 0.
FERR
FERR is REAL array, dimension (NRHS)
The estimated forward error bound for each solution vector X(j) (the j-th column of the solution matrix X). If XTRUE is the true solution corresponding to X(j), FERR(j) is an estimated upper bound for the magnitude of the largest element in (X(j) - XTRUE) divided by the magnitude of the largest element in X(j). The estimate is as reliable as the estimate for RCOND, and is almost always a slight overestimate of the true error.
BERR
BERR is REAL array, dimension (NRHS)
The componentwise relative backward error of each solution vector X(j) (i.e., the smallest relative change in any element of A or B that makes X(j) an exact solution).
WORK
WORK is COMPLEX array, dimension (2*N)
That's the whole vibe: a COMPLEX workspace array with dimension (2*N).
RWORK
RWORK is REAL array, dimension (N)
A REAL workspace array with dimension (N).
INFO
INFO is INTEGER
The exit-status bestie:
= 0β successful exit.< 0β ifINFO = -i, thei-th argument had an illegal value.> 0β ifINFO = i, andiis:<= Nβ the leading principal minor of orderiofAis not positive, so the factorization could not be completed, and the solution has not been computed.RCOND = 0is returned.= N+1βUis nonsingular, butRCONDis less than machine precision, meaning that the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed because there are a number of situations where the computed solution can be more accurate than the value ofRCONDwould suggest.
π Author
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
π Further Details π
Ok so like, picture it: the packed storage scheme is genuinely so cute once you see it laid out. Take this example where N = 4 and UPLO = 'U' π
First, the two-dimensional storage of the Hermitian matrix A β look at all that wasted space in the lower triangle, we literally don't need it bestie:
a11 a12 a13 a14
a22 a23 a24
a33 a34 (aij = conjg(aji))
a44
See that note? aij = conjg(aji) β that's the whole Hermitian thing, the matrix is its own conjugate transpose, so the bottom half is just the top half's reflection and we said "not today" to storing it twice β¨
So instead, we pack the upper triangle of A all snug into one precious little array:
AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ]
Column by column, upper triangle only, zero wasted slots. It's giving "closet organized by a Virgo" π Iconic behavior, honestly.
Ngl the packed storage scheme is the main character here β every one of those ten values is doing its job and not one of them is filler π
And that's a wrap on this one β Definition at line 309 of file cppsvx.f.
π AUTHOR π
Generated automatically by Doxygen for LAPACK from the source code. No human author to thank, it's just the doc-generator doing its thing, slay π«Ά
That's the whole page bestie!! π This little beauty came to you courtesy of LAPACK, Version 3.12.0, and the file SRC/cppsvx.f(3) β that's the page footer, and yes, I'm mentioning it because it deserves its moment πΈ Byeee, go read some more manpages, ily!! π¦
π¦ 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