SRC/ctrevc.f(3)

πŸ’… SRC/ctrevc.f

okay so bestie, this is the manual page for SRC/ctrevc.f, and it's literally the Fortran home of the CTREVC subroutine πŸŽ€ like, the whole page is basically one iconic little function and its whole personality. Come learn her with me πŸ’–


✨ SYNOPSIS ✨

Functions/Subroutines

subroutine ctrevc (side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr,
    mm, m, work, rwork, info)

That's CTREVC πŸ‘‘ no cap, that's the whole vibe.


🌸 Function/Subroutine Documentation 🌸

CTREVC

subroutine ctrevc (character side, character howmny, logical, dimension( * )
    select, integer n, complex, dimension( ldt, * ) t, integer ldt, complex,
    dimension( ldvl, * ) vl, integer ldvl, complex, dimension( ldvr, * ) vr,
    integer ldvr, integer mm, integer m, complex, dimension( * ) work, real,
    dimension( * ) rwork, integer info)

πŸ’œ Purpose

Okay so, what does she even do? CTREVC computes some or all of the right and/or left eigenvectors of a complex upper triangular matrix T ✨. Matrices of this type are produced by the Schur factorization of a complex general matrix: A = Q*T*Q**H, as computed by CHSEQR πŸ¦‹.

The right eigenvector x and the left eigenvector y of T corresponding to an eigenvalue w are defined by:

             T*x = w*x,     (y**H)*T = w*(y**H)

where y**H denotes the conjugate transpose of the vector y 🌈. And here's the cute part β€” the eigenvalues are not input to this routine, they're read directly from the diagonal of T πŸ™ˆ.

This routine returns the matrices X and/or Y of right and left eigenvectors of T, or the products Q*X and/or Q*Y, where Q is an input matrix πŸ’«. So if Q is the unitary factor that reduces a matrix A to Schur form T, then Q*X and Q*Y are the matrices of right and left eigenvectors of A. slay.


πŸŽ€ Parameters

  • SIDE β€” SIDE is CHARACTER*1.
    • = 'R': compute right eigenvectors only;
    • = 'L': compute left eigenvectors only;
    • = 'B': compute both right and left eigenvectors.
  • HOWMNY β€” HOWMNY is CHARACTER*1.
    • = 'A': compute all right and/or left eigenvectors;
    • = 'B': compute all right and/or left eigenvectors, backtransformed using the matrices supplied in VR and/or VL;
    • = 'S': compute selected right and/or left eigenvectors, as indicated by the logical array SELECT.
  • SELECT β€” SELECT is LOGICAL array, dimension (N). If HOWMNY = 'S', SELECT specifies the eigenvectors to be computed 🫢. The eigenvector corresponding to the j-th eigenvalue is computed if SELECT(j) = .TRUE.. Not referenced if HOWMNY = 'A' or 'B'.
  • N β€” N is INTEGER. The order of the matrix T. N >= 0 ⭐.
  • T β€” T is COMPLEX array, dimension (LDT,N). The upper triangular matrix T. Heads up bestie: T is modified, but restored on exit πŸ”₯ (she leaves it exactly how she found it, iconic).
  • LDT β€” LDT is INTEGER. The leading dimension of the array T. LDT >= max(1,N).
  • VL β€” VL is COMPLEX array, dimension (LDVL,MM). On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must contain an N-by-N matrix Q (usually the unitary matrix Q of Schur vectors returned by CHSEQR) 🌸. On exit, if SIDE = 'L' or 'B', VL contains:
    • if HOWMNY = 'A', the matrix Y of left eigenvectors of T;
    • if HOWMNY = 'B', the matrix Q*Y;
    • if HOWMNY = 'S', the left eigenvectors of T specified by SELECT, stored consecutively in the columns of VL, in the same order as their eigenvalues. Not referenced if SIDE = 'R' πŸ’€.
  • LDVL β€” LDVL is INTEGER. The leading dimension of the array VL. LDVL >= 1, and if SIDE = 'L' or 'B', LDVL >= N.
  • VR β€” VR is COMPLEX array, dimension (LDVR,MM). On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must contain an N-by-N matrix Q (usually the unitary matrix Q of Schur vectors returned by CHSEQR) 🌈. On exit, if SIDE = 'R' or 'B', VR contains:
    • if HOWMNY = 'A', the matrix X of right eigenvectors of T;
    • if HOWMNY = 'B', the matrix Q*X;
    • if HOWMNY = 'S', the right eigenvectors of T specified by SELECT, stored consecutively in the columns of VR, in the same order as their eigenvalues. Not referenced if SIDE = 'L' πŸ‘‘.
  • LDVR β€” LDVR is INTEGER. The leading dimension of the array VR. LDVR >= 1, and if SIDE = 'R' or 'B'; LDVR >= N.
  • MM β€” MM is INTEGER. The number of columns in the arrays VL and/or VR. MM >= M.
  • M β€” M is INTEGER. The number of columns in the arrays VL and/or VR actually used to store the eigenvectors πŸ’–. If HOWMNY = 'A' or 'B', M is set to N. Each selected eigenvector occupies one column.
  • WORK β€” WORK is COMPLEX array, dimension (2*N).
  • RWORK β€” RWORK is REAL array, dimension (N).
  • INFO β€” INFO is INTEGER.
    • = 0: successful exit πŸŽ‰
    • < 0: if INFO = -i, the i-th argument had an illegal value 😭

🧚 Author

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

the whole squad, fr fr 🫢


πŸ”₯ Further Details

The algorithm used in this program is basically backward (forward) substitution, with scaling to make the the code robust against possible overflow πŸ’… (yes, "the the" β€” that's verbatim, I don't make the rules, I just report them).

Each eigenvector is normalized so that the element of largest magnitude has magnitude 1 ✨; here the magnitude of a complex number (x,y) is taken to be |x| + |y|.


Definition at line 216 of file ctrevc.f.

πŸ’– Author (the meta one)

Generated automatically by Doxygen for LAPACK from the source code. not a human, just a very diligent little robot πŸŽ€


and that's the whole page bestie!! 🌸 this beauty ships with LAPACK, Version 3.12.0 πŸ’œ go forth and compute those eigenvectors, you absolute main character πŸ‘‘βœ¨

πŸ“¦ where this page comes from