summaryrefslogtreecommitdiff
path: root/TESTING/EIG/zdrvsx.f
diff options
context:
space:
mode:
authorjulie <julielangou@users.noreply.github.com>2011-10-06 06:53:11 +0000
committerjulie <julielangou@users.noreply.github.com>2011-10-06 06:53:11 +0000
commite1d39294aee16fa6db9ba079b14442358217db71 (patch)
tree30e5aa04c1f6596991fda5334f63dfb9b8027849 /TESTING/EIG/zdrvsx.f
parent5fe0466a14e395641f4f8a300ecc9dcb8058081b (diff)
downloadlapack-e1d39294aee16fa6db9ba079b14442358217db71.tar.gz
lapack-e1d39294aee16fa6db9ba079b14442358217db71.tar.bz2
lapack-e1d39294aee16fa6db9ba079b14442358217db71.zip
Integrating Doxygen in comments
Diffstat (limited to 'TESTING/EIG/zdrvsx.f')
-rw-r--r--TESTING/EIG/zdrvsx.f756
1 files changed, 440 insertions, 316 deletions
diff --git a/TESTING/EIG/zdrvsx.f b/TESTING/EIG/zdrvsx.f
index cd8b5fa6..4b8f5578 100644
--- a/TESTING/EIG/zdrvsx.f
+++ b/TESTING/EIG/zdrvsx.f
@@ -1,11 +1,449 @@
+*> \brief \b ZDRVSX
+*
+* =========== DOCUMENTATION ===========
+*
+* Online html documentation available at
+* http://www.netlib.org/lapack/explore-html/
+*
+* Definition
+* ==========
+*
+* SUBROUTINE ZDRVSX( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
+* NIUNIT, NOUNIT, A, LDA, H, HT, W, WT, WTMP, VS,
+* LDVS, VS1, RESULT, WORK, LWORK, RWORK, BWORK,
+* INFO )
+*
+* .. Scalar Arguments ..
+* INTEGER INFO, LDA, LDVS, LWORK, NIUNIT, NOUNIT, NSIZES,
+* $ NTYPES
+* DOUBLE PRECISION THRESH
+* ..
+* .. Array Arguments ..
+* LOGICAL BWORK( * ), DOTYPE( * )
+* INTEGER ISEED( 4 ), NN( * )
+* DOUBLE PRECISION RESULT( 17 ), RWORK( * )
+* COMPLEX*16 A( LDA, * ), H( LDA, * ), HT( LDA, * ),
+* $ VS( LDVS, * ), VS1( LDVS, * ), W( * ),
+* $ WORK( * ), WT( * ), WTMP( * )
+* ..
+*
+* Purpose
+* =======
+*
+*>\details \b Purpose:
+*>\verbatim
+*>
+*> ZDRVSX checks the nonsymmetric eigenvalue (Schur form) problem
+*> expert driver ZGEESX.
+*>
+*> ZDRVSX uses both test matrices generated randomly depending on
+*> data supplied in the calling sequence, as well as on data
+*> read from an input file and including precomputed condition
+*> numbers to which it compares the ones it computes.
+*>
+*> When ZDRVSX is called, a number of matrix "sizes" ("n's") and a
+*> number of matrix "types" are specified. For each size ("n")
+*> 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:
+*>
+*> (1) 0 if T is in Schur form, 1/ulp otherwise
+*> (no sorting of eigenvalues)
+*>
+*> (2) | A - VS T VS' | / ( n |A| ulp )
+*>
+*> Here VS is the matrix of Schur eigenvectors, and T is in Schur
+*> form (no sorting of eigenvalues).
+*>
+*> (3) | I - VS VS' | / ( n ulp ) (no sorting of eigenvalues).
+*>
+*> (4) 0 if W are eigenvalues of T
+*> 1/ulp otherwise
+*> (no sorting of eigenvalues)
+*>
+*> (5) 0 if T(with VS) = T(without VS),
+*> 1/ulp otherwise
+*> (no sorting of eigenvalues)
+*>
+*> (6) 0 if eigenvalues(with VS) = eigenvalues(without VS),
+*> 1/ulp otherwise
+*> (no sorting of eigenvalues)
+*>
+*> (7) 0 if T is in Schur form, 1/ulp otherwise
+*> (with sorting of eigenvalues)
+*>
+*> (8) | A - VS T VS' | / ( n |A| ulp )
+*>
+*> Here VS is the matrix of Schur eigenvectors, and T is in Schur
+*> form (with sorting of eigenvalues).
+*>
+*> (9) | I - VS VS' | / ( n ulp ) (with sorting of eigenvalues).
+*>
+*> (10) 0 if W are eigenvalues of T
+*> 1/ulp otherwise
+*> If workspace sufficient, also compare W with and
+*> without reciprocal condition numbers
+*> (with sorting of eigenvalues)
+*>
+*> (11) 0 if T(with VS) = T(without VS),
+*> 1/ulp otherwise
+*> If workspace sufficient, also compare T with and without
+*> reciprocal condition numbers
+*> (with sorting of eigenvalues)
+*>
+*> (12) 0 if eigenvalues(with VS) = eigenvalues(without VS),
+*> 1/ulp otherwise
+*> If workspace sufficient, also compare VS with and without
+*> reciprocal condition numbers
+*> (with sorting of eigenvalues)
+*>
+*> (13) if sorting worked and SDIM is the number of
+*> eigenvalues which were SELECTed
+*> If workspace sufficient, also compare SDIM with and
+*> without reciprocal condition numbers
+*>
+*> (14) if RCONDE the same no matter if VS and/or RCONDV computed
+*>
+*> (15) if RCONDV the same no matter if VS and/or RCONDE computed
+*>
+*> The "sizes" 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) 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 complex angles.
+*> (ULP = (first number larger than 1) - 1 )
+*> (5) A diagonal matrix with geometrically spaced entries
+*> 1, ..., ULP and random complex angles.
+*> (6) A diagonal matrix with "clustered" entries 1, ULP, ..., ULP
+*> and random complex angles.
+*>
+*> (7) Same as (4), but multiplied by a constant near
+*> the overflow threshold
+*> (8) Same as (4), but multiplied by a constant near
+*> the underflow threshold
+*>
+*> (9) A matrix of the form U' T U, where U is unitary and
+*> T has evenly spaced entries 1, ..., ULP with random
+*> complex angles on the diagonal and random O(1) entries in
+*> the upper triangle.
+*>
+*> (10) A matrix of the form U' T U, where U is unitary and
+*> T has geometrically spaced entries 1, ..., ULP with random
+*> complex angles 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 "clustered" entries 1, ULP,..., ULP with random
+*> complex angles on the diagonal and random O(1) entries in
+*> the upper triangle.
+*>
+*> (12) A matrix of the form U' T U, where U is unitary and
+*> T has complex eigenvalues randomly chosen from
+*> ULP < |z| < 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 complex angles 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 complex angles 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 "clustered" entries 1, ULP,..., ULP
+*> with random complex angles 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 complex eigenvalues randomly chosen
+*> from ULP < |z| < 1 and random O(1) entries in the upper
+*> triangle.
+*>
+*> (17) Same as (16), but multiplied by a constant
+*> near the overflow threshold
+*> (18) Same as (16), but multiplied by a constant
+*> near the underflow threshold
+*>
+*> (19) Nonsymmetric matrix with random entries chosen from (-1,1).
+*> If N is at least 4, all entries in first two rows and last
+*> row, and first column and last two columns are zero.
+*> (20) Same as (19), but multiplied by a constant
+*> near the overflow threshold
+*> (21) Same as (19), but multiplied by a constant
+*> near the underflow threshold
+*>
+*> In addition, an input file will be read from logical unit number
+*> NIUNIT. The file contains matrices along with precomputed
+*> eigenvalues and reciprocal condition numbers for the eigenvalue
+*> average and right invariant subspace. For these matrices, in
+*> addition to tests (1) to (15) we will compute the following two
+*> tests:
+*>
+*> (16) |RCONDE - RCDEIN| / cond(RCONDE)
+*>
+*> RCONDE is the reciprocal average eigenvalue condition number
+*> computed by ZGEESX and RCDEIN (the precomputed true value)
+*> is supplied as input. cond(RCONDE) is the condition number
+*> of RCONDE, and takes errors in computing RCONDE into account,
+*> so that the resulting quantity should be O(ULP). cond(RCONDE)
+*> is essentially given by norm(A)/RCONDV.
+*>
+*> (17) |RCONDV - RCDVIN| / cond(RCONDV)
+*>
+*> RCONDV is the reciprocal right invariant subspace condition
+*> number computed by ZGEESX and RCDVIN (the precomputed true
+*> value) is supplied as input. cond(RCONDV) is the condition
+*> number of RCONDV, and takes errors in computing RCONDV into
+*> account, so that the resulting quantity should be O(ULP).
+*> cond(RCONDV) is essentially given by norm(A)/RCONDE.
+*>
+*>\endverbatim
+*
+* Arguments
+* =========
+*
+*> \param[in] NSIZES
+*> \verbatim
+*> NSIZES is INTEGER
+*> The number of sizes of matrices to use. NSIZES must be at
+*> least zero. If it is zero, no randomly generated matrices
+*> are tested, but any test matrices read from NIUNIT will be
+*> tested.
+*> \endverbatim
+*>
+*> \param[in] NN
+*> \verbatim
+*> 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.
+*> \endverbatim
+*>
+*> \param[in] NTYPES
+*> \verbatim
+*> NTYPES is INTEGER
+*> The number of elements in DOTYPE. NTYPES must be at least
+*> zero. If it is zero, no randomly generated test matrices
+*> are tested, but and test matrices read from NIUNIT will be
+*> tested. 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. .
+*> \endverbatim
+*>
+*> \param[in] DOTYPE
+*> \verbatim
+*> DOTYPE is LOGICAL array, dimension (NTYPES)
+*> If DOTYPE(j) is .TRUE., then for each size in NN a
+*> matrix of that size and of type j will be generated.
+*> If NTYPES is smaller than the maximum number of types
+*> defined (PARAMETER MAXTYP), then types NTYPES+1 through
+*> MAXTYP will not be generated. If NTYPES is larger
+*> than MAXTYP, DOTYPE(MAXTYP+1) through DOTYPE(NTYPES)
+*> will be ignored.
+*> \endverbatim
+*>
+*> \param[in,out] ISEED
+*> \verbatim
+*> ISEED is 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 not they will be reduced mod 4096. Also, ISEED(4) must
+*> be odd. The random number generator uses a linear
+*> congruential sequence limited to small integers, and so
+*> should produce machine independent random numbers. The
+*> values of ISEED are changed on exit, and can be used in the
+*> next call to ZDRVSX to continue the same random number
+*> sequence.
+*> \endverbatim
+*>
+*> \param[in] THRESH
+*> \verbatim
+*> THRESH is DOUBLE PRECISION
+*> A test will count as "failed" if the "error", 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.
+*> \endverbatim
+*>
+*> \param[in] NIUNIT
+*> \verbatim
+*> NIUNIT is INTEGER
+*> The FORTRAN unit number for reading in the data file of
+*> problems to solve.
+*> \endverbatim
+*>
+*> \param[in] NOUNIT
+*> \verbatim
+*> NOUNIT is INTEGER
+*> The FORTRAN unit number for printing out error messages
+*> (e.g., if a routine returns INFO not equal to 0.)
+*> \endverbatim
+*>
+*> \param[out] A
+*> \verbatim
+*> A is COMPLEX*16 array, dimension (LDA, max(NN))
+*> Used to hold the matrix whose eigenvalues are to be
+*> computed. On exit, A contains the last matrix actually used.
+*> \endverbatim
+*>
+*> \param[in] LDA
+*> \verbatim
+*> LDA is INTEGER
+*> The leading dimension of A, and H. LDA must be at
+*> least 1 and at least max( NN ).
+*> \endverbatim
+*>
+*> \param[out] H
+*> \verbatim
+*> H is COMPLEX*16 array, dimension (LDA, max(NN))
+*> Another copy of the test matrix A, modified by ZGEESX.
+*> \endverbatim
+*>
+*> \param[out] HT
+*> \verbatim
+*> HT is COMPLEX*16 array, dimension (LDA, max(NN))
+*> Yet another copy of the test matrix A, modified by ZGEESX.
+*> \endverbatim
+*>
+*> \param[out] W
+*> \verbatim
+*> W is COMPLEX*16 array, dimension (max(NN))
+*> The computed eigenvalues of A.
+*> \endverbatim
+*>
+*> \param[out] WT
+*> \verbatim
+*> WT is COMPLEX*16 array, dimension (max(NN))
+*> Like W, this array contains the eigenvalues of A,
+*> but those computed when ZGEESX only computes a partial
+*> eigendecomposition, i.e. not Schur vectors
+*> \endverbatim
+*>
+*> \param[out] WTMP
+*> \verbatim
+*> WTMP is COMPLEX*16 array, dimension (max(NN))
+*> More temporary storage for eigenvalues.
+*> \endverbatim
+*>
+*> \param[out] VS
+*> \verbatim
+*> VS is COMPLEX*16 array, dimension (LDVS, max(NN))
+*> VS holds the computed Schur vectors.
+*> \endverbatim
+*>
+*> \param[in] LDVS
+*> \verbatim
+*> LDVS is INTEGER
+*> Leading dimension of VS. Must be at least max(1,max(NN)).
+*> \endverbatim
+*>
+*> \param[out] VS1
+*> \verbatim
+*> VS1 is COMPLEX*16 array, dimension (LDVS, max(NN))
+*> VS1 holds another copy of the computed Schur vectors.
+*> \endverbatim
+*>
+*> \param[out] RESULT
+*> \verbatim
+*> RESULT is DOUBLE PRECISION array, dimension (17)
+*> The values computed by the 17 tests described above.
+*> The values are currently limited to 1/ulp, to avoid overflow.
+*> \endverbatim
+*>
+*> \param[out] WORK
+*> \verbatim
+*> WORK is COMPLEX*16 array, dimension (LWORK)
+*> \endverbatim
+*>
+*> \param[in] LWORK
+*> \verbatim
+*> LWORK is INTEGER
+*> The number of entries in WORK. This must be at least
+*> max(1,2*NN(j)**2) for all j.
+*> \endverbatim
+*>
+*> \param[out] RWORK
+*> \verbatim
+*> RWORK is DOUBLE PRECISION array, dimension (max(NN))
+*> \endverbatim
+*>
+*> \param[out] BWORK
+*> \verbatim
+*> BWORK is LOGICAL array, dimension (max(NN))
+*> \endverbatim
+*>
+*> \param[out] INFO
+*> \verbatim
+*> INFO is INTEGER
+*> If 0, successful exit.
+*> <0, input parameter -INFO is incorrect
+*> >0, ZLATMR, CLATMS, CLATME or ZGET24 returned an error
+*> code and INFO is its absolute value
+*> \endverbatim
+*> \verbatim
+*>-----------------------------------------------------------------------
+*> \endverbatim
+*> \verbatim
+*> Some Local Variables and Parameters:
+*> ---- ----- --------- --- ----------
+*> ZERO, ONE Real 0 and 1.
+*> MAXTYP The number of types defined.
+*> NMAX Largest value in NN.
+*> NERRS The number of tests which have exceeded THRESH
+*> COND, CONDS,
+*> IMODE Values to be passed to the matrix generators.
+*> ANORM Norm of A; passed to matrix generators.
+*> \endverbatim
+*> \verbatim
+*> OVFL, UNFL Overflow and underflow thresholds.
+*> ULP, ULPINV Finest relative precision and its inverse.
+*> RTULP, RTULPI Square roots of the previous 4 values.
+*> The following four arrays decode JTYPE:
+*> KTYPE(j) The general type (1-10) for type "j".
+*> KMODE(j) The MODE value to be passed to the matrix
+*> generator for type "j".
+*> KMAGN(j) The order of magnitude ( O(1),
+*> O(overflow^(1/2) ), O(underflow^(1/2) )
+*> KCONDS(j) Selectw whether CONDS is to be 1 or
+*> 1/sqrt(ulp). (0 means irrelevant.)
+*> \endverbatim
+*>
+*
+* Authors
+* =======
+*
+*> \author Univ. of Tennessee
+*> \author Univ. of California Berkeley
+*> \author Univ. of Colorado Denver
+*> \author NAG Ltd.
+*
+*> \date November 2011
+*
+*> \ingroup complex16_eig
+*
+* =====================================================================
SUBROUTINE ZDRVSX( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
$ NIUNIT, NOUNIT, A, LDA, H, HT, W, WT, WTMP, VS,
$ LDVS, VS1, RESULT, WORK, LWORK, RWORK, BWORK,
$ INFO )
*
* -- LAPACK test routine (version 3.1) --
-* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-* November 2006
+* -- LAPACK is a software package provided by Univ. of Tennessee, --
+* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
+* November 2011
*
* .. Scalar Arguments ..
INTEGER INFO, LDA, LDVS, LWORK, NIUNIT, NOUNIT, NSIZES,
@@ -21,320 +459,6 @@
$ WORK( * ), WT( * ), WTMP( * )
* ..
*
-* Purpose
-* =======
-*
-* ZDRVSX checks the nonsymmetric eigenvalue (Schur form) problem
-* expert driver ZGEESX.
-*
-* ZDRVSX uses both test matrices generated randomly depending on
-* data supplied in the calling sequence, as well as on data
-* read from an input file and including precomputed condition
-* numbers to which it compares the ones it computes.
-*
-* When ZDRVSX is called, a number of matrix "sizes" ("n's") and a
-* number of matrix "types" are specified. For each size ("n")
-* 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:
-*
-* (1) 0 if T is in Schur form, 1/ulp otherwise
-* (no sorting of eigenvalues)
-*
-* (2) | A - VS T VS' | / ( n |A| ulp )
-*
-* Here VS is the matrix of Schur eigenvectors, and T is in Schur
-* form (no sorting of eigenvalues).
-*
-* (3) | I - VS VS' | / ( n ulp ) (no sorting of eigenvalues).
-*
-* (4) 0 if W are eigenvalues of T
-* 1/ulp otherwise
-* (no sorting of eigenvalues)
-*
-* (5) 0 if T(with VS) = T(without VS),
-* 1/ulp otherwise
-* (no sorting of eigenvalues)
-*
-* (6) 0 if eigenvalues(with VS) = eigenvalues(without VS),
-* 1/ulp otherwise
-* (no sorting of eigenvalues)
-*
-* (7) 0 if T is in Schur form, 1/ulp otherwise
-* (with sorting of eigenvalues)
-*
-* (8) | A - VS T VS' | / ( n |A| ulp )
-*
-* Here VS is the matrix of Schur eigenvectors, and T is in Schur
-* form (with sorting of eigenvalues).
-*
-* (9) | I - VS VS' | / ( n ulp ) (with sorting of eigenvalues).
-*
-* (10) 0 if W are eigenvalues of T
-* 1/ulp otherwise
-* If workspace sufficient, also compare W with and
-* without reciprocal condition numbers
-* (with sorting of eigenvalues)
-*
-* (11) 0 if T(with VS) = T(without VS),
-* 1/ulp otherwise
-* If workspace sufficient, also compare T with and without
-* reciprocal condition numbers
-* (with sorting of eigenvalues)
-*
-* (12) 0 if eigenvalues(with VS) = eigenvalues(without VS),
-* 1/ulp otherwise
-* If workspace sufficient, also compare VS with and without
-* reciprocal condition numbers
-* (with sorting of eigenvalues)
-*
-* (13) if sorting worked and SDIM is the number of
-* eigenvalues which were SELECTed
-* If workspace sufficient, also compare SDIM with and
-* without reciprocal condition numbers
-*
-* (14) if RCONDE the same no matter if VS and/or RCONDV computed
-*
-* (15) if RCONDV the same no matter if VS and/or RCONDE computed
-*
-* The "sizes" 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) 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 complex angles.
-* (ULP = (first number larger than 1) - 1 )
-* (5) A diagonal matrix with geometrically spaced entries
-* 1, ..., ULP and random complex angles.
-* (6) A diagonal matrix with "clustered" entries 1, ULP, ..., ULP
-* and random complex angles.
-*
-* (7) Same as (4), but multiplied by a constant near
-* the overflow threshold
-* (8) Same as (4), but multiplied by a constant near
-* the underflow threshold
-*
-* (9) A matrix of the form U' T U, where U is unitary and
-* T has evenly spaced entries 1, ..., ULP with random
-* complex angles on the diagonal and random O(1) entries in
-* the upper triangle.
-*
-* (10) A matrix of the form U' T U, where U is unitary and
-* T has geometrically spaced entries 1, ..., ULP with random
-* complex angles 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 "clustered" entries 1, ULP,..., ULP with random
-* complex angles on the diagonal and random O(1) entries in
-* the upper triangle.
-*
-* (12) A matrix of the form U' T U, where U is unitary and
-* T has complex eigenvalues randomly chosen from
-* ULP < |z| < 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 complex angles 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 complex angles 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 "clustered" entries 1, ULP,..., ULP
-* with random complex angles 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 complex eigenvalues randomly chosen
-* from ULP < |z| < 1 and random O(1) entries in the upper
-* triangle.
-*
-* (17) Same as (16), but multiplied by a constant
-* near the overflow threshold
-* (18) Same as (16), but multiplied by a constant
-* near the underflow threshold
-*
-* (19) Nonsymmetric matrix with random entries chosen from (-1,1).
-* If N is at least 4, all entries in first two rows and last
-* row, and first column and last two columns are zero.
-* (20) Same as (19), but multiplied by a constant
-* near the overflow threshold
-* (21) Same as (19), but multiplied by a constant
-* near the underflow threshold
-*
-* In addition, an input file will be read from logical unit number
-* NIUNIT. The file contains matrices along with precomputed
-* eigenvalues and reciprocal condition numbers for the eigenvalue
-* average and right invariant subspace. For these matrices, in
-* addition to tests (1) to (15) we will compute the following two
-* tests:
-*
-* (16) |RCONDE - RCDEIN| / cond(RCONDE)
-*
-* RCONDE is the reciprocal average eigenvalue condition number
-* computed by ZGEESX and RCDEIN (the precomputed true value)
-* is supplied as input. cond(RCONDE) is the condition number
-* of RCONDE, and takes errors in computing RCONDE into account,
-* so that the resulting quantity should be O(ULP). cond(RCONDE)
-* is essentially given by norm(A)/RCONDV.
-*
-* (17) |RCONDV - RCDVIN| / cond(RCONDV)
-*
-* RCONDV is the reciprocal right invariant subspace condition
-* number computed by ZGEESX and RCDVIN (the precomputed true
-* value) is supplied as input. cond(RCONDV) is the condition
-* number of RCONDV, and takes errors in computing RCONDV into
-* account, so that the resulting quantity should be O(ULP).
-* cond(RCONDV) is essentially given by norm(A)/RCONDE.
-*
-* Arguments
-* =========
-*
-* NSIZES (input) INTEGER
-* The number of sizes of matrices to use. NSIZES must be at
-* least zero. If it is zero, no randomly generated matrices
-* are tested, but any test matrices read from NIUNIT will be
-* tested.
-*
-* NN (input) 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 (input) INTEGER
-* The number of elements in DOTYPE. NTYPES must be at least
-* zero. If it is zero, no randomly generated test matrices
-* are tested, but and test matrices read from NIUNIT will be
-* tested. 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 (input) LOGICAL array, dimension (NTYPES)
-* If DOTYPE(j) is .TRUE., then for each size in NN a
-* matrix of that size and of type j will be generated.
-* If NTYPES is smaller than the maximum number of types
-* defined (PARAMETER MAXTYP), then types NTYPES+1 through
-* MAXTYP will not be generated. If NTYPES is larger
-* than MAXTYP, DOTYPE(MAXTYP+1) through DOTYPE(NTYPES)
-* will be ignored.
-*
-* ISEED (input/output) 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 not they will be reduced mod 4096. Also, ISEED(4) must
-* be odd. The random number generator uses a linear
-* congruential sequence limited to small integers, and so
-* should produce machine independent random numbers. The
-* values of ISEED are changed on exit, and can be used in the
-* next call to ZDRVSX to continue the same random number
-* sequence.
-*
-* THRESH (input) DOUBLE PRECISION
-* A test will count as "failed" if the "error", 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.
-*
-* NIUNIT (input) INTEGER
-* The FORTRAN unit number for reading in the data file of
-* problems to solve.
-*
-* NOUNIT (input) INTEGER
-* The FORTRAN unit number for printing out error messages
-* (e.g., if a routine returns INFO not equal to 0.)
-*
-* A (workspace) COMPLEX*16 array, dimension (LDA, max(NN))
-* Used to hold the matrix whose eigenvalues are to be
-* computed. On exit, A contains the last matrix actually used.
-*
-* LDA (input) INTEGER
-* The leading dimension of A, and H. LDA must be at
-* least 1 and at least max( NN ).
-*
-* H (workspace) COMPLEX*16 array, dimension (LDA, max(NN))
-* Another copy of the test matrix A, modified by ZGEESX.
-*
-* HT (workspace) COMPLEX*16 array, dimension (LDA, max(NN))
-* Yet another copy of the test matrix A, modified by ZGEESX.
-*
-* W (workspace) COMPLEX*16 array, dimension (max(NN))
-* The computed eigenvalues of A.
-*
-* WT (workspace) COMPLEX*16 array, dimension (max(NN))
-* Like W, this array contains the eigenvalues of A,
-* but those computed when ZGEESX only computes a partial
-* eigendecomposition, i.e. not Schur vectors
-*
-* WTMP (workspace) COMPLEX*16 array, dimension (max(NN))
-* More temporary storage for eigenvalues.
-*
-* VS (workspace) COMPLEX*16 array, dimension (LDVS, max(NN))
-* VS holds the computed Schur vectors.
-*
-* LDVS (input) INTEGER
-* Leading dimension of VS. Must be at least max(1,max(NN)).
-*
-* VS1 (workspace) COMPLEX*16 array, dimension (LDVS, max(NN))
-* VS1 holds another copy of the computed Schur vectors.
-*
-* RESULT (output) DOUBLE PRECISION array, dimension (17)
-* The values computed by the 17 tests described above.
-* The values are currently limited to 1/ulp, to avoid overflow.
-*
-* WORK (workspace) COMPLEX*16 array, dimension (LWORK)
-*
-* LWORK (input) INTEGER
-* The number of entries in WORK. This must be at least
-* max(1,2*NN(j)**2) for all j.
-*
-* RWORK (workspace) DOUBLE PRECISION array, dimension (max(NN))
-*
-* BWORK (workspace) LOGICAL array, dimension (max(NN))
-*
-* INFO (output) INTEGER
-* If 0, successful exit.
-* <0, input parameter -INFO is incorrect
-* >0, ZLATMR, CLATMS, CLATME or ZGET24 returned an error
-* code and INFO is its absolute value
-*
-*-----------------------------------------------------------------------
-*
-* Some Local Variables and Parameters:
-* ---- ----- --------- --- ----------
-* ZERO, ONE Real 0 and 1.
-* MAXTYP The number of types defined.
-* NMAX Largest value in NN.
-* NERRS The number of tests which have exceeded THRESH
-* COND, CONDS,
-* IMODE Values to be passed to the matrix generators.
-* ANORM Norm of A; passed to matrix generators.
-*
-* OVFL, UNFL Overflow and underflow thresholds.
-* ULP, ULPINV Finest relative precision and its inverse.
-* RTULP, RTULPI Square roots of the previous 4 values.
-* The following four arrays decode JTYPE:
-* KTYPE(j) The general type (1-10) for type "j".
-* KMODE(j) The MODE value to be passed to the matrix
-* generator for type "j".
-* KMAGN(j) The order of magnitude ( O(1),
-* O(overflow^(1/2) ), O(underflow^(1/2) )
-* KCONDS(j) Selectw whether CONDS is to be 1 or
-* 1/sqrt(ulp). (0 means irrelevant.)
-*
* =====================================================================
*
* .. Parameters ..