TESTING/EIG/cchkhs.f(3)

πŸ“¦
version 3.12.1 Β· 2 versions
, in arch rolling

πŸ’– TESTING/EIG/cchkhs.f πŸ’–

bestie, this is the TESTING/EIG/cchkhs.f(3) page from the Library Functions Manual, and the file is literally TESTING/EIG/cchkhs.f β€” it’s giving main-character Fortran test-driver energy, and we are keeping every single detail. πŸ¦‹βœ¨


🌸 NAME 🌸

TESTING/EIG/cchkhs.f


✨ SYNOPSIS ✨

πŸŽ€ Functions/Subroutines πŸŽ€

  • subroutine cchkhs (nsizes, nn, ntypes, dotype, iseed, thresh, nounit, a, lda, h, t1, t2, u, ldu, z, uz, w1, w3, evectl, evectr, evecty, evectx, uu, tau, work, nwork, rwork, iwork, select, result, info) β€” this is CCHKHS, the whole vibe-check harness. πŸ‘‘

πŸ‘‘ Function/Subroutine Documentation πŸ‘‘

πŸ’… subroutine cchkhs πŸ’…

subroutine cchkhs (integer nsizes, integer, dimension( * ) nn, integer
    ntypes, logical, dimension( * ) dotype, integer, dimension( 4 ) iseed,
    real thresh, integer nounit, complex, dimension( lda, * ) a, integer
    lda, complex, dimension( lda, * ) h, complex, dimension( lda, * ) t1,
    complex, dimension( lda, * ) t2, complex, dimension( ldu, * ) u, integer
    ldu, complex, dimension( ldu, * ) z, complex, dimension( ldu, * ) uz,
    complex, dimension( * ) w1, complex, dimension( * ) w3, complex,
    dimension( ldu, * ) evectl, complex, dimension( ldu, * ) evectr,
    complex, dimension( ldu, * ) evecty, complex, dimension( ldu, * )
    evectx, complex, dimension( ldu, * ) uu, complex, dimension( * ) tau,
    complex, dimension( * ) work, integer nwork, real, dimension( * ) rwork,
    integer, dimension( * ) iwork, logical, dimension( * ) select, real,
    dimension( 16 ) result, integer info)

πŸŽ€ CCHKHS πŸŽ€

πŸ”₯ Purpose πŸ”₯

okay so CCHKHS checks the nonsymmetric eigenvalue problem routines, and the friend-group rundown is iconic:

  • CGEHRD factors A as U H U', where ' means conjugate transpose, H is hessenberg, and U is unitary. πŸ’œ
  • CUNGHR generates the unitary matrix U.
  • CUNMHR multiplies a matrix by the unitary matrix U.
  • CHSEQR factors H as Z T Z', where Z is unitary and T is upper triangular. It also computes the eigenvalues, w(1), ..., w(n); we define a diagonal matrix W whose (diagonal) entries are the eigenvalues. πŸŒ€
  • CTREVC computes the left eigenvector matrix L and the right eigenvector matrix R for the matrix T. The columns of L are the complex conjugates of the left eigenvectors of T. The columns of R are the right eigenvectors of T. L is lower triangular, and R is upper triangular. 🌸
  • CHSEIN computes the left eigenvector matrix Y and the right eigenvector matrix X for the matrix H. The columns of Y are the complex conjugates of the left eigenvectors of H. The columns of X are the right eigenvectors of H. Y is lower triangular, and X is upper triangular. ✨
  • CTREVC3 computes left and right eigenvector matrices from a Schur matrix T and backtransforms them with Z to eigenvector matrices L and R for A. L and R are GE matrices. πŸ’…

When CCHKHS is called, a number of matrix sizes and a number of matrix types are specified. For each size and each type of matrix, one matrix will be generated and used to test the nonsymmetric eigenroutines. For each matrix, 16 tests will be performed:

(1)     | A - U H U**H | / ( |A| n ulp )

(2)     | I - UU**H | / ( n ulp )

(3)     | H - Z T Z**H | / ( |H| n ulp )

(4)     | I - ZZ**H | / ( n ulp )

(5)     | A - UZ H (UZ)**H | / ( |A| n ulp )

(6)     | I - UZ (UZ)**H | / ( n ulp )

(7)     | T(Z computed) - T(Z not computed) | / ( |T| ulp )

(8)     | W(Z computed) - W(Z not computed) | / ( |W| ulp )

(9)     | TR - RW | / ( |T| |R| ulp )

(10)    | L**H T - W**H L | / ( |T| |L| ulp )

(11)    | HX - XW | / ( |H| |X| ulp )

(12)    | Y**H H - W**H Y | / ( |H| |Y| ulp )

(13)    | AX - XW | / ( |A| |X| ulp )

(14)    | Y**H A - W**H Y | / ( |A| |Y| ulp )

(15)    | AR - RW | / ( |A| |R| ulp )

(16)    | LA - WL | / ( |A| |L| ulp )

The sizes are specified by an array NN(1:NSIZES); the value of each element NN(j) specifies one size. The types are specified by a logical array DOTYPE( 1:NTYPES ); if DOTYPE(j) is .TRUE., then matrix type j will be generated. Currently, the list of possible types is:

  1. The zero matrix. πŸ«₯
  2. The identity matrix. πŸ‘‘
  3. A (transposed) Jordan block, with 1's on the diagonal.
  4. A diagonal matrix with evenly spaced entries 1, ..., ULP and random complex angles. (ULP = (first number larger than 1) - 1) 🌈
  5. A diagonal matrix with geometrically spaced entries 1, ..., ULP and random complex angles. πŸ¦‹
  6. A diagonal matrix with entries 1, ULP, ..., ULP and random complex angles. ✨
  7. Same as (4), but multiplied by SQRT( overflow threshold ).
  8. Same as (4), but multiplied by SQRT( underflow threshold ).
  9. A matrix of the form U' T U, where U is unitary and T has evenly spaced entries 1, ..., ULP with random complex angles on the diagonal and random O(1) entries in the upper triangle. πŸ’«
  10. A matrix of the form U' T U, where U is unitary and T has geometrically spaced entries 1, ..., ULP with random complex angles on the diagonal and random O(1) entries in the upper triangle. 🌟
  11. A matrix of the form U' T U, where U is unitary and T has entries 1, ULP,..., ULP with random complex angles on the diagonal and random O(1) entries in the upper triangle. πŸŽ€
  12. A matrix of the form U' T U, where U is unitary and T has complex eigenvalues randomly chosen from ULP < |z| < 1 and random O(1) entries in the upper triangle. πŸ”₯
  13. A matrix of the form X' T X, where X has condition SQRT( ULP ) and T has evenly spaced entries 1, ..., ULP with random complex angles on the diagonal and random O(1) entries in the upper triangle. πŸ’œ
  14. A matrix of the form X' T X, where X has condition SQRT( ULP ) and T has geometrically spaced entries 1, ..., ULP with random complex angles on the diagonal and random O(1) entries in the upper triangle. 🧚
  15. A matrix of the form X' T X, where X has condition SQRT( ULP ) and T has entries 1, ULP,..., ULP with random complex angles on the diagonal and random O(1) entries in the upper triangle. πŸ“
  16. A matrix of the form X' T X, where X has condition SQRT( ULP ) and T has complex eigenvalues randomly chosen from ULP < |z| < 1 and random O(1) entries in the upper triangle. πŸ’€
  17. Same as (16), but multiplied by SQRT( overflow threshold ).
  18. Same as (16), but multiplied by SQRT( underflow threshold ).
  19. Nonsymmetric matrix with random entries chosen from |z| < 1. 🌈
  20. Same as (19), but multiplied by SQRT( overflow threshold ).
  21. Same as (19), but multiplied by SQRT( underflow threshold ). 🌊
  • NSIZES β€” INTEGER. bestie this is literally "how many matrix sizes are we testing today." If it's zero, CCHKHS does nothing (naps, periodt). Must be at least zero. Not modified. 🫢
  • NN β€” INTEGER array, dimension (NSIZES). the actual sizes for the matrices, like a lil' lineup. Zero values get skipped entirely (they're not invited πŸ’…). All values must be at least zero. Not modified.
  • NTYPES β€” INTEGER. how many elements live in DOTYPE. If it's zero, again: CCHKHS does nothing. Must be at least zero. ok now the spicy part πŸ”₯ β€” if it equals MAXTYP+1 and NSIZES is 1, then an extra type, MAXTYP+1, gets defined, which means "just use whatever matrix is already in A." That's only useful when DOTYPE(1:MAXTYP) is .FALSE. and DOTYPE(MAXTYP+1) is .TRUE.. Not modified.
  • DOTYPE β€” LOGICAL array, dimension (NTYPES). the guest list πŸŽ€ if DOTYPE(j) is .TRUE., then for every size in NN a matrix of that size and of type j gets generated. If NTYPES is smaller than the max number of types defined (PARAMETER MAXTYP), then types NTYPES+1 through MAXTYP will not be generated. If NTYPES is bigger than MAXTYP, then DOTYPE(MAXTYP+1) through DOTYPE(NTYPES) are just ignored (left on read 😭). Not modified.
  • ISEED β€” INTEGER array, dimension (4). on entry this specifies the seed of the random number generator 🌱. the elements should be between 0 and 4095 β€” if not, they get reduced mod 4096. Also ISEED(4) must be odd, no exceptions. The generator uses a linear congruential sequence limited to small integers, so it should produce machine independent random numbers (iconic behaviour honestly ✨). The values of ISEED are changed on exit, and you can pass them into the next call to CCHKHS to continue the exact same random number sequence. Modified.
  • THRESH β€” REAL. a test counts as [an error] if the [ratio], computed as described above, exceeds THRESH. heads up 🚨 the error is scaled to be O(1), so THRESH should be a reasonably small multiple of 1 β€” like 10 or 100. In particular it should not depend on the precision (single vs. double) or the size of the matrix. Must be at least zero. Not modified.
  • NOUNIT β€” INTEGER. the FORTRAN unit number used for printing out error messages (like, say, if a routine returns IINFO not equal to 0). Not modified.
  • A β€” COMPLEX array, dimension (LDA,max(NN)). holds the matrix whose eigenvalues are gonna be computed πŸ‘‘. On exit, A contains the last matrix actually used. Modified.
  • LDA β€” INTEGER. the leading dimension of A, H, T1 and T2. It must be at least 1, and at least max( NN ). Not modified.
  • H β€” COMPLEX array, dimension (LDA,max(NN)). the upper hessenberg matrix computed by CGEHRD πŸ¦‹. On exit, H contains the Hessenberg form of the matrix in A. Modified.
  • T1 β€” COMPLEX array, dimension (LDA,max(NN)). the Schur (=) matrix computed by CHSEQR if Z is computed. On exit, T1 contains the Schur form of the matrix in A. Modified.
  • T2 β€” COMPLEX array, dimension (LDA,max(NN)). the Schur matrix computed by CHSEQR when Z is not computed. This should be identical to T1 β€” like, that's the whole point, bestie πŸ‘€. Modified.
  • LDU β€” INTEGER. the leading dimension of U, Z, UZ and UU. Must be at least 1, and at least max( NN ). Not modified.
  • U β€” COMPLEX array, dimension (LDU,max(NN)). the unitary matrix computed by CGEHRD. Modified.
  • Z β€” COMPLEX array, dimension (LDU,max(NN)). the unitary matrix computed by CHSEQR. Modified.
  • UZ β€” COMPLEX array, dimension (LDU,max(NN)). the product of U times Z. Modified.
  • W1 β€” COMPLEX array, dimension (max(NN)). the eigenvalues of A, as computed by a full Schur decomposition H = Z T Z'. On exit, W1 contains the eigenvalues of the matrix in A. Modified.
  • W3 β€” COMPLEX array, dimension (max(NN)). the eigenvalues of A, as computed by a partial Schur decomposition (Z not computed, T only computed as much as is necessary for determining eigenvalues). On exit, W3 contains the eigenvalues of the matrix in A, possibly perturbed by CHSEIN 🫠. Modified.
  • EVECTL β€” COMPLEX array, dimension (LDU,max(NN)). the conjugate transpose of the (upper triangular) left eigenvector matrix for the matrix in T1. Modified.
  • EVECTR β€” COMPLEX array, dimension (LDU,max(NN)). the (upper triangular) right eigenvector matrix for the matrix in T1. Modified.
  • EVECTY β€” COMPLEX array, dimension (LDU,max(NN)). the conjugate transpose of the left eigenvector matrix for the matrix in H. Modified.
  • EVECTX β€” COMPLEX array, dimension (LDU,max(NN)). the right eigenvector matrix for the matrix in H. Modified.
  • UU β€” COMPLEX array, dimension (LDU,max(NN)). the deets of the unitary matrix computed by CGEHRD. Modified.
  • TAU β€” COMPLEX array, dimension (max(NN)). further deets of the unitary matrix computed by CGEHRD ✨. Modified.
  • WORK β€” COMPLEX array, dimension (NWORK). workspace, the humble king πŸ‘‘. Modified.
  • NWORK β€” INTEGER. the number of entries in WORK. Constraint: NWORK >= 4*NN(j)*NN(j) + 2.
  • RWORK β€” REAL array, dimension (max(NN)). workspace. Could be equivalenced to IWORK, but not SELECT ⚠️. Modified.
  • IWORK β€” INTEGER array, dimension (max(NN)). workspace. Modified.
  • SELECT β€” LOGICAL array, dimension (max(NN)). workspace. Could be equivalenced to IWORK, but not RWORK ⚠️. Modified.
  • RESULT β€” REAL array, dimension (16). the values computed by the fourteen tests described above. These values are currently limited to 1/ulp, specifically to avoid overflow 🌊. Modified.
  • INFO β€” INTEGER. if 0, then everything ran OK, we love a flawless run πŸ’–. Otherwise:
    • -1: NSIZES < 0
    • -2: Some NN(j) < 0
    • -3: NTYPES < 0
    • -6: THRESH < 0
    • -9: LDA < 1 or LDA < NMAX, where NMAX is max( NN(j) ).
    • -14: LDU < 1 or LDU < NMAX.
    • -26: NWORK too small.

If CLATMR, CLATMS, or CLATME returns an error code, the absolute value of it is returned.

If 1, then CHSEQR could not find all the shifts 😬.

If 2, then the EISPACK code (for small blocks) failed.

If >2, then 30*N iterations were not enough to find an eigenvalue or to decompose the problem πŸ’€.

Modified.


πŸ’« Some Local Variables and Parameters

ok so these aren't arguments but you're gonna see them floating around and I refuse to let you be confused:

  • ZERO, ONE β€” real 0 and 1. that's it. that's the tea.
  • MAXTYP β€” the number of types defined.
  • MTEST β€” the number of tests defined. care must be taken that (1) the size of RESULT, (2) the number of tests actually performed, and (3) MTEST all agree. like, they have to match, no cap 🀝.
  • NTEST β€” the number of tests performed on this matrix so far. This should be less than MTEST, and equal to it by the last test. It'll be less if any of the routines being tested indicates that it couldn't compute the matrices that would be tested.
  • NMAX β€” largest value in NN.
  • NMATS β€” the number of matrices generated so far.
  • NERRS β€” the number of tests which have exceeded THRESH so far (computed by SLAFTS).
  • COND, CONDS, IMODE β€” values to be passed to the matrix generators.
  • ANORM β€” norm of A; passed to matrix generators.
  • OVFL, UNFL β€” overflow and underflow thresholds.
  • ULP, ULPINV β€” finest relative precision and its inverse.
  • RTOVFL, RTUNFL, RTULP, RTULPI β€” square roots of the previous 4 values.

and then these four arrays decode JTYPE πŸ•΅οΈβ€β™€οΈ:

  • KTYPE(j) β€” the general type (1-10) for type [j].
  • KMODE(j) β€” the MODE value to be passed to the matrix generator for type [j].
  • KMAGN(j) β€” the order of magnitude ( O(1), O(overflow^(1/2)), O(underflow^(1/2)) )
  • KCONDS(j) β€” selects whether CONDS is to be 1 or 1/sqrt(ulp). (0 means irrelevant.)

🌈 Author

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.

Definition at line 416 of file cchkhs.f. ⭐

✨ AUTHOR ✨

Okay bestie, the Author section is giving auto-generated realness: the line literally says Generated automatically by Doxygen for LAPACK from the source code. So no mysterious author to stan here β€” Doxygen made this page for LAPACK straight from the source code, periodt. πŸ’…βœ¨


And that's a wrap, fr fr. The footer does the cute source/version/date sign-off with LAPACK Version 3.12.0 and the page path TESTING/EIG/cchkhs.f(3) β€” icon behavior only. πŸŽ€πŸ¦‹πŸ«Ά

πŸ“¦ where this page comes from