TESTING/EIG/schkhs.f(3)
πΈ TESTING/EIG/schkhs.f β Library Functions Manual π
ok so bestie, welcome to TESTING/EIG/schkhs.f(3). this is a test-driver page, it's a whole vibe, and we're gonna get through it together. grab a snack π
β¨ NAME β¨
TESTING/EIG/schkhs.f β literally the file. that's the name. iconic of it.
π SYNOPSIS π
Functions/Subroutines
subroutine schkhsβ(nsizes, nn, ntypes, dotype, iseed, thresh, nounit, a, lda, h, t1, t2, u, ldu, z, uz, wr1, wi1, wr2, wi2, wr3, wi3, evectl, evectr, evecty, evectx, uu, tau, work, nwork, iwork, select, result, info)β this isSCHKHS. yes that's its whole government name. π
π¦ Function/Subroutine Documentation π¦
subroutine schkhs
here's the full signature, character for character, no games:
subroutine schkhs (integer nsizes, integer, dimension( * ) nn, integer
ntypes, logical, dimension( * ) dotype, integer, dimension( 4 ) iseed,
real thresh, integer nounit, real, dimension( lda, * ) a, integer lda,
real, dimension( lda, * ) h, real, dimension( lda, * ) t1, real,
dimension( lda, * ) t2, real, dimension( ldu, * ) u, integer ldu, real,
dimension( ldu, * ) z, real, dimension( ldu, * ) uz, real, dimension( *
) wr1, real, dimension( * ) wi1, real, dimension( * ) wr2, real,
dimension( * ) wi2, real, dimension( * ) wr3, real, dimension( * ) wi3,
real, dimension( ldu, * ) evectl, real, dimension( ldu, * ) evectr,
real, dimension( ldu, * ) evecty, real, dimension( ldu, * ) evectx,
real, dimension( ldu, * ) uu, real, dimension( * ) tau, real, dimension(
* ) work, integer nwork, integer, dimension( * ) iwork, logical,
dimension( * ) select, real, dimension( 16 ) result, integer info)
yep. SCHKHS. that's the one. π«Ά
π Purpose π
so what does it do? SCHKHS checks the nonsymmetric eigenvalue problem routines. it's the vibe check for the whole friend group, fr fr:
SGEHRDfactorsAasU H U', where'means transpose,His hessenberg, andUis an orthogonal matrix. β¨SORGHRgenerates the orthogonal matrixU. πSORMHRmultiplies a matrix by the orthogonal matrixU. πΈSHSEQRfactorsHasZ T Z', whereZis orthogonal andTis , and the eigenvalue vectorW. πSTREVCcomputes the left and right eigenvector matricesLandRforT. π¦SHSEINcomputes the left and right eigenvector matricesYandXforH, using inverse iteration. π₯STREVC3computes left and right eigenvector matrices from a Schur matrixTand backtransforms them withZto eigenvector matricesLandRforA.LandRare GE matrices. π
when SCHKHS 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:
ok bestie this is the main event. sixteen whole tests. sixteen. and every single one of them is a bop. π
| 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, ..., 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, whereUis orthogonal andThas evenly spaced entries 1, ..., ULP with 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 entries 1, ..., ULP with 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 entries 1, ULP,..., ULP with 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 entries 1, ..., ULP with 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 entries 1, ..., ULP with 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 entries 1, ULP,..., ULP with 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 )
and that's where we're leaving it for now bestie β more of this page is coming, so don't go anywhere π β¨
NSIZES(INTEGER) β how many matrix sizes you're throwing at this thing. If it's zero,SCHKHSliterally does nothing (girl is on break π). Must be at least zero. Not modified.NN(INTEGER array, dimension(NSIZES)) β the array holding the sizes to be used for the matrices. Zero values get skipped, no drama. All values must be at least zero. Not modified.NTYPES(INTEGER) β the number of elements inDOTYPE. If it's zero,SCHKHSdoes nothing. Must be at least zero. And here's the spicy bit: if it equalsMAXTYP+1andNSIZESis 1, then an extra type,MAXTYP+1, gets defined β that one means "just use whatever matrix is already sitting inA." It'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 (PARAMETER MAXTYP), then typesNTYPES+1throughMAXTYParen't generated at all. IfNTYPESis bigger thanMAXTYP, thenDOTYPE(MAXTYP+1)throughDOTYPE(NTYPES)just get ignored, they're not the main character. Not modified.ISEED(INTEGER array, dimension(4)) β on entry this is the seed for the random number generator, aka the vibe source β¨. The array elements should be between 0 and 4095; if they're not, they get reduced mod 4096. AlsoISEED(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 β cute and portable. The values ofISEEDget changed on exit, and you can pass them into the next call toSCHKHSto keep the same random number sequence going. Modified.THRESH(REAL) β a test will count as β£ if the β£, computed as described above, exceedsTHRESH. Note that the error is scaled to beO(1), soTHRESHshould be a reasonably small multiple of 1 β like, say, 10 or 100. Especially 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 if a routine returnsIINFOnot equal to 0). Not modified.A(REAL array, dimension(LDA,max(NN))) β holds the matrix whose eigenvalues are to be 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(REAL array, dimension(LDA,max(NN))) β the upper hessenberg matrix computed bySGEHRD. On exit,Hcontains the Hessenberg form of the matrix inA. Modified.T1(REAL array, dimension(LDA,max(NN))) β the Schur (=) matrix computed bySHSEQRifZis computed. On exit,T1contains the Schur form of the matrix inA. Modified.T2(REAL array, dimension(LDA,max(NN))) β the Schur matrix computed bySHSEQRwhenZis not computed. This should be identical toT1β that's literally the point, bestie, it's a whole consistency check. Modified.LDU(INTEGER) β the leading dimension ofU,Z,UZandUU. Must be at least 1 and at leastmax( NN ). Not modified.U(REAL array, dimension(LDU,max(NN))) β the orthogonal matrix computed bySGEHRD. Modified.Z(REAL array, dimension(LDU,max(NN))) β the orthogonal matrix computed bySHSEQR. Modified.UZ(REAL array, dimension(LDU,max(NN))) β the product ofUtimesZ. Modified.WR1,WI1(REAL arrays, 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,WI2(REAL arrays, 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,WI3(REAL arrays, dimension(max(NN))) β likeWR1,WI1, these hold the eigenvalues ofA, but the ones computed whenSHSEQRonly computes the eigenvalues β meaning no Schur vectors, and no more of the Schur form than is strictly necessary for computing the eigenvalues. Minimalist queen π. Modified.EVECTL(REAL array, dimension(LDU,max(NN))) β the (upper triangular) left eigenvector matrix for the matrix inT1. For complex conjugate pairs, the real part is stored in one row and the imaginary part in the next. Modified.EVECTR(REAL array, dimension(LDU,max(NN))) β the (upper triangular) right eigenvector matrix for the matrix inT1. For complex conjugate pairs, the real part is stored in one column and the imaginary part in the next. Modified.EVECTY(REAL 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(REAL 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(REAL array, dimension(LDU,max(NN))) β details of the orthogonal matrix computed bySGEHRD. Modified.TAU(REAL array, dimension(max(NN))) β further details of the orthogonal matrix computed bySGEHRD. Modified.WORK(REAL array, dimension(NWORK)) β workspace, bestie. Modified.NWORK(INTEGER) β the number of entries inWORK. Must satisfyNWORK >= 4*NN(j)*NN(j) + 2.IWORK(INTEGER array, dimension(max(NN))) β workspace. Modified.SELECT(LOGICAL array, dimension(max(NN))) β workspace. Modified.RESULT(REAL array, dimension(16)) β the values computed by the fourteen tests described above. The values are currently limited to1/ulp, to avoid overflow. Modified.INFO(INTEGER) β if0, then everything ran OK, slay π. 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
SLATMR,SLATMS, orSLATMEreturns an error code, the absolute value of it is returned. - If
1, thenSHSEQRcould 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
ok so these aren't arguments, they're the internal supporting cast β and yes, they matter:
ZERO,ONEβ real0and1. iconic, no notes.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, genuinely, keep these in sync fr fr.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 will be less if any of the routines being tested indicates that it could not compute the matrices that would be tested.NMAXβ the largest value inNN.NMATSβ the number of matrices generated so far.NERRSβ the number of tests which have exceededTHRESHso far (computed bySLAFTS).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β finest relative precision and its inverse.RTOVFL,RTUNFL,RTULP,RTULPIβ square roots of the previous 4 values.
The following four arrays decode JTYPE:
KTYPE(j)β the general type (1-10) for type .KMODE(j)β theMODEvalue that gets handed off to the matrix generator for this type π«Ά like, that's its whole job, it's giving "middle management but make it math" πKMAGN(j)β the order of magnitude, no cap. Your options areO(1),O(overflow^(1/2) ), orO(underflow^(1/2) )β pick your fighter bestie, one of these three πKCONDS(j)β this one picks whetherCONDSends up being1or1/sqrt(ulp). Oh and a0here means irrelevant, so like, it literally doesn't matter, don't worry about it π
π Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Fr fr, that's a whole squad of institutions carrying this file on their backs π
Definition at line 416 of file schkhs.f.
πΈ Author
Generated automatically by Doxygen for LAPACK from the source code. Yes bestie, a robot wrote the docs, and honestly? It ate. π€β¨
And that's the whole page, you made it to the end, I'm so proud of you π This iconic little artifact is LAPACK Version 3.12.0, page TESTING/EIG/schkhs.f(3) β go forth and test your Hessenberg matrices, mwah ππ¦
π¦ 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