SRC/sspsv.f(3)
β¨ SRC/sspsv.f(3) β¨
okay bestie, so this is a page straight out of the Library Functions Manual β it's SRC/sspsv.f(3), the glow-up doc for the Fortran subroutine sspsv. buckle up, she's a linear-algebra icon π
π¦ SYNOPSIS π¦
Functions/Subroutines
subroutine sspsv (uplo, n, nrhs, ap, ipiv, b, ldb, info)
SSPSV computes the solution to the system of linear equations A * X = B for OTHER matrices. periodt. π₯
π Function/Subroutine Documentation π
subroutine sspsv (character uplo, integer n, integer nrhs, real, dimension( * ) ap, integer, dimension( * ) ipiv, real, dimension( ldb, * ) b, integer ldb, integer info)
SSPSV computes the solution to the system of linear equations A * X = B for OTHER matrices. that's the whole vibe, no cap β¨
π Purpose:
!>
!> SSPSV computes the solution to a real system of linear equations
!> A * X = B,
!> where A is an N-by-N symmetric matrix stored in packed format and X
!> and B are N-by-NRHS matrices.
!>
!> The diagonal pivoting method is used to factor A as
!> A = U * D * U**T, if UPLO = 'U', or
!> A = L * D * L**T, if UPLO = 'L',
!> where U (or L) is a product of permutation and unit upper (lower)
!> triangular matrices, D is symmetric and block diagonal with 1-by-1
!> and 2-by-2 diagonal blocks. The factored form of A is then used to
!> solve the system of equations A * X = B.
!>
so basically: A is this N-by-N symmetric queen stored in packed format, and X and B are N-by-NRHS matrices. the diagonal pivoting method factors A into A = U * D * U**T when UPLO = 'U', or A = L * D * L**T when UPLO = 'L' β where U (or L) is a product of permutation and unit upper (lower) triangular matrices, and D is symmetric and block diagonal with 1-by-1 and 2-by-2 diagonal blocks π«Ά then that factored form gets used to solve A * X = B. she ate and left no crumbs.
πΈ Parameters πΈ
UPLOβUPLO is CHARACTER*1. it's giving "which triangle are we doing":
!> = 'U': Upper triangle of A is stored;
!> = 'L': Lower triangle of A is stored.
NβN is INTEGER. the number of linear equations, i.e. the order of the matrixA.N >= 0. lowkey the main character number here πNRHSβNRHS is INTEGER. the number of right hand sides, i.e. the number of columns of the matrixB.NRHS >= 0. πAPβAP is REAL array, dimension (N*(N+1)/2). okay so on entry, this holds the upper or lower triangle of the symmetric matrixA, packed columnwise in a linear array. the j-th column ofAis stored in the arrayAPlike this:
!> 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 (she said, teasingly).
on exit? the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T as computed by SSPTRF, stored as a packed triangular matrix in the same storage format as A. iconic behaviour honestly β¨
IPIVβIPIV is INTEGER array, dimension (N). all the deets on the interchanges and the block structure ofD, as determined bySSPTRF. so:
!> 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 -IPIV(k) were interchanged and
!> D(k-1:k,k-1:k) is a 2-by-2 diagonal block. If UPLO = 'L' and
!> IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and
!> -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2
!> diagonal block.
if IPIV(k) > 0, rows and columns k and IPIV(k) were swapped 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 -IPIV(k) were swapped and D(k-1:k,k-1:k) is a 2-by-2 diagonal block. and if UPLO = 'L' and IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were swapped and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. iykyk π
BβB is REAL array, dimension (LDB,NRHS). on entry, the N-by-NRHS right hand side matrixB. on exit, ifINFO = 0, the N-by-NRHS solution matrixX. glow-up complete, she's transformed πLDBβLDB is INTEGER. the leading dimension of the arrayB.LDB >= max(1,N). no skipping this one bestie, it's a whole rule πINFOβINFO is INTEGER. the vibe check:
!> = 0: successful exit
!> < 0: if INFO = -i, the i-th argument had an illegal value
!> > 0: if INFO = i, D(i,i) is exactly zero. The factorization
!> has been completed, but the block diagonal matrix D is
!> exactly singular, so the solution could not be
!> computed.
so = 0 means successful exit π, < 0 means if INFO = -i the i-th argument had an illegal value π, and > 0 means if INFO = i, D(i,i) is exactly zero β the factorization finished, but the block diagonal matrix D is exactly singular, so the solution could not be computed π that's the sad ending, fr.
π Author π
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
the academic royalty behind all of this. bow down π«Ά
π Further Details: π
okay this part is so satisfying, she really said "let me draw it for you":
!>
!> The packed storage scheme is illustrated by the following example
!> when N = 4, UPLO = 'U':
!>
!> Two-dimensional storage of the symmetric matrix A:
!>
!> a11 a12 a13 a14
!> a22 a23 a24
!> a33 a34 (aij = aji)
!> a44
!>
!> Packed storage of the upper triangle of A:
!>
!> AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ]
!>
see how the upper triangle just folds into that one flat array? the way that a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 reads like a little poem π¦ (and remember aij = aji β symmetric queen behaviour, she only needs to store half her business).
Definition at line 161 of file sspsv.f.
π« Author π«
Generated automatically by Doxygen for LAPACK from the source code. (not a human, just a very diligent robot π§)
and that's the whole page bestie! π this was LAPACK, Version 3.12.0, page SRC/sspsv.f(3) β go forth and solve those symmetric systems, you absolute icon πβ¨
π¦ 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