SCHKGG(3)

πŸ“¦ version 3.12.0, in opensuse-leap 16.0

πŸ’… 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:

  • SGGHRD factors A and B as U H V<sup>T</sup> and U T V<sup>T</sup>, where <sup>T</sup> means transpose, H is hessenberg, T is triangular and U and V are orthogonal.
  • SHGEQZ factors H and T as Q S Z<sup>T</sup> and Q P Z<sup>T</sup>, where P is upper triangular, S is 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), and Q and Z are orthogonal. She also computes the generalized eigenvalues (alpha(1),beta(1)),...,(alpha(n),beta(n)), where alpha(j)=S(j,j) and beta(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
  • STGEVC computes the matrix L of left eigenvectors and the matrix R of right eigenvectors for the matrix pair ( S, P ). In the description below, l and r are 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 β€” LOGICAL array, dimension (NTYPES). If DOTYPE(j) is .TRUE., then for each size in NN a matrix of that size and of type j gets generated. If NTYPES is smaller than the maximum number of types defined (PARAMETER MAXTYP), then types NTYPES+1 through MAXTYP won't be generated. And if NTYPES is larger than MAXTYP, then DOTYPE(MAXTYP+1) through DOTYPE(NTYPES) just get ignored. Slay, but only up to MAXTYP. ✨
  • ISEED β€” INTEGER array, dimension (4). On entry, ISEED specifies the seed of the random number generator. The array elements should be between 0 and 4095 β€” if they're not, they get reduced mod 4096. Also ISEED(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 of ISEED are changed on exit, and can be used in the next call to SCHKGG to 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, exceeds THRESH. Note that the error is scaled to be O(1), so THRESH should be a reasonably small multiple of 1, e.g. 10 or 100. 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 ratios 13-15 will be computed and compared with THRESH.
    • = .FALSE.: Only test ratios 1-12 will be computed and tested. Ratios 13-15 will be set to zero.
    • = .TRUE.: All the test ratios 1-15 will be computed and tested.
  • THRSHN β€” REAL. Threshold for reporting eigenvector normalization error. If the normalization of any eigenvector differs from 1 by more than THRSHN*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 if THRSHN is at least 5--10.) Translation: if this fires, something is deeply cursed 😭
  • NOUNIT β€” INTEGER. The FORTRAN unit number for printing out error messages (e.g., if a routine returns IINFO not equal to 0.)
  • A β€” REAL array, dimension (LDA, max(NN)). Used to hold the original A matrix. Used as input only if NTYPES=MAXTYP+1, DOTYPE(1:MAXTYP)=.FALSE., and DOTYPE(MAXTYP+1)=.TRUE.
  • LDA β€” INTEGER. The leading dimension of A, B, H, T, S1, P1, S2, and P2. It must be at least 1 and at least max( NN ).
  • B β€” REAL array, dimension (LDA, max(NN)). Used to hold the original B matrix. Used as input only if NTYPES=MAXTYP+1, DOTYPE(1:MAXTYP)=.FALSE., and DOTYPE(MAXTYP+1)=.TRUE.
  • H β€” REAL array, dimension (LDA, max(NN)). The upper Hessenberg matrix computed from A by SGGHRD.
  • T β€” REAL array, dimension (LDA, max(NN)). The upper triangular matrix computed from B by SGGHRD.
  • S1 β€” REAL array, dimension (LDA, max(NN)). The Schur (block upper triangular) matrix computed from H by SHGEQZ when Q and Z are also computed.
  • S2 β€” REAL array, dimension (LDA, max(NN)). The Schur (block upper triangular) matrix computed from H by SHGEQZ when Q and Z are not computed.
  • P1 β€” REAL array, dimension (LDA, max(NN)). The upper triangular matrix computed from T by SHGEQZ when Q and Z are also computed.
  • P2 β€” REAL array, dimension (LDA, max(NN)). The upper triangular matrix computed from T by SHGEQZ when Q and Z are not computed.
  • U β€” REAL array, dimension (LDU, max(NN)). The (left) orthogonal matrix computed by SGGHRD.
  • LDU β€” INTEGER. The leading dimension of U, V, Q, Z, EVECTL, and EVECTR. It must be at least 1 and at least max( NN ).
  • V β€” REAL array, dimension (LDU, max(NN)). The (right) orthogonal matrix computed by SGGHRD.
  • Q β€” REAL array, dimension (LDU, max(NN)). The (left) orthogonal matrix computed by SHGEQZ.
  • Z β€” REAL array, dimension (LDU, max(NN)). The (left) orthogonal matrix computed by SHGEQZ.
  • ALPHR1 β€” REAL array, dimension (max(NN)).
  • ALPHI1 β€” REAL array, dimension (max(NN)).
  • BETA1 β€” REAL array, 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 β€” REAL array, dimension (max(NN)).
  • ALPHI3 β€” REAL array, dimension (max(NN)).
  • BETA3 β€” REAL array, dimension (max(NN)).
  • EVECTL β€” REAL array, dimension (LDU, max(NN)). The (block lower triangular) left eigenvector matrix for the matrices in S1 and P1. (See STGEVC for the format.)
  • EVECTR β€” REAL array, dimension (LDU, max(NN)). The (block upper triangular) right eigenvector matrix for the matrices in S1 and P1. (See STGEVC for the format.)
  • WORK β€” REAL array, dimension (LWORK).
  • LWORK β€” INTEGER. The number of entries in WORK. This must be at least max( 2 * N**2, 6*N, 1 ), for all N=NN(j). Under-size it and you will be humbled 🫠
  • LLWORK β€” LOGICAL array, dimension (max(NN)).
  • RESULT β€” REAL array, dimension (15). The values computed by the tests described above. The values are currently limited to 1/ulp, to avoid overflow.
  • INFO β€” INTEGER.
    • = 0: successful exit πŸŽ‰
    • < 0: if INFO = -i, the i-th argument had an illegal value
    • > 0: A routine returned an error code. INFO is the absolute value of the INFO value 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