TESTING/EIG/dchkhs.f(3)
π 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β factorsAasU H U', where'means transpose,His hessenberg, andUis an orthogonal matrix.DORGHRβ generates the orthogonal matrixU.DORMHRβ multiplies a matrix by the orthogonal matrixU.DHSEQRβ factorsHasZ T Z', whereZis orthogonal andTis , and the eigenvalue vectorW.DTREVCβ computes the left and right eigenvector matricesLandRforT.Lis lower quasi-triangular, andRis upper quasi-triangular.DHSEINβ computes the left and right eigenvector matricesYandXforH, using inverse iteration.DTREVC3β computes left and right eigenvector matrices from a Schur matrixTand backtransforms them withZto eigenvector matricesLandRforA.LandRare 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:
| A - U H U**T | / ( |A| n ulp )| I - UU**T | / ( n ulp )| H - Z T Z**T | / ( |H| n ulp )| I - ZZ**T | / ( n ulp )| A - UZ H (UZ)**T | / ( |A| n ulp )| I - UZ (UZ)**T | / ( n ulp )| T(Z computed) - T(Z not computed) | / ( |T| ulp )| W(Z computed) - W(Z not computed) | / ( |W| ulp )| TR - RW | / ( |T| |R| ulp )| L**H T - W**H L | / ( |T| |L| ulp )| HX - XW | / ( |H| |X| ulp )| Y**H H - W**H Y | / ( |H| |Y| ulp )| AX - XW | / ( |A| |X| ulp )| Y**H A - W**H Y | / ( |A| |Y| ulp )| AR - RW | / ( |A| |R| ulp )| 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, ..., ULPand random signs.(ULP = (first number larger than 1) - 1 ) - (5) A diagonal matrix with geometrically spaced entries
1, ..., ULPand random signs. - (6) A diagonal matrix with entries
1, ULP, ..., ULPand 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, whereUis orthogonal andThas evenly spaced entries1, ..., ULPwith random signs on the diagonal and randomO(1)entries in the upper triangle. - (10) A matrix of the form
U' T U, whereUis orthogonal andThas geometrically spaced entries1, ..., ULPwith random signs on the diagonal and randomO(1)entries in the upper triangle. - (11) A matrix of the form
U' T U, whereUis orthogonal andThas entries1, ULP,..., ULPwith random signs on the diagonal and randomO(1)entries in the upper triangle. - (12) A matrix of the form
U' T U, whereUis orthogonal andThas real or complex conjugate paired eigenvalues randomly chosen from( ULP, 1 )and randomO(1)entries in the upper triangle. - (13) A matrix of the form
X' T X, whereXhas conditionSQRT( ULP )andThas evenly spaced entries1, ..., ULPwith random signs on the diagonal and randomO(1)entries in the upper triangle. - (14) A matrix of the form
X' T X, whereXhas conditionSQRT( ULP )andThas geometrically spaced entries1, ..., ULPwith random signs on the diagonal and randomO(1)entries in the upper triangle. - (15) A matrix of the form
X' T X, whereXhas conditionSQRT( ULP )andThas entries1, ULP,..., ULPwith random signs on the diagonal and randomO(1)entries in the upper triangle. - (16) A matrix of the form
X' T X, whereXhas conditionSQRT( ULP )andThas real or complex conjugate paired eigenvalues randomly chosen from( ULP, 1 )and randomO(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,DCHKHSdoes 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 inDOTYPE. If it's zero,DCHKHSdoes nothing (again, napping π΄). Must be at least zero. Special case bestie: if it'sMAXTYP+1andNSIZESis 1, then one extra type gets defined βMAXTYP+1β which means "just use whatever matrix is already sitting inA." That's only useful whenDOTYPE(1:MAXTYP)is.FALSE.andDOTYPE(MAXTYP+1)is.TRUE.. Not modified.DOTYPEβ LOGICAL array, dimension (NTYPES) π ifDOTYPE(j)is.TRUE., then for every size inNNa matrix of that size and of typejgets generated. IfNTYPESis smaller than the max number of types defined (thePARAMETER MAXTYP), then typesNTYPES+1throughMAXTYPjust never get generated. And ifNTYPESis larger thanMAXTYP, thenDOTYPE(MAXTYP+1)throughDOTYPE(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 reducedmod 4096. AlsoISEED(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 ofISEEDget changed on exit and you can pass them into the next call toDCHKHSto continue the same random sequence. Modified.THRESHβ DOUBLE PRECISION π₯ a test counts as a failure if the value computed as described above exceedsTHRESH. Note that the error is scaled to beO(1), soTHRESHshould 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 returnsIINFOnot equal to 0). Not modified.Aβ DOUBLE PRECISION array, dimension (LDA,max(NN)) π holds the matrix whose eigenvalues are getting computed. On exit,Acontains the last matrix actually used. Modified.LDAβ INTEGER π the leading dimension ofA,H,T1andT2. Must be at least 1 and at leastmax( NN ). Not modified.Hβ DOUBLE PRECISION array, dimension (LDA,max(NN)) π¦ the upper hessenberg matrix computed byDGEHRD. On exit,Hcontains the Hessenberg form of the matrix inA. Modified.T1β DOUBLE PRECISION array, dimension (LDA,max(NN)) β the Schur (=) matrix computed byDHSEQRifZis computed. On exit,T1contains the Schur form of the matrix inA. Modified.T2β DOUBLE PRECISION array, dimension (LDA,max(NN)) π§ the Schur matrix computed byDHSEQRwhenZis not computed. This one should be identical toT1β like, that's the whole point, bestie. Modified.LDUβ INTEGER π the leading dimension ofU,Z,UZandUU. Must be at least 1 and at leastmax( NN ). Not modified.Uβ DOUBLE PRECISION array, dimension (LDU,max(NN)) π the orthogonal matrix computed byDGEHRD. Modified.Zβ DOUBLE PRECISION array, dimension (LDU,max(NN)) β¨ the orthogonal matrix computed byDHSEQR. Modified.UZβ DOUBLE PRECISION array, dimension (LDU,max(NN)) π the product ofUtimesZ. Modified.WR1β DOUBLE PRECISION array, dimension (max(NN))WI1β DOUBLE PRECISION array, dimension (max(NN)) π the real and imaginary parts of the eigenvalues ofA, as computed whenZis computed. On exit,WR1 + WI1*iare the eigenvalues of the matrix inA. Modified.WR2β DOUBLE PRECISION array, dimension (max(NN))WI2β DOUBLE PRECISION array, dimension (max(NN)) πΈ the real and imaginary parts of the eigenvalues ofA, as computed whenTis computed butZis not. On exit,WR2 + WI2*iare the eigenvalues of the matrix inA. Modified.WR3β DOUBLE PRECISION array, dimension (max(NN))WI3β DOUBLE PRECISION array, dimension (max(NN)) π same vibe asWR1,WI1β these also hold the eigenvalues ofA, but the ones computed whenDHSEQRonly 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 inT1. 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 inT1. 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 inH. 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 inH. 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 byDGEHRD. Modified.TAUβ DOUBLE PRECISION array, dimension(max(NN)) π§ further details of the orthogonal matrix computed byDGEHRD. Modified.WORKβ DOUBLE PRECISION array, dimension (NWORK) π§ workspace. Modified.NWORKβ INTEGER π the number of entries inWORK.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 to1/ulpto avoid overflow. Modified.INFOβ INTEGER πΈ if0, then everything ran OK. Otherwise:-1:NSIZES < 0-2: SomeNN(j) < 0-3:NTYPES < 0-6:THRESH < 0-9:LDA < 1orLDA < NMAX, whereNMAXismax( NN(j) ).-14:LDU < 1orLDU < NMAX.-28:NWORKtoo small.- If
DLATMR,SLATMS, orSLATMEreturns an error code, the absolute value of it is returned. - If
1, thenDHSEQRcould not find all the shifts. - If
2, then the EISPACK code (for small blocks) failed. - If
>2, then30*Niterations were not enough to find an eigenvalue or to decompose the problem.
Modified.
π§ Some Local Variables and Parameters π§
ZERO,ONEβ real0and1. 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 ofRESULT, (2) the number of tests actually performed, and (3)MTESTall agree. Like, they have to match, no cap.NTESTβ the number of tests performed on this matrix so far. This should be less thanMTEST, 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 inNN.NMATSβ the number of matrices generated so far.NERRSβ the number of tests which have exceededTHRESHso far (computed byDLAFTS).COND,CONDS,IMODEβ values to be passed to the matrix generators.ANORMβ norm ofA; 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's1-10, so ten whole vibes) for type .KMODE(j)β theMODEvalue 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) ), orO(underflow^(1/2) ). So basically tiny, normal, or absolutely feral π€―KCONDS(j)β picks whetherCONDSis1or1/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
- arch rolling: lapack-doc 3.12.1-2 Β· custom
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms