/home/abui...trf_rook.f(3)
π /home/abui...trf_rook.f(3) β Library Functions Manual π
okay so bestie, welcome to the glow-up zone β¨ this is a page from the Library Functions Manual, and it's literally all about csytrf_rook.f β yes the whole filename is the NAME section, we don't make the rules, we just slay within them π«Ά
The full source path it came from, fr fr no edits:
/home/abuild/rpmbuild/BUILD/lapack-
static-3.12.0-build/lapack-3.12.0/SRC/csytrf_rook.f
β¨ SYNOPSIS β¨
Functions/Subroutines π¦
subroutine CSYTRF_ROOK (uplo, n, a, lda, ipiv, work, lwork, info)β that's the baddie, that's the main character,CSYTRF_ROOK.
πΈ Function/Subroutine Documentation πΈ
π subroutine CSYTRF_ROOK (character uplo, integer n, complex, dimension( lda, * ) a, integer lda, integer, dimension( * ) ipiv, complex, dimension( * ) work, integer lwork, integer info) π
CSYTRF_ROOK β say it with your chest π
π§ Purpose:
!>!> CSYTRF_ROOK computes the factorization of a complex symmetric matrix A!> using the bounded Bunch-Kaufman () diagonal pivoting method.!> The form of the factorization is!>!> A = U*D*U**T or A = L*D*L**T!>!> 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.!>!> This is the blocked version of the algorithm, calling Level 3 BLAS.!>
so it factors a complex symmetric matrix A using the bounded Bunch-Kaufman (that empty parens is in the original, don't come for me π) diagonal pivoting method β giving you either A = U*D*U**T or A = L*D*L**T, 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. also!! it's the blocked version of the algorithm, calling Level 3 BLAS β‘ that's the performance era, we love her.
π Parameters (the whole roster, bestie, nobody gets left out)
UPLOβUPLO is CHARACTER*1
!> = 'U': Upper triangle of A is stored;!> = 'L': Lower triangle of A is stored.!>
so 'U' means upper triangle of A is stored, 'L' means lower triangle of A is stored. pick your fighter π
NβN is INTEGER
!> The order of the matrix A. N >= 0.!>
it's the order of the matrix A, and it has to be N >= 0. negative N? not today bestie π
AβA is COMPLEX array, dimension (LDA,N)
!> On entry, the symmetric matrix A. If UPLO = 'U', the leading!> N-by-N upper triangular part of A contains the upper!> triangular part of the matrix A, and the strictly lower!> triangular part of A is not referenced. If UPLO = 'L', the!> leading N-by-N lower triangular part of A contains the lower!> triangular part of the matrix A, and the strictly upper!> triangular part of A is not referenced.!>!> On exit, the block diagonal matrix D and the multipliers used!> to obtain the factor U or L (see below for further details).!>
on entry it's your symmetric matrix A. if UPLO = 'U', the leading N-by-N upper triangular part holds the upper triangular part of A and the strictly lower triangular part is not referenced (left on read π). if UPLO = 'L', the leading N-by-N lower triangular part holds the lower triangular part of A and the strictly upper triangular part is not referenced. on exit, the block diagonal matrix D and the multipliers used to obtain the factor U or L are living here β see the Further Details below for the whole saga π¦
LDAβLDA is INTEGER
!> The leading dimension of the array A. LDA >= max(1,N).!>
the leading dimension of the array A, and it needs LDA >= max(1,N). periodt.
IPIVβIPIV is INTEGER array, dimension (N)
!> Details of the interchanges and the block structure of D.!>!> If UPLO = 'U':!> 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 IPIV(k) < 0 and IPIV(k-1) < 0, then rows and!> columns k and -IPIV(k) were interchanged and rows and!> columns k-1 and -IPIV(k-1) were inerchaged,!> D(k-1:k,k-1:k) is a 2-by-2 diagonal block.!>!> If UPLO = 'L':!> 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 IPIV(k) < 0 and IPIV(k+1) < 0, then rows and!> columns k and -IPIV(k) were interchanged and rows and!> columns k+1 and -IPIV(k+1) were inerchaged,!> D(k:k+1,k:k+1) is a 2-by-2 diagonal block.!>
this is the receipts on the interchanges and the block structure of D π§Ύ
if UPLO = 'U':
- if
IPIV(k) > 0, then rows and columnskandIPIV(k)were interchanged andD(k,k)is a 1-by-1 diagonal block π« - if
IPIV(k) < 0andIPIV(k-1) < 0, then rows and columnskand-IPIV(k)were interchanged and rows and columnsk-1and-IPIV(k-1)were inerchaged (yes, "inerchaged" β that typo is canon, it's in the source, we respect the lore π), andD(k-1:k,k-1:k)is a 2-by-2 diagonal block.
if UPLO = 'L':
- if
IPIV(k) > 0, then rows and columnskandIPIV(k)were interchanged andD(k,k)is a 1-by-1 diagonal block π« - if
IPIV(k) < 0andIPIV(k+1) < 0, then rows and columnskand-IPIV(k)were interchanged and rows and columnsk+1and-IPIV(k+1)were inerchaged (same typo, she's consistent π), andD(k:k+1,k:k+1)is a 2-by-2 diagonal block.
WORKβWORK is COMPLEX array, dimension (MAX(1,LWORK))
!> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.!>
on exit, if INFO = 0, then WORK(1) returns the optimal LWORK. she's giving helpful π«Ά
LWORKβLWORK is INTEGER
!> The length of WORK. LWORK >=1. For best performance!> LWORK >= N*NB, where NB is the block size returned by ILAENV.!>!> If LWORK = -1, then a workspace query is assumed; the routine!> only calculates the optimal size of the WORK array, returns!> this value as the first entry of the WORK array, and no error!> message related to LWORK is issued by XERBLA.!>
the length of WORK, and LWORK >= 1. for best performance, LWORK >= N*NB, where NB is the block size returned by ILAENV π₯
β οΈ important one bestie: ifLWORK = -1, then a workspace query is assumed β the routine only calculates the optimal size of theWORKarray, returns this value as the first entry of theWORKarray, and no error message related toLWORKis issued byXERBLA. so-1is the "just tell me the size, don't yell at me" mode π
INFOβ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.!>
= 0: successful exit, we ate π< 0: ifINFO = -i, the i-th argument had an illegal value π¨> 0: ifINFO = 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 like, clock that.
π Author
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
the whole squad, iconic π
π Further Details:
!>!> If UPLO = 'U', then A = U*D*U**T, 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 = L*D*L**T, 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).!>
okay so let me break this down for you like we're on facetime π
if UPLO = 'U', then A = U*D*U**T, 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). okay the way that's literally just bookkeeping bestie, don't overthink it π
if UPLO = 'L', then A = L*D*L**T, 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). look at her go πβ¨
π§Ύ Contributors:
!>!> June 2016, Igor Kozachenko,!> Computer Science Division,!> University of California, Berkeley!>!> September 2007, Sven Hammarling, Nicholas J. Higham, Craig Lucas,!> School of Mathematics,!> University of Manchester!>!>
so credit where it's due π«Ά:
- June 2016 β Igor Kozachenko, Computer Science Division, University of California, Berkeley
- September 2007 β Sven Hammarling, Nicholas J. Higham, Craig Lucas, School of Mathematics, University of Manchester
π Definition at line 207 of file csytrf_rook.f.
π Author
Generated automatically by Doxygen for LAPACK from the source code. (not a human, a whole robot did this, and honestly? she understood the assignment π€π)
and that's the whole page, bestie!! π
β¨ this beauty is from LAPACK, Version 3.12.0, and the file we've been screaming about is /home/abui...trf_rook.f(3) π mwah, go factor some complex symmetric matrices, 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