ZHPTRF(3)
π ZHPTRF(3) π
okay bestie so we're in the Library Functions Manual, and this page lives at /home/abui...RC/zhptrf.f(3) β yes that's the whole path, she's dramatic like that, and it's the same path at the top and the bottom of the page because symmetry slay π
β¨ NAME β¨
/home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/SRC/zhptrf.f
like... that's her. that's the whole name. a whole file path. iconic honestly π«Ά
β¨ SYNOPSIS β¨
πΈ Functions/Subroutines πΈ
subroutine ZHPTRF (uplo, n, ap, ipiv, info)
ZHPTRF
π Function/Subroutine Documentation π
subroutine ZHPTRF (character uplo, integer n, complex*16, dimension( * ) ap,
integer, dimension( * ) ipiv, integer info)
ZHPTRF
π Purpose: π
!> !> ZHPTRF computes the factorization of a complex Hermitian packed !> matrix A using the Bunch-Kaufman diagonal pivoting method: !> !> A = U*D*UH or A = L*D*LH !> !> where U (or L) is a product of permutation and unit upper (lower) !> triangular matrices, and D is Hermitian and block diagonal with !> 1-by-1 and 2-by-2 diagonal blocks. !>
so basically: you hand her a complex Hermitian matrix that's packed (more on that in a sec, don't panic), and she factorizes it with the Bunch-Kaufman diagonal pivoting method. she gives you back either A = U*D*U**H or A = L*D*L**H β your pick, depending on uplo. U (or L) is a product of permutation and unit upper (or lower) triangular matrices, and D is Hermitian and block diagonal with 1-by-1 and 2-by-2 diagonal blocks. math serving looks, periodt β¨
π¦ Parameters π¦
UPLOβ yo this isCHARACTER*1and it picks your whole vibe:
!> UPLO is CHARACTER*1 !> = 'U': Upper triangle of A is stored; !> = 'L': Lower triangle of A is stored. !>
so 'U' means the upper triangle of A is stored, 'L' means the lower triangle is stored. pick one, she'll respect it π
NβNisINTEGER, and it's the order of the matrix A. the rule isN >= 0. no negative orders, we don't do that here π«APβAPis aCOMPLEX*16array, dimension(N*(N+1)/2). ngl this is the fun one:
!> AP is COMPLEX*16 array, dimension (N*(N+1)/2) !> On entry, the upper or lower triangle of the Hermitian matrix !> A, packed columnwise in a linear array. The j-th column of A !> is stored in the array 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. !> !> On exit, the block diagonal matrix D and the multipliers used !> to obtain the factor U or L, stored as a packed triangular !> matrix overwriting A (see below for further details). !>
so on entry it's the upper-or-lower triangle of the Hermitian matrix A, packed columnwise in a linear array. mapping is:
- if
UPLO = 'U', thenAP(i + (j-1)*j/2) = A(i,j)for1<=i<=j - if
UPLO = 'L', thenAP(i + (j-1)*(2n-j)/2) = A(i,j)forj<=i<=n
and on exit? the block diagonal matrix D and the multipliers used to get U or L are sitting in there, stored as a packed triangular matrix overwriting A (more deets below, keep scrolling bestie π)
IPIVβIPIVis anINTEGERarray, dimension(N). this one tells you all the tea about the interchanges and the block structure of D:
!> IPIV is INTEGER array, dimension (N) !> Details of the interchanges and the block structure of D. !> 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. !>
breaking it down:
IPIV(k) > 0β rows and columnskandIPIV(k)got interchanged, andD(k,k)is a 1-by-1 diagonal blockUPLO = 'U'andIPIV(k) = IPIV(k-1) < 0β rows and columnsk-1and-IPIV(k)got interchanged, andD(k-1:k,k-1:k)is a 2-by-2 diagonal blockUPLO = 'L'andIPIV(k) = IPIV(k+1) < 0β rows and columnsk+1and-IPIV(k)got interchanged, andD(k:k+1,k:k+1)is a 2-by-2 diagonal block
INFOβINFOisINTEGERand it's the vibe check at the end:
!> INFO is INTEGER !> = 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, and division by zero will occur if it !> is used to solve a system of equations. !>
so: = 0 slayed, successful exit π. < 0 means if INFO = -i, the i-th argument had an illegal value π. > 0 means if INFO = i, then D(i,i) is exactly zero β the factorization finished, but the block diagonal matrix D is exactly singular, and division by zero will occur if you use it to solve a system of equations π so like, actually read this one.
π Author π
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
the whole squad, fr fr π«Ά
β Further Details: β
!> !> If UPLO = 'U', then A = U*D*UH, where !> U = P(n)U(n) ... P(k)U(k) ..., !> i.e., U is a product of terms P(k)U(k), where k decreases from n to !> 1 in steps of 1 or 2, and D is a block diagonal matrix with 1-by-1 !> and 2-by-2 diagonal blocks D(k). P(k) is a permutation matrix as !> defined by IPIV(k), and U(k) is a unit upper triangular matrix, such !> that if the diagonal block D(k) is of order s (s = 1 or 2), then !> !> ( I v 0 ) k-s !> U(k) = ( 0 I 0 ) s !> ( 0 0 I ) n-k !> k-s s n-k !> !> If s = 1, D(k) overwrites A(k,k), and v overwrites A(1:k-1,k). !> If s = 2, the upper triangle of D(k) overwrites A(k-1,k-1), A(k-1,k), !> and A(k,k), and v overwrites A(1:k-2,k-1:k). !> !> If UPLO = 'L', then A = LD*LH, where !> L = P(1)L(1) ... P(k)L(k)* ..., !> i.e., L is a product of terms P(k)*L(k), where k increases from 1 to !> n in steps of 1 or 2, and D is a block diagonal matrix with 1-by-1 !> and 2-by-2 diagonal blocks D(k). P(k) is a permutation matrix as !> defined by IPIV(k), and L(k) is a unit lower triangular matrix, such !> that if the diagonal block D(k) is of order s (s = 1 or 2), then !> !> ( I 0 0 ) k-1 !> L(k) = ( 0 I 0 ) s !> ( 0 v I ) n-k-s+1 !> k-1 s n-k-s+1 !> !> If s = 1, D(k) overwrites A(k,k), and v overwrites A(k+1:n,k). !> If s = 2, the lower triangle of D(k) overwrites A(k,k), A(k+1,k), !> and A(k+1,k+1), and v overwrites A(k+2:n,k:k+1). !>
let me walk you through it because this is the part where people get lost π
upper case scenario (UPLO = 'U'): then A = U*D*U**H, where
U = P(n)*U(n)* ... *P(k)U(k)* ...,
like, U is a product of terms P(k)*U(k), where k decreases from n to 1 in steps of 1 or 2, and D is a block diagonal matrix with 1-by-1 and 2-by-2 diagonal blocks D(k). P(k) is a permutation matrix as defined by IPIV(k), and U(k) is a unit upper triangular matrix, such that if the diagonal block D(k) is of order s (s = 1 or 2), then:
( I v 0 ) k-s
U(k) = ( 0 I 0 ) s
( 0 0 I ) n-k
k-s s n-k
- if
s = 1,D(k)overwritesA(k,k), andvoverwritesA(1:k-1,k) - if
s = 2, the upper triangle ofD(k)overwritesA(k-1,k-1),A(k-1,k), andA(k,k), andvoverwritesA(1:k-2,k-1:k)
lower case scenario (UPLO = 'L'): then A = L*D*L**H, where
L = P(1)*L(1)* ... *P(k)*L(k)* ...,
so L is a product of terms P(k)*L(k), where k increases from 1 to n in steps of 1 or 2, and D is a block diagonal matrix with 1-by-1 and 2-by-2 diagonal blocks D(k). P(k) is a permutation matrix as defined by IPIV(k), and L(k) is a unit lower triangular matrix, such that if the diagonal block D(k) is of order s (s = 1 or 2), then:
( I 0 0 ) k-1
L(k) = ( 0 I 0 ) s
( 0 v I ) n-k-s+1
k-1 s n-k-s+1
- if
s = 1,D(k)overwritesA(k,k), andvoverwritesA(k+1:n,k) - if
s = 2, the lower triangle ofD(k)overwritesA(k,k),A(k+1,k), andA(k+1,k+1), andvoverwritesA(k+2:n,k:k+1)
see? told you it was the fun part π
π§ Contributors: π§
- J. Lewis, Boeing Computer Services Company
shoutout J. Lewis, legend behavior π
Definition at line 158 of file zhptrf.f. β yes she's got a line number, she's that girl β¨
πΈ Author πΈ
Generated automatically by Doxygen for LAPACK from the source code.
(literally a bot wrote this bit, but it ate, no cap π«Ά)
and that's the page bestie!! LAPACK, Version 3.12.0, dated /home/abui...RC/zhptrf.f(3) β mwah, go factorize something Hermitian and packed, you've got this πβ¨ππ¦
π¦ where this page comes from
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms