TESTING/EIG/dchkhs.f(3)

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

πŸ’– NAME

Manual name: TESTING/EIG/dchkhs.f(3) β€” yes bestie, that's the whole title vibe, and the file itself is TESTING/EIG/dchkhs.f. It lives under the Library Functions Manual. 🫢

✨ SYNOPSIS ✨

🌸 Functions/Subroutines 🌸

subroutine dchkhs (integer nsizes, integer, dimension( * ) nn, integer ntypes, logical, dimension( * ) dotype, integer, dimension( 4 ) iseed, double precision thresh, integer nounit, double precision, dimension( lda, * ) a, integer lda, double precision, dimension( lda, * ) h, double precision, dimension( lda, * ) t1, double precision, dimension( lda, * ) t2, double precision, dimension( ldu, * ) u, integer ldu, double precision, dimension( ldu, * ) z, double precision, dimension( ldu, * ) uz, double precision, dimension( * ) wr1, double precision, dimension( * ) wi1, double precision, dimension( * ) wr2, double precision, dimension( * ) wi2, double precision, dimension( * ) wr3, double precision, dimension( * ) wi3, double precision, dimension( ldu, * ) evectl, double precision, dimension( ldu, * ) evectr, double precision, dimension( ldu, * ) evecty, double precision, dimension( ldu, * ) evectx, double precision, dimension( ldu, * ) uu, double precision, dimension( * ) tau, double precision, dimension( * ) work, integer nwork, integer, dimension( * ) iwork, logical, dimension( * ) select, double precision, dimension( 16 ) result, integer info)

That subroutine is also known as DCHKHS. πŸ’…

πŸ¦‹ Function/Subroutine Documentation πŸ¦‹

subroutine dchkhs β€” the full signature, no crumbs

subroutine dchkhs (integer nsizes, integer, dimension( * ) nn, integer ntypes, logical, dimension( * ) dotype, integer, dimension( 4 ) iseed, double precision thresh, integer nounit, double precision, dimension( lda, * ) a, integer lda, double precision, dimension( lda, * ) h, double precision, dimension( lda, * ) t1, double precision, dimension( lda, * ) t2, double precision, dimension( ldu, * ) u, integer ldu, double precision, dimension( ldu, * ) z, double precision, dimension( ldu, * ) uz, double precision, dimension( * ) wr1, double precision, dimension( * ) wi1, double precision, dimension( * ) wr2, double precision, dimension( * ) wi2, double precision, dimension( * ) wr3, double precision, dimension( * ) wi3, double precision, dimension( ldu, * ) evectl, double precision, dimension( ldu, * ) evectr, double precision, dimension( ldu, * ) evecty, double precision, dimension( ldu, * ) evectx, double precision, dimension( ldu, * ) uu, double precision, dimension( * ) tau, double precision, dimension( * ) work, integer nwork, integer, dimension( * ) iwork, logical, dimension( * ) select, double precision, dimension( 16 ) result, integer info)

DCHKHS

πŸ’… Purpose

okay so DCHKHS checks the nonsymmetric eigenvalue problem routines. Periodt. It's giving full coverage, bestie:

  • DGEHRD β€” factors A as U H U', where ' means transpose, H is hessenberg, and U is an orthogonal matrix.
  • DORGHR β€” generates the orthogonal matrix U.
  • DORMHR β€” multiplies a matrix by the orthogonal matrix U.
  • DHSEQR β€” factors H as Z T Z', where Z is orthogonal and T is , and the eigenvalue vector W.
  • DTREVC β€” computes the left and right eigenvector matrices L and R for T. L is lower quasi-triangular, and R is upper quasi-triangular.
  • DHSEIN β€” computes the left and right eigenvector matrices Y and X for H, using inverse iteration.
  • DTREVC3 β€” 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 DCHKHS is called, a number of matrix () and a number of matrix 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**T | / ( |A| n ulp )
  2. | I - UU**T | / ( n ulp )
  3. | H - Z T Z**T | / ( |H| n ulp )
  4. | I - ZZ**T | / ( n ulp )
  5. | A - UZ H (UZ)**T | / ( |A| n ulp )
  6. | I - UZ (UZ)**T | / ( 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 are specified by an array NN(1:NSIZES); the value of each element NN(j) specifies one size. The are specified by a logical array DOTYPE( 1:NTYPES ); if DOTYPE(j) is .TRUE., then matrix type 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 signs. (ULP = (first number larger than 1) - 1 )
  • (5) A diagonal matrix with geometrically spaced entries 1, ..., ULP and random signs.
  • (6) A diagonal matrix with entries 1, ULP, ..., ULP and random signs.
  • (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 orthogonal and T has evenly spaced entries 1, ..., ULP with random signs on the diagonal and random O(1) entries in the upper triangle.
  • (10) A matrix of the form U' T U, where U is orthogonal and T has geometrically spaced entries 1, ..., ULP with random signs on the diagonal and random O(1) entries in the upper triangle.
  • (11) A matrix of the form U' T U, where U is orthogonal and T has entries 1, ULP,..., ULP with random signs on the diagonal and random O(1) entries in the upper triangle.
  • (12) A matrix of the form U' T U, where U is orthogonal and T has real or complex conjugate paired eigenvalues randomly chosen from ( ULP, 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 signs 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 signs 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 signs 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 real or complex conjugate paired eigenvalues randomly chosen from ( ULP, 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 (-1,1).
  • (20) Same as (19), but multiplied by SQRT( overflow threshold )
  • (21) Same as (19), but multiplied by SQRT( underflow threshold )
  • NSIZES β€” INTEGER πŸŽ€ how many matrix sizes you're throwing at this thing. If it's zero, DCHKHS does absolutely nothing (she's off the clock, respectfully πŸ’…). Must be at least zero. Not modified.
  • NN β€” INTEGER array, dimension (NSIZES) ✨ the actual sizes your matrices are gonna be. Zero values get skipped, no drama. Every value must be at least zero. Not modified.
  • NTYPES β€” INTEGER 🌸 how many elements live in DOTYPE. If it's zero, DCHKHS does nothing (again, napping 😴). Must be at least zero. Special case bestie: if it's MAXTYP+1 and NSIZES is 1, then one extra type gets defined β€” MAXTYP+1 β€” which means "just use whatever matrix is already sitting 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) πŸ‘‘ 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 (the PARAMETER MAXTYP), then types NTYPES+1 through MAXTYP just never get generated. And if NTYPES is larger than MAXTYP, then DOTYPE(MAXTYP+1) through DOTYPE(NTYPES) get straight-up ignored, sorry not sorry. Not modified.
  • ISEED β€” INTEGER array, dimension (4) 🎲 on entry, this is the seed for the random number generator. Elements should be between 0 and 4095 β€” if they're not, they get reduced mod 4096. Also ISEED(4) must be odd, that's non-negotiable. The RNG uses a linear congruential sequence limited to small integers, so it should produce machine independent random numbers (iconic, portable behaviour fr fr). The values of ISEED get changed on exit and you can pass them into the next call to DCHKHS to continue the same random sequence. Modified.
  • THRESH β€” DOUBLE PRECISION πŸ”₯ a test counts as a failure if the value computed as described above exceeds THRESH. Note that the error is scaled to be O(1), so THRESH should be a reasonably small multiple of 1 β€” like 10 or 100. Especially: it should not depend on the precision (single vs. double) or on the matrix size. Must be at least zero. Not modified.
  • NOUNIT β€” INTEGER πŸ’€ the FORTRAN unit number for printing out error messages (like, if a routine returns IINFO not equal to 0). Not modified.
  • A β€” DOUBLE PRECISION array, dimension (LDA,max(NN)) πŸ’œ holds the matrix whose eigenvalues are getting computed. On exit, A contains the last matrix actually used. Modified.
  • LDA β€” INTEGER 🌈 the leading dimension of A, H, T1 and T2. Must be at least 1 and at least max( NN ). Not modified.
  • H β€” DOUBLE PRECISION array, dimension (LDA,max(NN)) πŸ¦‹ the upper hessenberg matrix computed by DGEHRD. On exit, H contains the Hessenberg form of the matrix in A. Modified.
  • T1 β€” DOUBLE PRECISION array, dimension (LDA,max(NN)) ⭐ the Schur (=) matrix computed by DHSEQR if Z is computed. On exit, T1 contains the Schur form of the matrix in A. Modified.
  • T2 β€” DOUBLE PRECISION array, dimension (LDA,max(NN)) 🧚 the Schur matrix computed by DHSEQR when Z is not computed. This one 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 β€” DOUBLE PRECISION array, dimension (LDU,max(NN)) πŸ’– the orthogonal matrix computed by DGEHRD. Modified.
  • Z β€” DOUBLE PRECISION array, dimension (LDU,max(NN)) ✨ the orthogonal matrix computed by DHSEQR. Modified.
  • UZ β€” DOUBLE PRECISION array, dimension (LDU,max(NN)) πŸŽ€ the product of U times Z. Modified.
  • WR1 β€” DOUBLE PRECISION array, dimension (max(NN))
  • WI1 β€” DOUBLE PRECISION array, dimension (max(NN)) πŸ‘‘ the real and imaginary parts of the eigenvalues of A, as computed when Z is computed. On exit, WR1 + WI1*i are the eigenvalues of the matrix in A. Modified.
  • WR2 β€” DOUBLE PRECISION array, dimension (max(NN))
  • WI2 β€” DOUBLE PRECISION array, dimension (max(NN)) 🌸 the real and imaginary parts of the eigenvalues of A, as computed when T is computed but Z is not. On exit, WR2 + WI2*i are the eigenvalues of the matrix in A. Modified.
  • WR3 β€” DOUBLE PRECISION array, dimension (max(NN))
  • WI3 β€” DOUBLE PRECISION array, dimension (max(NN)) πŸ’€ same vibe as WR1, WI1 β€” these also hold the eigenvalues of A, but the ones computed when DHSEQR only computes the eigenvalues. Meaning: no Schur vectors, and no more of the Schur form than is strictly necessary for getting those eigenvalues. Efficient queen. Modified.
  • EVECTL β€” DOUBLE PRECISION array, dimension (LDU,max(NN)) πŸ¦‹ the (upper triangular) left eigenvector matrix for the matrix in T1. For complex conjugate pairs, the real part goes in one row and the imaginary part in the next. Modified.
  • EVEZTR β€” DOUBLE PRECISION array, dimension (LDU,max(NN)) 🫢 the (upper triangular) right eigenvector matrix for the matrix in T1. For complex conjugate pairs, the real part goes in one column and the imaginary part in the next. Modified.
  • EVECTY β€” DOUBLE PRECISION array, dimension (LDU,max(NN)) πŸ’… the left eigenvector matrix for the matrix in H. For complex conjugate pairs, the real part goes in one row and the imaginary part in the next. Modified.
  • EVECTX β€” DOUBLE PRECISION array, dimension (LDU,max(NN)) 🌈 the right eigenvector matrix for the matrix in H. For complex conjugate pairs, the real part goes in one column and the imaginary part in the next. Modified.
  • UU β€” DOUBLE PRECISION array, dimension (LDU,max(NN)) ⭐ details of the orthogonal matrix computed by DGEHRD. Modified.
  • TAU β€” DOUBLE PRECISION array, dimension(max(NN)) 🧚 further details of the orthogonal matrix computed by DGEHRD. Modified.
  • WORK β€” DOUBLE PRECISION array, dimension (NWORK) πŸ”§ workspace. Modified.
  • NWORK β€” INTEGER πŸ“ the number of entries in WORK. NWORK >= 4*NN(j)*NN(j) + 2.
  • IWORK β€” INTEGER array, dimension (max(NN)) πŸ’œ workspace. Modified.
  • SELECT β€” LOGICAL array, dimension (max(NN)) πŸŽ€ workspace. Modified.
  • RESULT β€” DOUBLE PRECISION array, dimension (16) πŸ‘‘ the values computed by the fourteen tests described above. The values are currently limited to 1/ulp to avoid overflow. Modified.
  • INFO β€” INTEGER 🌸 if 0, then everything ran OK. 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.
    • -28: NWORK too small.
    • If DLATMR, SLATMS, or SLATME returns an error code, the absolute value of it is returned.
    • If 1, then DHSEQR 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 🧚

  • ZERO, ONE β€” real 0 and 1. the basics, we love her πŸ’…
  • 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 could not 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 DLAFTS).
  • COND, CONDS, IMODE β€” values to be passed to the matrix generators.
  • ANORM β€” norm of A; passed to the matrix generators.
  • OVFL, UNFL β€” overflow and underflow thresholds.
  • ULP, ULPINV β€” the finest relative precision and its inverse.
  • RTOVFL, RTUNFL, RTULP, RTULPI β€” the square roots of the previous 4 values πŸ’« (yes, all four, and yes, they're each other's glow-ups)

So the next bit is that there are these four arrays and their whole job is decoding JTYPE, bestie. Here's the tea β˜•:

  • KTYPE(j) β€” the general type (that's 1-10, so ten whole vibes) for type .
  • KMODE(j) β€” the MODE value you pass to the matrix generator for type . It decides how the matrix gets built, no cap.
  • KMAGN(j) β€” the order of magnitude, and it's giving three options: O(1), O(overflow^(1/2) ), or O(underflow^(1/2) ). So basically tiny, normal, or absolutely feral 🀯
  • KCONDS(j) β€” picks whether CONDS is 1 or 1/sqrt(ulp). And (0 means irrelevant.) β€” like when it just doesn't matter, iconic of it honestly πŸ’…

πŸŽ€ Author

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.

These are the institutions behind it β€” four of them, collab of the century fr fr 🫢

Definition at line 417 of file dchkhs.f. β€” so if you're scrolling, that's exactly where this whole routine starts. Bookmark it, iykyk πŸ”–

πŸ‘‘ Author

Generated automatically by Doxygen for LAPACK from the source code.

Yeah so nobody hand-wrote this one β€” Doxygen just did its little autopilot thing and spat it out from the LAPACK source. Machine-generated but still kinda slay βœ¨πŸ€–


And that's a wrap on TESTING/EIG/dchkhs.f(3)! 🌸 This whole page is LAPACK, Version 3.12.0 β€” go forth and validate those Hessenberg matrices, bestie, you're gonna eat πŸ’…πŸ”₯πŸ’–

πŸ“¦ where this page comes from