/home/abui...vsy_rook.f(3)

πŸ“¦ version 3.12.0, in opensuse-leap 16.0

🌸 CLAVSY_ROOK β€” the Fortran file that lives at /home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/TESTING/LIN/clavsy_rook.f πŸ’…

okay so bestie, real talk: this page is from the Library Functions Manual (section 3, the C library / routine section, iykyk), and it's the doc for one very specific little Fortran file deep in the LAPACK tree. yes the whole entire path is the name. no we're not shortening it. it's iconic like that πŸŽ€


✨ SYNOPSIS ✨

πŸ¦‹ Functions/Subroutines

subroutine CLAVSY_ROOK (uplo, trans, diag, n, nrhs, a, lda, ipiv, b,
    ldb, info)

CLAVSY_ROOK


πŸ’– Function/Subroutine Documentation πŸ’–

subroutine CLAVSY_ROOK (character uplo, character trans, character diag,
    integer n, integer nrhs, complex, dimension( lda, * ) a, integer lda,
    integer, dimension( * ) ipiv, complex, dimension( ldb, * ) b, integer
    ldb, integer info)

CLAVSY_ROOK

🌟 Purpose:

!>
!> CLAVSY_ROOK performs one of the matrix-vector operations
!>    x := A*x  or  x := A'*x,
!> where x is an N element vector and  A is one of the factors
!> from the block U*D*U' or L*D*L' factorization computed by CSYTRF_ROOK.
!>
!> If TRANS = 'N', multiplies by U  or U * D  (or L  or L * D)
!> If TRANS = 'T', multiplies by U' or D * U' (or L' or D * L')
!>

so basically she multiplies your vector by one of the factors that came out of CSYTRF_ROOK's block U*D*U' or L*D*L' situation. TRANS = 'N' gets you U or U * D (or L or L * D), and TRANS = 'T' gets you the transpose-flavored ones: U' or D * U' (or L' or D * L'). literally the whole menu πŸ”₯


πŸ‘‘ Parameters

🌈 UPLO

!>          UPLO is CHARACTER*1
!>          Specifies whether the factor stored in A is upper or lower
!>          triangular.
!>          = 'U':  Upper triangular
!>          = 'L':  Lower triangular
!>

she's a CHARACTER*1 and she tells you whether the factor chillin' in A is upper or lower triangular. 'U' = upper triangular, 'L' = lower triangular. pick your lane bestie πŸ’…

⭐ TRANS

!>          TRANS is CHARACTER*1
!>          Specifies the operation to be performed:
!>          = 'N':  x := A*x
!>          = 'T':  x := A'*x
!>

CHARACTER*1, tells you which operation we're doing. 'N' gives you x := A*x, 'T' gives you x := A'*x. that's it that's the whole vibe πŸ¦‹

πŸŽ€ DIAG

!>          DIAG is CHARACTER*1
!>          Specifies whether or not the diagonal blocks are unit
!>          matrices.  If the diagonal blocks are assumed to be unit,
!>          then A = U or A = L, otherwise A = U*D or A = L*D.
!>          = 'U':  Diagonal blocks are assumed to be unit matrices.
!>          = 'N':  Diagonal blocks are assumed to be non-unit matrices.
!>

CHARACTER*1, and she decides whether the diagonal blocks are unit matrices or not. if they're assumed unit, then A = U or A = L; otherwise A = U*D or A = L*D. values: 'U' = diagonal blocks assumed to be unit matrices, 'N' = diagonal blocks assumed to be non-unit matrices. choose wisely πŸ’–

πŸ“ N

!>          N is INTEGER
!>          The number of rows and columns of the matrix A.  N >= 0.
!>

INTEGER, the number of rows and columns of the matrix A. N >= 0. both dimensions, one number, she's efficient like that ✨

🧚 NRHS

!>          NRHS is INTEGER
!>          The number of right hand sides, i.e., the number of vectors
!>          x to be multiplied by A.  NRHS >= 0.
!>

INTEGER, the number of right hand sides, aka how many vectors x are getting multiplied by A. NRHS >= 0. multiple besties at once, we love a group activity 🫢

πŸ’œ A

!>          A is COMPLEX array, dimension (LDA,N)
!>          The block diagonal matrix D and the multipliers used to
!>          obtain the factor U or L as computed by CSYTRF_ROOK.
!>          Stored as a 2-D triangular matrix.
!>

COMPLEX array, dimension (LDA,N). she holds the block diagonal matrix D plus all the multipliers used to get the factor U or L, exactly as computed by CSYTRF_ROOK. stored as a 2-D triangular matrix. main character storage format tbh πŸ‘‘

🌸 LDA

!>          LDA is INTEGER
!>          The leading dimension of the array A.  LDA >= max(1,N).
!>

INTEGER, the leading dimension of the array A. LDA >= max(1,N). respect the leading dimension or perish 😭

πŸ”₯ IPIV

!>          IPIV is INTEGER array, dimension (N)
!>          Details of the interchanges and the block structure of D,
!>          as determined by CSYTRF_ROOK.
!>
!>          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 ) = k, no interchange was done).
!>
!>               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 ) = k, no interchange was done).
!>
!>               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.
!>

INTEGER array, dimension (N), and she's the receipts: all the interchange details and the block structure of D, as determined by CSYTRF_ROOK. ngl this is the part you actually have to read carefully, so here it is, in full:

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 ) = k, no interchange was done).
  • 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 ) = k, no interchange was done).
  • 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.

(yes, "inerchaged" is spelled exactly like that in the source. we do not correct the ancestors. we honor them πŸ’€)

πŸŽ€ B

!>          B is COMPLEX array, dimension (LDB,NRHS)
!>          On entry, B contains NRHS vectors of length N.
!>          On exit, B is overwritten with the product A * B.
!>

COMPLEX array, dimension (LDB,NRHS). on entry, B contains NRHS vectors of length N. on exit, B is overwritten with the product A * B. so like, she does not ask permission, she just replaces your B. that's her main character energy πŸ™ˆ

πŸ’œ LDB

!>          LDB is INTEGER
!>          The leading dimension of the array B.  LDB >= max(1,N).
!>

INTEGER, the leading dimension of the array B. LDB >= max(1,N). same rule as LDA, different letter. keep up bestie πŸ¦‹

🌈 INFO

!>          INFO is INTEGER
!>          = 0: successful exit
!>          < 0: if INFO = -k, the k-th argument had an illegal value
!>

INTEGER, the vibe check at the end. = 0: successful exit, we slayed ✨. < 0: if INFO = -k, the k-th argument had an illegal value. so if you see a negative number, go count your arguments, someone misbehaved 😭


πŸ‘‘ Author

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

Definition at line 153 of file clavsy_rook.f.


πŸŽ€ Author (yes, again)

Generated automatically by Doxygen for LAPACK from the source code. so nobody hand-wrote this one, the robot did it, and honestly? she ate πŸ€–πŸ’…


a cute little sign-off for you, bestie: this whole page is LAPACK, Version 3.12.0, and the footer date line points right back at /home/abui...vsy_rook.f(3). that's the whole manual page β€” every flag, every dimension, every max(1,N), every typo, all present and accounted for. no cap. πŸ«ΆπŸ’–βœ¨

πŸ“¦ where this page comes from