SCHKGG(3)
π
schkgg.f(3) β Library Functions Manual π
okay so bestie, buckle in, because this is the manual page for schkgg.f(3) out of the Library Functions Manual, and it is a lot π The header line up top literally reads /home/abui...IG/schkgg.f(3) (truncated path, we love a mysterious queen π), and the real address of this file is:
/home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/TESTING/EIG/schkgg.f
It's giving "LAPACK test driver energy" and honestly? Iconic. Let's go π
πΈ NAME πΈ
/home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/TESTING/EIG/schkgg.f
(that's the whole NAME section, she's minimal, she's confident, periodt β¨)
β¨ SYNOPSIS β¨
π Functions/Subroutines π
subroutine SCHKGG (nsizes, nn, ntypes, dotype, iseed, thresh, tstdif, thrshn, nounit, a, lda, b, h, t, s1, s2, p1, p2, u, ldu, v, q, z, alphr1, alphi1, beta1, alphr3, alphi3, beta3, evectl, evectr, work, lwork, llwork, result, info)β SCHKGG
Same call, but with the original line breaks, because the wrapping is part of the vibe:
subroutine SCHKGG (nsizes, nn, ntypes, dotype, iseed, thresh, tstdif,
thrshn, nounit, a, lda, b, h, t, s1, s2, p1, p2, u, ldu, v, q, z,
alphr1, alphi1, beta1, alphr3, alphi3, beta3, evectl, evectr, work,
lwork, llwork, result, info)
SCHKGG
π¦ FUNCTION/SUBROUTINE DOCUMENTATION π¦
π subroutine SCHKGG (...)
Full signature, exactly as written, no edits, no notes (I would never):
subroutine SCHKGG (integer nsizes, integer, dimension( * ) nn, integer
ntypes, logical, dimension( * ) dotype, integer, dimension( 4 ) iseed,
real thresh, logical tstdif, real thrshn, integer nounit, real,
dimension( lda, * ) a, integer lda, real, dimension( lda, * ) b, real,
dimension( lda, * ) h, real, dimension( lda, * ) t, real, dimension(
lda, * ) s1, real, dimension( lda, * ) s2, real, dimension( lda, * ) p1,
real, dimension( lda, * ) p2, real, dimension( ldu, * ) u, integer ldu,
real, dimension( ldu, * ) v, real, dimension( ldu, * ) q, real,
dimension( ldu, * ) z, real, dimension( * ) alphr1, real, dimension( * )
alphi1, real, dimension( * ) beta1, real, dimension( * ) alphr3, real,
dimension( * ) alphi3, real, dimension( * ) beta3, real, dimension( ldu,
* ) evectl, real, dimension( ldu, * ) evectr, real, dimension( * ) work,
integer lwork, logical, dimension( * ) llwork, real, dimension( 15 )
result, integer info)
SCHKGG
π Purpose π
okay so what does she actually DO? SCHKGG checks the nonsymmetric generalized eigenvalue problem routines. That's the whole assignment, and she ate π
So here's the tea, routine by routine:
SGGHRDfactorsAandBasU H V<sup>T</sup> andU T V<sup>T</sup>, where <sup>T</sup> means transpose,His hessenberg,Tis triangular andUandVare orthogonal.SHGEQZfactorsHandTasQ S Z<sup>T</sup> andQ P Z<sup>T</sup>, wherePis upper triangular,Sis in generalized Schur form (block upper triangular, with 1x1 and 2x2 blocks on the diagonal, the 2x2 blocks corresponding to complex conjugate pairs of generalized eigenvalues), andQandZare orthogonal. She also computes the generalized eigenvalues(alpha(1),beta(1)),...,(alpha(n),beta(n)), wherealpha(j)=S(j,j)andbeta(j)=P(j,j)β thus,w(j) = alpha(j)/beta(j)is a root of the generalized eigenvalue problem
det( A - w(j) B ) = 0
and m(j) = beta(j)/alpha(j) is a root of the essentially equivalent problem
det( m(j) A - B ) = 0
STGEVCcomputes the matrixLof left eigenvectors and the matrixRof right eigenvectors for the matrix pair( S, P ). In the description below,landrare left and right eigenvectors corresponding to the generalized eigenvalues(alpha,beta).
π«Ά Test Matrices β the setup π«Ά
When SCHKGG 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, 15 tests will be performed. The first twelve should be small β O(1). They will be compared with the threshold THRESH:
T
(1) | A - U H V | / ( |A| n ulp )
T
(2) | B - U T V | / ( |B| n ulp )
T
(3) | I - UU | / ( n ulp )
T
(4) | I - VV | / ( n ulp )
T
(5) | H - Q S Z | / ( |H| n ulp )
T
(6) | T - Q P Z | / ( |T| n ulp )
T
(7) | I - QQ | / ( n ulp )
T
(8) | I - ZZ | / ( n ulp )
(9) max over all left eigenvalue/-vector pairs (beta/alpha,l) of
| l**H * (beta S - alpha P) | / ( ulp max( |beta S|, |alpha P| ) )
(10) max over all left eigenvalue/-vector pairs (beta/alpha,l') of
T
| l'**H * (beta H - alpha T) | / ( ulp max( |beta H|, |alpha T| ) )
where the eigenvectors l' are the result of passing Q to
STGEVC and back transforming (HOWMNY='B').
(11) max over all right eigenvalue/-vector pairs (beta/alpha,r) of
| (beta S - alpha T) r | / ( ulp max( |beta S|, |alpha T| ) )
(12) max over all right eigenvalue/-vector pairs (beta/alpha,r') of
| (beta H - alpha T) r' | / ( ulp max( |beta H|, |alpha T| ) )
where the eigenvectors r' are the result of passing Z to
STGEVC and back transforming (HOWMNY='B').
The last three test ratios will usually be small, but there is no mathematical requirement that they be so π They are therefore compared with THRESH only if TSTDIF is .TRUE. β read that twice, bestie, it's a whole conditional:
(13) | S(Q,Z computed) - S(Q,Z not computed) | / ( |S| ulp )
(14) | P(Q,Z computed) - P(Q,Z not computed) | / ( |P| ulp )
(15) max( |alpha(Q,Z computed) - alpha(Q,Z not computed)|/|S| ,
|beta(Q,Z computed) - beta(Q,Z not computed)|/|P| ) / ulp
In addition, the normalization of L and R are checked, and compared with the threshold THRSHN π
β Test Matrices β
The sizes of the test matrices 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) ( 0, 0 ) (a pair of zero matrices)
(2) ( I, 0 ) (an identity and a zero matrix)
(3) ( 0, I ) (an identity and a zero matrix)
(4) ( I, I ) (a pair of identity matrices)
t t
(5) ( J , J ) (a pair of transposed Jordan blocks)
t ( I 0 )
(6) ( X, Y ) where X = ( J 0 ) and Y = ( t )
( 0 I ) ( 0 J )
and I is a k x k identity and J a (k+1)x(k+1)
Jordan block; k=(N-1)/2
(7) ( D, I ) where D is diag( 0, 1,..., N-1 ) (a diagonal
matrix with those diagonal entries.)
(8) ( I, D )
(9) ( big*D, small*I ) where big is near overflow and small=1/big
(10) ( small*D, big*I )
(11) ( big*I, small*D )
(12) ( small*I, big*D )
(13) ( big*D, big*I )
(14) ( small*D, small*I )
(15) ( D1, D2 ) where D1 is diag( 0, 0, 1, ..., N-3, 0 ) and
D2 is diag( 0, N-3, N-4,..., 1, 0, 0 )
t t
(16) U ( J , J ) V where U and V are random orthogonal matrices.
(17) U ( T1, T2 ) V where T1 and T2 are upper triangular matrices
with random O(1) entries above the diagonal
and diagonal entries diag(T1) =
( 0, 0, 1, ..., N-3, 0 ) and diag(T2) =
( 0, N-3, N-4,..., 1, 0, 0 )
(18) U ( T1, T2 ) V diag(T1) = ( 0, 0, 1, 1, s, ..., s, 0 )
diag(T2) = ( 0, 1, 0, 1,..., 1, 0 )
s = machine precision.
(19) U ( T1, T2 ) V diag(T1)=( 0,0,1,1, 1-d, ..., 1-(N-5)*d=s, 0 )
diag(T2) = ( 0, 1, 0, 1, ..., 1, 0 )
N-5
(20) U ( T1, T2 ) V diag(T1)=( 0, 0, 1, 1, a, ..., a =s, 0 )
diag(T2) = ( 0, 1, 0, 1, ..., 1, 0, 0 )
(21) U ( T1, T2 ) V diag(T1)=( 0, 0, 1, r1, r2, ..., r(N-4), 0 )
diag(T2) = ( 0, 1, 0, 1, ..., 1, 0, 0 )
where r1,..., r(N-4) are random.
(22) U ( big*T1, small*T2 ) V diag(T1) = ( 0, 0, 1, ..., N-3, 0 )
diag(T2) = ( 0, 1, ..., 1, 0, 0 )
(23) U ( small*T1, big*T2 ) V diag(T1) = ( 0, 0, 1, ..., N-3, 0 )
diag(T2) = ( 0, 1, ..., 1, 0, 0 )
(24) U ( small*T1, small*T2 ) V diag(T1) = ( 0, 0, 1, ..., N-3, 0 )
diag(T2) = ( 0, 1, ..., 1, 0, 0 )
(25) U ( big*T1, big*T2 ) V diag(T1) = ( 0, 0, 1, ..., N-3, 0 )
diag(T2) = ( 0, 1, ..., 1, 0, 0 )
(26) U ( T1, T2 ) V where T1 and T2 are random upper-triangular
matrices.
likeβ¦ 26 whole matrix types, she said "I have range" and honestly, she does β¨
π Parameters π
πΈ NSIZES πΈ
NSIZES is INTEGER. It's the number of sizes of matrices to use. If it is zero, SCHKGG does nothing π΄ It must be at least zero.
πΈ NN πΈ
NN is INTEGER array, dimension (NSIZES). An array containing the sizes to be used for the matrices. Zero values will be skipped. The values must be at least zero.
πΈ NTYPES πΈ
NTYPES is INTEGER. It's the number of elements in DOTYPE. If it is zero, SCHKGG does nothing π΄ It must be at least zero. If it is MAXTYP+1 and NSIZES is 1, then an additional type, MAXTYP+1 is defined, which is to use whatever matrix is in A. This is only useful if DOTYPE(1:MAXTYP) is .FALSE. and DOTYPE(MAXTYP+1) is .TRUE. π
πΈ DOTYPE πΈ
β¦and that's literally where this part of the page cuts off, bestie π«Ά DOTYPE's description continues in what comes next β don't go anywhere π
DOTYPEβLOGICALarray, dimension(NTYPES). IfDOTYPE(j)is.TRUE., then for each size inNNa matrix of that size and of typejgets generated. IfNTYPESis smaller than the maximum number of types defined (PARAMETER MAXTYP), then typesNTYPES+1throughMAXTYPwon't be generated. And ifNTYPESis larger thanMAXTYP, thenDOTYPE(MAXTYP+1)throughDOTYPE(NTYPES)just get ignored. Slay, but only up toMAXTYP. β¨ISEEDβINTEGERarray, dimension(4). On entry,ISEEDspecifies the seed of the random number generator. The array elements should be between0and4095β if they're not, they get reduced mod4096. AlsoISEED(4)must be odd (that's not optional bestie, it's a rule π ). The random number generator uses a linear congruential sequence limited to small integers, so it should produce machine independent random numbers. The values ofISEEDare changed on exit, and can be used in the next call toSCHKGGto continue the same random number sequence. Bringing the vibe back for round two πTHRESHβREAL. A test will count as a fail if the thing, computed as described above, exceedsTHRESH. Note that the error is scaled to beO(1), soTHRESHshould be a reasonably small multiple of1, e.g.10or100. In particular, it should not depend on the precision (single vs. double) or the size of the matrix. It must be at least zero.TSTDIFβLOGICAL. Specifies whether test ratios13-15will be computed and compared withTHRESH.= .FALSE.: Only test ratios1-12will be computed and tested. Ratios13-15will be set to zero.= .TRUE.: All the test ratios1-15will be computed and tested.
THRSHNβREAL. Threshold for reporting eigenvector normalization error. If the normalization of any eigenvector differs from1by more thanTHRSHN*ulp, then a special error message will be printed. (This is handled separately from the other tests, since only a compiler or programming error should cause an error message β at least ifTHRSHNis at least5--10.) Translation: if this fires, something is deeply cursed πNOUNITβINTEGER. TheFORTRANunit number for printing out error messages (e.g., if a routine returnsIINFOnot equal to0.)AβREALarray, dimension(LDA, max(NN)). Used to hold the originalAmatrix. Used as input only ifNTYPES=MAXTYP+1,DOTYPE(1:MAXTYP)=.FALSE., andDOTYPE(MAXTYP+1)=.TRUE.LDAβINTEGER. The leading dimension ofA,B,H,T,S1,P1,S2, andP2. It must be at least1and at leastmax( NN ).BβREALarray, dimension(LDA, max(NN)). Used to hold the originalBmatrix. Used as input only ifNTYPES=MAXTYP+1,DOTYPE(1:MAXTYP)=.FALSE., andDOTYPE(MAXTYP+1)=.TRUE.HβREALarray, dimension(LDA, max(NN)). The upper Hessenberg matrix computed fromAbySGGHRD.TβREALarray, dimension(LDA, max(NN)). The upper triangular matrix computed fromBbySGGHRD.S1βREALarray, dimension(LDA, max(NN)). The Schur (block upper triangular) matrix computed fromHbySHGEQZwhenQandZare also computed.S2βREALarray, dimension(LDA, max(NN)). The Schur (block upper triangular) matrix computed fromHbySHGEQZwhenQandZare not computed.P1βREALarray, dimension(LDA, max(NN)). The upper triangular matrix computed fromTbySHGEQZwhenQandZare also computed.P2βREALarray, dimension(LDA, max(NN)). The upper triangular matrix computed fromTbySHGEQZwhenQandZare not computed.UβREALarray, dimension(LDU, max(NN)). The (left) orthogonal matrix computed bySGGHRD.LDUβINTEGER. The leading dimension ofU,V,Q,Z,EVECTL, andEVECTR. It must be at least1and at leastmax( NN ).VβREALarray, dimension(LDU, max(NN)). The (right) orthogonal matrix computed bySGGHRD.QβREALarray, dimension(LDU, max(NN)). The (left) orthogonal matrix computed bySHGEQZ.ZβREALarray, dimension(LDU, max(NN)). The (left) orthogonal matrix computed bySHGEQZ.ALPHR1βREALarray, dimension(max(NN)).ALPHI1βREALarray, dimension(max(NN)).BETA1βREALarray, dimension(max(NN)).
The generalized eigenvalues of (A,B) computed by SHGEQZ when Q, Z, and the full Schur matrices are computed. On exit, ( ALPHR1(k)+ALPHI1(k)*i ) / BETA1(k) is the k-th generalized eigenvalue of the matrices in A and B. bestie that's the whole personality right there π
ALPHR3βREALarray, dimension(max(NN)).ALPHI3βREALarray, dimension(max(NN)).BETA3βREALarray, dimension(max(NN)).EVECTLβREALarray, dimension(LDU, max(NN)). The (block lower triangular) left eigenvector matrix for the matrices inS1andP1. (SeeSTGEVCfor the format.)EVECTRβREALarray, dimension(LDU, max(NN)). The (block upper triangular) right eigenvector matrix for the matrices inS1andP1. (SeeSTGEVCfor the format.)WORKβREALarray, dimension(LWORK).LWORKβINTEGER. The number of entries inWORK. This must be at leastmax( 2 * N**2, 6*N, 1 ), for allN=NN(j). Under-size it and you will be humbled π«LLWORKβLOGICALarray, dimension(max(NN)).RESULTβREALarray, dimension(15). The values computed by the tests described above. The values are currently limited to1/ulp, to avoid overflow.INFOβINTEGER.= 0: successful exit π< 0: ifINFO = -i, thei-th argument had an illegal value> 0: A routine returned an error code.INFOis the absolute value of theINFOvalue returned.
π Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
π Definition at line 506 of file schkgg.f.
π« Author
Generated automatically by Doxygen for LAPACK from the source code. (Not a human, but honestly? It ate. π₯)
okay that's the whole page bestie, you're officially fluent in SCHKGG π
β¨
And that's a wrap on LAPACK Version 3.12.0 β straight out of /home/abui...IG/schkgg.f(3). Go forth and test those pencils, ily, bye π¦ππ
π¦ where this page comes from
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms