LAPACK 3.3.0

zdrvsg.f

Go to the documentation of this file.
00001       SUBROUTINE ZDRVSG( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
00002      $                   NOUNIT, A, LDA, B, LDB, D, Z, LDZ, AB, BB, AP,
00003      $                   BP, WORK, NWORK, RWORK, LRWORK, IWORK, LIWORK,
00004      $                   RESULT, INFO )
00005 *
00006 *  -- LAPACK test routine (version 3.1) --
00007 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
00008 *     November 2006
00009 *
00010 **********************************************************************
00011 *
00012 *     modified August 1997, a new parameter LRWORK and LIWORK are
00013 *     added in the calling sequence.
00014 *
00015 *     test routine CDGT01 is also modified
00016 *
00017 **********************************************************************
00018 *
00019 *     .. Scalar Arguments ..
00020       INTEGER            INFO, LDA, LDB, LDZ, LIWORK, LRWORK, NOUNIT,
00021      $                   NSIZES, NTYPES, NWORK
00022       DOUBLE PRECISION   THRESH
00023 *     ..
00024 *     .. Array Arguments ..
00025       LOGICAL            DOTYPE( * )
00026       INTEGER            ISEED( 4 ), IWORK( * ), NN( * )
00027       DOUBLE PRECISION   D( * ), RESULT( * ), RWORK( * )
00028       COMPLEX*16         A( LDA, * ), AB( LDA, * ), AP( * ),
00029      $                   B( LDB, * ), BB( LDB, * ), BP( * ), WORK( * ),
00030      $                   Z( LDZ, * )
00031 *     ..
00032 *
00033 *  Purpose
00034 *  =======
00035 *
00036 *       ZDRVSG checks the complex Hermitian generalized eigenproblem
00037 *       drivers.
00038 *
00039 *               ZHEGV computes all eigenvalues and, optionally,
00040 *               eigenvectors of a complex Hermitian-definite generalized
00041 *               eigenproblem.
00042 *
00043 *               ZHEGVD computes all eigenvalues and, optionally,
00044 *               eigenvectors of a complex Hermitian-definite generalized
00045 *               eigenproblem using a divide and conquer algorithm.
00046 *
00047 *               ZHEGVX computes selected eigenvalues and, optionally,
00048 *               eigenvectors of a complex Hermitian-definite generalized
00049 *               eigenproblem.
00050 *
00051 *               ZHPGV computes all eigenvalues and, optionally,
00052 *               eigenvectors of a complex Hermitian-definite generalized
00053 *               eigenproblem in packed storage.
00054 *
00055 *               ZHPGVD computes all eigenvalues and, optionally,
00056 *               eigenvectors of a complex Hermitian-definite generalized
00057 *               eigenproblem in packed storage using a divide and
00058 *               conquer algorithm.
00059 *
00060 *               ZHPGVX computes selected eigenvalues and, optionally,
00061 *               eigenvectors of a complex Hermitian-definite generalized
00062 *               eigenproblem in packed storage.
00063 *
00064 *               ZHBGV computes all eigenvalues and, optionally,
00065 *               eigenvectors of a complex Hermitian-definite banded
00066 *               generalized eigenproblem.
00067 *
00068 *               ZHBGVD computes all eigenvalues and, optionally,
00069 *               eigenvectors of a complex Hermitian-definite banded
00070 *               generalized eigenproblem using a divide and conquer
00071 *               algorithm.
00072 *
00073 *               ZHBGVX computes selected eigenvalues and, optionally,
00074 *               eigenvectors of a complex Hermitian-definite banded
00075 *               generalized eigenproblem.
00076 *
00077 *       When ZDRVSG is called, a number of matrix "sizes" ("n's") and a
00078 *       number of matrix "types" are specified.  For each size ("n")
00079 *       and each type of matrix, one matrix A of the given type will be
00080 *       generated; a random well-conditioned matrix B is also generated
00081 *       and the pair (A,B) is used to test the drivers.
00082 *
00083 *       For each pair (A,B), the following tests are performed:
00084 *
00085 *       (1) ZHEGV with ITYPE = 1 and UPLO ='U':
00086 *
00087 *               | A Z - B Z D | / ( |A| |Z| n ulp )
00088 *
00089 *       (2) as (1) but calling ZHPGV
00090 *       (3) as (1) but calling ZHBGV
00091 *       (4) as (1) but with UPLO = 'L'
00092 *       (5) as (4) but calling ZHPGV
00093 *       (6) as (4) but calling ZHBGV
00094 *
00095 *       (7) ZHEGV with ITYPE = 2 and UPLO ='U':
00096 *
00097 *               | A B Z - Z D | / ( |A| |Z| n ulp )
00098 *
00099 *       (8) as (7) but calling ZHPGV
00100 *       (9) as (7) but with UPLO = 'L'
00101 *       (10) as (9) but calling ZHPGV
00102 *
00103 *       (11) ZHEGV with ITYPE = 3 and UPLO ='U':
00104 *
00105 *               | B A Z - Z D | / ( |A| |Z| n ulp )
00106 *
00107 *       (12) as (11) but calling ZHPGV
00108 *       (13) as (11) but with UPLO = 'L'
00109 *       (14) as (13) but calling ZHPGV
00110 *
00111 *       ZHEGVD, ZHPGVD and ZHBGVD performed the same 14 tests.
00112 *
00113 *       ZHEGVX, ZHPGVX and ZHBGVX performed the above 14 tests with
00114 *       the parameter RANGE = 'A', 'N' and 'I', respectively.
00115 *
00116 *       The "sizes" are specified by an array NN(1:NSIZES); the value of
00117 *       each element NN(j) specifies one size.
00118 *       The "types" are specified by a logical array DOTYPE( 1:NTYPES );
00119 *       if DOTYPE(j) is .TRUE., then matrix type "j" will be generated.
00120 *       This type is used for the matrix A which has half-bandwidth KA.
00121 *       B is generated as a well-conditioned positive definite matrix
00122 *       with half-bandwidth KB (<= KA).
00123 *       Currently, the list of possible types for A is:
00124 *
00125 *       (1)  The zero matrix.
00126 *       (2)  The identity matrix.
00127 *
00128 *       (3)  A diagonal matrix with evenly spaced entries
00129 *            1, ..., ULP  and random signs.
00130 *            (ULP = (first number larger than 1) - 1 )
00131 *       (4)  A diagonal matrix with geometrically spaced entries
00132 *            1, ..., ULP  and random signs.
00133 *       (5)  A diagonal matrix with "clustered" entries 1, ULP, ..., ULP
00134 *            and random signs.
00135 *
00136 *       (6)  Same as (4), but multiplied by SQRT( overflow threshold )
00137 *       (7)  Same as (4), but multiplied by SQRT( underflow threshold )
00138 *
00139 *       (8)  A matrix of the form  U* D U, where U is unitary and
00140 *            D has evenly spaced entries 1, ..., ULP with random signs
00141 *            on the diagonal.
00142 *
00143 *       (9)  A matrix of the form  U* D U, where U is unitary and
00144 *            D has geometrically spaced entries 1, ..., ULP with random
00145 *            signs on the diagonal.
00146 *
00147 *       (10) A matrix of the form  U* D U, where U is unitary and
00148 *            D has "clustered" entries 1, ULP,..., ULP with random
00149 *            signs on the diagonal.
00150 *
00151 *       (11) Same as (8), but multiplied by SQRT( overflow threshold )
00152 *       (12) Same as (8), but multiplied by SQRT( underflow threshold )
00153 *
00154 *       (13) Hermitian matrix with random entries chosen from (-1,1).
00155 *       (14) Same as (13), but multiplied by SQRT( overflow threshold )
00156 *       (15) Same as (13), but multiplied by SQRT( underflow threshold )
00157 *
00158 *       (16) Same as (8), but with KA = 1 and KB = 1
00159 *       (17) Same as (8), but with KA = 2 and KB = 1
00160 *       (18) Same as (8), but with KA = 2 and KB = 2
00161 *       (19) Same as (8), but with KA = 3 and KB = 1
00162 *       (20) Same as (8), but with KA = 3 and KB = 2
00163 *       (21) Same as (8), but with KA = 3 and KB = 3
00164 *
00165 *  Arguments
00166 *  =========
00167 *
00168 *  NSIZES  INTEGER
00169 *          The number of sizes of matrices to use.  If it is zero,
00170 *          ZDRVSG does nothing.  It must be at least zero.
00171 *          Not modified.
00172 *
00173 *  NN      INTEGER array, dimension (NSIZES)
00174 *          An array containing the sizes to be used for the matrices.
00175 *          Zero values will be skipped.  The values must be at least
00176 *          zero.
00177 *          Not modified.
00178 *
00179 *  NTYPES  INTEGER
00180 *          The number of elements in DOTYPE.   If it is zero, ZDRVSG
00181 *          does nothing.  It must be at least zero.  If it is MAXTYP+1
00182 *          and NSIZES is 1, then an additional type, MAXTYP+1 is
00183 *          defined, which is to use whatever matrix is in A.  This
00184 *          is only useful if DOTYPE(1:MAXTYP) is .FALSE. and
00185 *          DOTYPE(MAXTYP+1) is .TRUE. .
00186 *          Not modified.
00187 *
00188 *  DOTYPE  LOGICAL array, dimension (NTYPES)
00189 *          If DOTYPE(j) is .TRUE., then for each size in NN a
00190 *          matrix of that size and of type j will be generated.
00191 *          If NTYPES is smaller than the maximum number of types
00192 *          defined (PARAMETER MAXTYP), then types NTYPES+1 through
00193 *          MAXTYP will not be generated.  If NTYPES is larger
00194 *          than MAXTYP, DOTYPE(MAXTYP+1) through DOTYPE(NTYPES)
00195 *          will be ignored.
00196 *          Not modified.
00197 *
00198 *  ISEED   INTEGER array, dimension (4)
00199 *          On entry ISEED specifies the seed of the random number
00200 *          generator. The array elements should be between 0 and 4095;
00201 *          if not they will be reduced mod 4096.  Also, ISEED(4) must
00202 *          be odd.  The random number generator uses a linear
00203 *          congruential sequence limited to small integers, and so
00204 *          should produce machine independent random numbers. The
00205 *          values of ISEED are changed on exit, and can be used in the
00206 *          next call to ZDRVSG to continue the same random number
00207 *          sequence.
00208 *          Modified.
00209 *
00210 *  THRESH  DOUBLE PRECISION
00211 *          A test will count as "failed" if the "error", computed as
00212 *          described above, exceeds THRESH.  Note that the error
00213 *          is scaled to be O(1), so THRESH should be a reasonably
00214 *          small multiple of 1, e.g., 10 or 100.  In particular,
00215 *          it should not depend on the precision (single vs. double)
00216 *          or the size of the matrix.  It must be at least zero.
00217 *          Not modified.
00218 *
00219 *  NOUNIT  INTEGER
00220 *          The FORTRAN unit number for printing out error messages
00221 *          (e.g., if a routine returns IINFO not equal to 0.)
00222 *          Not modified.
00223 *
00224 *  A       COMPLEX*16 array, dimension (LDA , max(NN))
00225 *          Used to hold the matrix whose eigenvalues are to be
00226 *          computed.  On exit, A contains the last matrix actually
00227 *          used.
00228 *          Modified.
00229 *
00230 *  LDA     INTEGER
00231 *          The leading dimension of A.  It must be at
00232 *          least 1 and at least max( NN ).
00233 *          Not modified.
00234 *
00235 *  B       COMPLEX*16 array, dimension (LDB , max(NN))
00236 *          Used to hold the Hermitian positive definite matrix for
00237 *          the generailzed problem.
00238 *          On exit, B contains the last matrix actually
00239 *          used.
00240 *          Modified.
00241 *
00242 *  LDB     INTEGER
00243 *          The leading dimension of B.  It must be at
00244 *          least 1 and at least max( NN ).
00245 *          Not modified.
00246 *
00247 *  D       DOUBLE PRECISION array, dimension (max(NN))
00248 *          The eigenvalues of A. On exit, the eigenvalues in D
00249 *          correspond with the matrix in A.
00250 *          Modified.
00251 *
00252 *  Z       COMPLEX*16 array, dimension (LDZ, max(NN))
00253 *          The matrix of eigenvectors.
00254 *          Modified.
00255 *
00256 *  LDZ     INTEGER
00257 *          The leading dimension of ZZ.  It must be at least 1 and
00258 *          at least max( NN ).
00259 *          Not modified.
00260 *
00261 *  AB      COMPLEX*16 array, dimension (LDA, max(NN))
00262 *          Workspace.
00263 *          Modified.
00264 *
00265 *  BB      COMPLEX*16 array, dimension (LDB, max(NN))
00266 *          Workspace.
00267 *          Modified.
00268 *
00269 *  AP      COMPLEX*16 array, dimension (max(NN)**2)
00270 *          Workspace.
00271 *          Modified.
00272 *
00273 *  BP      COMPLEX*16 array, dimension (max(NN)**2)
00274 *          Workspace.
00275 *          Modified.
00276 *
00277 *  WORK    COMPLEX*16 array, dimension (NWORK)
00278 *          Workspace.
00279 *          Modified.
00280 *
00281 *  NWORK   INTEGER
00282 *          The number of entries in WORK.  This must be at least
00283 *          2*N + N**2  where  N = max( NN(j), 2 ).
00284 *          Not modified.
00285 *
00286 *  RWORK   DOUBLE PRECISION array, dimension (LRWORK)
00287 *          Workspace.
00288 *          Modified.
00289 *
00290 *  LRWORK  INTEGER
00291 *          The number of entries in RWORK.  This must be at least
00292 *          max( 7*N, 1 + 4*N + 2*N*lg(N) + 3*N**2 ) where
00293 *          N = max( NN(j) ) and lg( N ) = smallest integer k such
00294 *          that 2**k >= N .
00295 *          Not modified.
00296 *
00297 *  IWORK   INTEGER array, dimension (LIWORK))
00298 *          Workspace.
00299 *          Modified.
00300 *
00301 *  LIWORK  INTEGER
00302 *          The number of entries in IWORK.  This must be at least
00303 *          2 + 5*max( NN(j) ).
00304 *          Not modified.
00305 *
00306 *  RESULT  DOUBLE PRECISION array, dimension (70)
00307 *          The values computed by the 70 tests described above.
00308 *          Modified.
00309 *
00310 *  INFO    INTEGER
00311 *          If 0, then everything ran OK.
00312 *           -1: NSIZES < 0
00313 *           -2: Some NN(j) < 0
00314 *           -3: NTYPES < 0
00315 *           -5: THRESH < 0
00316 *           -9: LDA < 1 or LDA < NMAX, where NMAX is max( NN(j) ).
00317 *          -16: LDZ < 1 or LDZ < NMAX.
00318 *          -21: NWORK too small.
00319 *          -23: LRWORK too small.
00320 *          -25: LIWORK too small.
00321 *          If  ZLATMR, CLATMS, ZHEGV, ZHPGV, ZHBGV, CHEGVD, CHPGVD,
00322 *              ZHPGVD, ZHEGVX, CHPGVX, ZHBGVX returns an error code,
00323 *              the absolute value of it is returned.
00324 *          Modified.
00325 *
00326 *-----------------------------------------------------------------------
00327 *
00328 *       Some Local Variables and Parameters:
00329 *       ---- ----- --------- --- ----------
00330 *       ZERO, ONE       Real 0 and 1.
00331 *       MAXTYP          The number of types defined.
00332 *       NTEST           The number of tests that have been run
00333 *                       on this matrix.
00334 *       NTESTT          The total number of tests for this call.
00335 *       NMAX            Largest value in NN.
00336 *       NMATS           The number of matrices generated so far.
00337 *       NERRS           The number of tests which have exceeded THRESH
00338 *                       so far (computed by DLAFTS).
00339 *       COND, IMODE     Values to be passed to the matrix generators.
00340 *       ANORM           Norm of A; passed to matrix generators.
00341 *
00342 *       OVFL, UNFL      Overflow and underflow thresholds.
00343 *       ULP, ULPINV     Finest relative precision and its inverse.
00344 *       RTOVFL, RTUNFL  Square roots of the previous 2 values.
00345 *               The following four arrays decode JTYPE:
00346 *       KTYPE(j)        The general type (1-10) for type "j".
00347 *       KMODE(j)        The MODE value to be passed to the matrix
00348 *                       generator for type "j".
00349 *       KMAGN(j)        The order of magnitude ( O(1),
00350 *                       O(overflow^(1/2) ), O(underflow^(1/2) )
00351 *
00352 *  =====================================================================
00353 *
00354 *     .. Parameters ..
00355       DOUBLE PRECISION   ZERO, ONE, TEN
00356       PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, TEN = 10.0D+0 )
00357       COMPLEX*16         CZERO, CONE
00358       PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ),
00359      $                   CONE = ( 1.0D+0, 0.0D+0 ) )
00360       INTEGER            MAXTYP
00361       PARAMETER          ( MAXTYP = 21 )
00362 *     ..
00363 *     .. Local Scalars ..
00364       LOGICAL            BADNN
00365       CHARACTER          UPLO
00366       INTEGER            I, IBTYPE, IBUPLO, IINFO, IJ, IL, IMODE, ITEMP,
00367      $                   ITYPE, IU, J, JCOL, JSIZE, JTYPE, KA, KA9, KB,
00368      $                   KB9, M, MTYPES, N, NERRS, NMATS, NMAX, NTEST,
00369      $                   NTESTT
00370       DOUBLE PRECISION   ABSTOL, ANINV, ANORM, COND, OVFL, RTOVFL,
00371      $                   RTUNFL, ULP, ULPINV, UNFL, VL, VU
00372 *     ..
00373 *     .. Local Arrays ..
00374       INTEGER            IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
00375      $                   KMAGN( MAXTYP ), KMODE( MAXTYP ),
00376      $                   KTYPE( MAXTYP )
00377 *     ..
00378 *     .. External Functions ..
00379       LOGICAL            LSAME
00380       DOUBLE PRECISION   DLAMCH, DLARND
00381       EXTERNAL           LSAME, DLAMCH, DLARND
00382 *     ..
00383 *     .. External Subroutines ..
00384       EXTERNAL           DLABAD, DLAFTS, DLASUM, XERBLA, ZHBGV, ZHBGVD,
00385      $                   ZHBGVX, ZHEGV, ZHEGVD, ZHEGVX, ZHPGV, ZHPGVD,
00386      $                   ZHPGVX, ZLACPY, ZLASET, ZLATMR, ZLATMS, ZSGT01
00387 *     ..
00388 *     .. Intrinsic Functions ..
00389       INTRINSIC          ABS, DBLE, MAX, MIN, SQRT
00390 *     ..
00391 *     .. Data statements ..
00392       DATA               KTYPE / 1, 2, 5*4, 5*5, 3*8, 6*9 /
00393       DATA               KMAGN / 2*1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
00394      $                   2, 3, 6*1 /
00395       DATA               KMODE / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
00396      $                   0, 0, 6*4 /
00397 *     ..
00398 *     .. Executable Statements ..
00399 *
00400 *     1)      Check for errors
00401 *
00402       NTESTT = 0
00403       INFO = 0
00404 *
00405       BADNN = .FALSE.
00406       NMAX = 0
00407       DO 10 J = 1, NSIZES
00408          NMAX = MAX( NMAX, NN( J ) )
00409          IF( NN( J ).LT.0 )
00410      $      BADNN = .TRUE.
00411    10 CONTINUE
00412 *
00413 *     Check for errors
00414 *
00415       IF( NSIZES.LT.0 ) THEN
00416          INFO = -1
00417       ELSE IF( BADNN ) THEN
00418          INFO = -2
00419       ELSE IF( NTYPES.LT.0 ) THEN
00420          INFO = -3
00421       ELSE IF( LDA.LE.1 .OR. LDA.LT.NMAX ) THEN
00422          INFO = -9
00423       ELSE IF( LDZ.LE.1 .OR. LDZ.LT.NMAX ) THEN
00424          INFO = -16
00425       ELSE IF( 2*MAX( NMAX, 2 )**2.GT.NWORK ) THEN
00426          INFO = -21
00427       ELSE IF( 2*MAX( NMAX, 2 )**2.GT.LRWORK ) THEN
00428          INFO = -23
00429       ELSE IF( 2*MAX( NMAX, 2 )**2.GT.LIWORK ) THEN
00430          INFO = -25
00431       END IF
00432 *
00433       IF( INFO.NE.0 ) THEN
00434          CALL XERBLA( 'ZDRVSG', -INFO )
00435          RETURN
00436       END IF
00437 *
00438 *     Quick return if possible
00439 *
00440       IF( NSIZES.EQ.0 .OR. NTYPES.EQ.0 )
00441      $   RETURN
00442 *
00443 *     More Important constants
00444 *
00445       UNFL = DLAMCH( 'Safe minimum' )
00446       OVFL = DLAMCH( 'Overflow' )
00447       CALL DLABAD( UNFL, OVFL )
00448       ULP = DLAMCH( 'Epsilon' )*DLAMCH( 'Base' )
00449       ULPINV = ONE / ULP
00450       RTUNFL = SQRT( UNFL )
00451       RTOVFL = SQRT( OVFL )
00452 *
00453       DO 20 I = 1, 4
00454          ISEED2( I ) = ISEED( I )
00455    20 CONTINUE
00456 *
00457 *     Loop over sizes, types
00458 *
00459       NERRS = 0
00460       NMATS = 0
00461 *
00462       DO 650 JSIZE = 1, NSIZES
00463          N = NN( JSIZE )
00464          ANINV = ONE / DBLE( MAX( 1, N ) )
00465 *
00466          IF( NSIZES.NE.1 ) THEN
00467             MTYPES = MIN( MAXTYP, NTYPES )
00468          ELSE
00469             MTYPES = MIN( MAXTYP+1, NTYPES )
00470          END IF
00471 *
00472          KA9 = 0
00473          KB9 = 0
00474          DO 640 JTYPE = 1, MTYPES
00475             IF( .NOT.DOTYPE( JTYPE ) )
00476      $         GO TO 640
00477             NMATS = NMATS + 1
00478             NTEST = 0
00479 *
00480             DO 30 J = 1, 4
00481                IOLDSD( J ) = ISEED( J )
00482    30       CONTINUE
00483 *
00484 *           2)      Compute "A"
00485 *
00486 *                   Control parameters:
00487 *
00488 *               KMAGN  KMODE        KTYPE
00489 *           =1  O(1)   clustered 1  zero
00490 *           =2  large  clustered 2  identity
00491 *           =3  small  exponential  (none)
00492 *           =4         arithmetic   diagonal, w/ eigenvalues
00493 *           =5         random log   hermitian, w/ eigenvalues
00494 *           =6         random       (none)
00495 *           =7                      random diagonal
00496 *           =8                      random hermitian
00497 *           =9                      banded, w/ eigenvalues
00498 *
00499             IF( MTYPES.GT.MAXTYP )
00500      $         GO TO 90
00501 *
00502             ITYPE = KTYPE( JTYPE )
00503             IMODE = KMODE( JTYPE )
00504 *
00505 *           Compute norm
00506 *
00507             GO TO ( 40, 50, 60 )KMAGN( JTYPE )
00508 *
00509    40       CONTINUE
00510             ANORM = ONE
00511             GO TO 70
00512 *
00513    50       CONTINUE
00514             ANORM = ( RTOVFL*ULP )*ANINV
00515             GO TO 70
00516 *
00517    60       CONTINUE
00518             ANORM = RTUNFL*N*ULPINV
00519             GO TO 70
00520 *
00521    70       CONTINUE
00522 *
00523             IINFO = 0
00524             COND = ULPINV
00525 *
00526 *           Special Matrices -- Identity & Jordan block
00527 *
00528             IF( ITYPE.EQ.1 ) THEN
00529 *
00530 *              Zero
00531 *
00532                KA = 0
00533                KB = 0
00534                CALL ZLASET( 'Full', LDA, N, CZERO, CZERO, A, LDA )
00535 *
00536             ELSE IF( ITYPE.EQ.2 ) THEN
00537 *
00538 *              Identity
00539 *
00540                KA = 0
00541                KB = 0
00542                CALL ZLASET( 'Full', LDA, N, CZERO, CZERO, A, LDA )
00543                DO 80 JCOL = 1, N
00544                   A( JCOL, JCOL ) = ANORM
00545    80          CONTINUE
00546 *
00547             ELSE IF( ITYPE.EQ.4 ) THEN
00548 *
00549 *              Diagonal Matrix, [Eigen]values Specified
00550 *
00551                KA = 0
00552                KB = 0
00553                CALL ZLATMS( N, N, 'S', ISEED, 'H', RWORK, IMODE, COND,
00554      $                      ANORM, 0, 0, 'N', A, LDA, WORK, IINFO )
00555 *
00556             ELSE IF( ITYPE.EQ.5 ) THEN
00557 *
00558 *              Hermitian, eigenvalues specified
00559 *
00560                KA = MAX( 0, N-1 )
00561                KB = KA
00562                CALL ZLATMS( N, N, 'S', ISEED, 'H', RWORK, IMODE, COND,
00563      $                      ANORM, N, N, 'N', A, LDA, WORK, IINFO )
00564 *
00565             ELSE IF( ITYPE.EQ.7 ) THEN
00566 *
00567 *              Diagonal, random eigenvalues
00568 *
00569                KA = 0
00570                KB = 0
00571                CALL ZLATMR( N, N, 'S', ISEED, 'H', WORK, 6, ONE, CONE,
00572      $                      'T', 'N', WORK( N+1 ), 1, ONE,
00573      $                      WORK( 2*N+1 ), 1, ONE, 'N', IDUMMA, 0, 0,
00574      $                      ZERO, ANORM, 'NO', A, LDA, IWORK, IINFO )
00575 *
00576             ELSE IF( ITYPE.EQ.8 ) THEN
00577 *
00578 *              Hermitian, random eigenvalues
00579 *
00580                KA = MAX( 0, N-1 )
00581                KB = KA
00582                CALL ZLATMR( N, N, 'S', ISEED, 'H', WORK, 6, ONE, CONE,
00583      $                      'T', 'N', WORK( N+1 ), 1, ONE,
00584      $                      WORK( 2*N+1 ), 1, ONE, 'N', IDUMMA, N, N,
00585      $                      ZERO, ANORM, 'NO', A, LDA, IWORK, IINFO )
00586 *
00587             ELSE IF( ITYPE.EQ.9 ) THEN
00588 *
00589 *              Hermitian banded, eigenvalues specified
00590 *
00591 *              The following values are used for the half-bandwidths:
00592 *
00593 *                ka = 1   kb = 1
00594 *                ka = 2   kb = 1
00595 *                ka = 2   kb = 2
00596 *                ka = 3   kb = 1
00597 *                ka = 3   kb = 2
00598 *                ka = 3   kb = 3
00599 *
00600                KB9 = KB9 + 1
00601                IF( KB9.GT.KA9 ) THEN
00602                   KA9 = KA9 + 1
00603                   KB9 = 1
00604                END IF
00605                KA = MAX( 0, MIN( N-1, KA9 ) )
00606                KB = MAX( 0, MIN( N-1, KB9 ) )
00607                CALL ZLATMS( N, N, 'S', ISEED, 'H', RWORK, IMODE, COND,
00608      $                      ANORM, KA, KA, 'N', A, LDA, WORK, IINFO )
00609 *
00610             ELSE
00611 *
00612                IINFO = 1
00613             END IF
00614 *
00615             IF( IINFO.NE.0 ) THEN
00616                WRITE( NOUNIT, FMT = 9999 )'Generator', IINFO, N, JTYPE,
00617      $            IOLDSD
00618                INFO = ABS( IINFO )
00619                RETURN
00620             END IF
00621 *
00622    90       CONTINUE
00623 *
00624             ABSTOL = UNFL + UNFL
00625             IF( N.LE.1 ) THEN
00626                IL = 1
00627                IU = N
00628             ELSE
00629                IL = 1 + ( N-1 )*DLARND( 1, ISEED2 )
00630                IU = 1 + ( N-1 )*DLARND( 1, ISEED2 )
00631                IF( IL.GT.IU ) THEN
00632                   ITEMP = IL
00633                   IL = IU
00634                   IU = ITEMP
00635                END IF
00636             END IF
00637 *
00638 *           3) Call ZHEGV, ZHPGV, ZHBGV, CHEGVD, CHPGVD, CHBGVD,
00639 *              ZHEGVX, ZHPGVX and ZHBGVX, do tests.
00640 *
00641 *           loop over the three generalized problems
00642 *                 IBTYPE = 1: A*x = (lambda)*B*x
00643 *                 IBTYPE = 2: A*B*x = (lambda)*x
00644 *                 IBTYPE = 3: B*A*x = (lambda)*x
00645 *
00646             DO 630 IBTYPE = 1, 3
00647 *
00648 *              loop over the setting UPLO
00649 *
00650                DO 620 IBUPLO = 1, 2
00651                   IF( IBUPLO.EQ.1 )
00652      $               UPLO = 'U'
00653                   IF( IBUPLO.EQ.2 )
00654      $               UPLO = 'L'
00655 *
00656 *                 Generate random well-conditioned positive definite
00657 *                 matrix B, of bandwidth not greater than that of A.
00658 *
00659                   CALL ZLATMS( N, N, 'U', ISEED, 'P', RWORK, 5, TEN,
00660      $                         ONE, KB, KB, UPLO, B, LDB, WORK( N+1 ),
00661      $                         IINFO )
00662 *
00663 *                 Test ZHEGV
00664 *
00665                   NTEST = NTEST + 1
00666 *
00667                   CALL ZLACPY( ' ', N, N, A, LDA, Z, LDZ )
00668                   CALL ZLACPY( UPLO, N, N, B, LDB, BB, LDB )
00669 *
00670                   CALL ZHEGV( IBTYPE, 'V', UPLO, N, Z, LDZ, BB, LDB, D,
00671      $                        WORK, NWORK, RWORK, IINFO )
00672                   IF( IINFO.NE.0 ) THEN
00673                      WRITE( NOUNIT, FMT = 9999 )'ZHEGV(V,' // UPLO //
00674      $                  ')', IINFO, N, JTYPE, IOLDSD
00675                      INFO = ABS( IINFO )
00676                      IF( IINFO.LT.0 ) THEN
00677                         RETURN
00678                      ELSE
00679                         RESULT( NTEST ) = ULPINV
00680                         GO TO 100
00681                      END IF
00682                   END IF
00683 *
00684 *                 Do Test
00685 *
00686                   CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
00687      $                         LDZ, D, WORK, RWORK, RESULT( NTEST ) )
00688 *
00689 *                 Test ZHEGVD
00690 *
00691                   NTEST = NTEST + 1
00692 *
00693                   CALL ZLACPY( ' ', N, N, A, LDA, Z, LDZ )
00694                   CALL ZLACPY( UPLO, N, N, B, LDB, BB, LDB )
00695 *
00696                   CALL ZHEGVD( IBTYPE, 'V', UPLO, N, Z, LDZ, BB, LDB, D,
00697      $                         WORK, NWORK, RWORK, LRWORK, IWORK,
00698      $                         LIWORK, IINFO )
00699                   IF( IINFO.NE.0 ) THEN
00700                      WRITE( NOUNIT, FMT = 9999 )'ZHEGVD(V,' // UPLO //
00701      $                  ')', IINFO, N, JTYPE, IOLDSD
00702                      INFO = ABS( IINFO )
00703                      IF( IINFO.LT.0 ) THEN
00704                         RETURN
00705                      ELSE
00706                         RESULT( NTEST ) = ULPINV
00707                         GO TO 100
00708                      END IF
00709                   END IF
00710 *
00711 *                 Do Test
00712 *
00713                   CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
00714      $                         LDZ, D, WORK, RWORK, RESULT( NTEST ) )
00715 *
00716 *                 Test ZHEGVX
00717 *
00718                   NTEST = NTEST + 1
00719 *
00720                   CALL ZLACPY( ' ', N, N, A, LDA, AB, LDA )
00721                   CALL ZLACPY( UPLO, N, N, B, LDB, BB, LDB )
00722 *
00723                   CALL ZHEGVX( IBTYPE, 'V', 'A', UPLO, N, AB, LDA, BB,
00724      $                         LDB, VL, VU, IL, IU, ABSTOL, M, D, Z,
00725      $                         LDZ, WORK, NWORK, RWORK, IWORK( N+1 ),
00726      $                         IWORK, IINFO )
00727                   IF( IINFO.NE.0 ) THEN
00728                      WRITE( NOUNIT, FMT = 9999 )'ZHEGVX(V,A' // UPLO //
00729      $                  ')', IINFO, N, JTYPE, IOLDSD
00730                      INFO = ABS( IINFO )
00731                      IF( IINFO.LT.0 ) THEN
00732                         RETURN
00733                      ELSE
00734                         RESULT( NTEST ) = ULPINV
00735                         GO TO 100
00736                      END IF
00737                   END IF
00738 *
00739 *                 Do Test
00740 *
00741                   CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
00742      $                         LDZ, D, WORK, RWORK, RESULT( NTEST ) )
00743 *
00744                   NTEST = NTEST + 1
00745 *
00746                   CALL ZLACPY( ' ', N, N, A, LDA, AB, LDA )
00747                   CALL ZLACPY( UPLO, N, N, B, LDB, BB, LDB )
00748 *
00749 *                 since we do not know the exact eigenvalues of this
00750 *                 eigenpair, we just set VL and VU as constants.
00751 *                 It is quite possible that there are no eigenvalues
00752 *                 in this interval.
00753 *
00754                   VL = ZERO
00755                   VU = ANORM
00756                   CALL ZHEGVX( IBTYPE, 'V', 'V', UPLO, N, AB, LDA, BB,
00757      $                         LDB, VL, VU, IL, IU, ABSTOL, M, D, Z,
00758      $                         LDZ, WORK, NWORK, RWORK, IWORK( N+1 ),
00759      $                         IWORK, IINFO )
00760                   IF( IINFO.NE.0 ) THEN
00761                      WRITE( NOUNIT, FMT = 9999 )'ZHEGVX(V,V,' //
00762      $                  UPLO // ')', IINFO, N, JTYPE, IOLDSD
00763                      INFO = ABS( IINFO )
00764                      IF( IINFO.LT.0 ) THEN
00765                         RETURN
00766                      ELSE
00767                         RESULT( NTEST ) = ULPINV
00768                         GO TO 100
00769                      END IF
00770                   END IF
00771 *
00772 *                 Do Test
00773 *
00774                   CALL ZSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
00775      $                         LDZ, D, WORK, RWORK, RESULT( NTEST ) )
00776 *
00777                   NTEST = NTEST + 1
00778 *
00779                   CALL ZLACPY( ' ', N, N, A, LDA, AB, LDA )
00780                   CALL ZLACPY( UPLO, N, N, B, LDB, BB, LDB )
00781 *
00782                   CALL ZHEGVX( IBTYPE, 'V', 'I', UPLO, N, AB, LDA, BB,
00783      $                         LDB, VL, VU, IL, IU, ABSTOL, M, D, Z,
00784      $                         LDZ, WORK, NWORK, RWORK, IWORK( N+1 ),
00785      $                         IWORK, IINFO )
00786                   IF( IINFO.NE.0 ) THEN
00787                      WRITE( NOUNIT, FMT = 9999 )'ZHEGVX(V,I,' //
00788      $                  UPLO // ')', IINFO, N, JTYPE, IOLDSD
00789                      INFO = ABS( IINFO )
00790                      IF( IINFO.LT.0 ) THEN
00791                         RETURN
00792                      ELSE
00793                         RESULT( NTEST ) = ULPINV
00794                         GO TO 100
00795                      END IF
00796                   END IF
00797 *
00798 *                 Do Test
00799 *
00800                   CALL ZSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
00801      $                         LDZ, D, WORK, RWORK, RESULT( NTEST ) )
00802 *
00803   100             CONTINUE
00804 *
00805 *                 Test ZHPGV
00806 *
00807                   NTEST = NTEST + 1
00808 *
00809 *                 Copy the matrices into packed storage.
00810 *
00811                   IF( LSAME( UPLO, 'U' ) ) THEN
00812                      IJ = 1
00813                      DO 120 J = 1, N
00814                         DO 110 I = 1, J
00815                            AP( IJ ) = A( I, J )
00816                            BP( IJ ) = B( I, J )
00817                            IJ = IJ + 1
00818   110                   CONTINUE
00819   120                CONTINUE
00820                   ELSE
00821                      IJ = 1
00822                      DO 140 J = 1, N
00823                         DO 130 I = J, N
00824                            AP( IJ ) = A( I, J )
00825                            BP( IJ ) = B( I, J )
00826                            IJ = IJ + 1
00827   130                   CONTINUE
00828   140                CONTINUE
00829                   END IF
00830 *
00831                   CALL ZHPGV( IBTYPE, 'V', UPLO, N, AP, BP, D, Z, LDZ,
00832      $                        WORK, RWORK, IINFO )
00833                   IF( IINFO.NE.0 ) THEN
00834                      WRITE( NOUNIT, FMT = 9999 )'ZHPGV(V,' // UPLO //
00835      $                  ')', IINFO, N, JTYPE, IOLDSD
00836                      INFO = ABS( IINFO )
00837                      IF( IINFO.LT.0 ) THEN
00838                         RETURN
00839                      ELSE
00840                         RESULT( NTEST ) = ULPINV
00841                         GO TO 310
00842                      END IF
00843                   END IF
00844 *
00845 *                 Do Test
00846 *
00847                   CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
00848      $                         LDZ, D, WORK, RWORK, RESULT( NTEST ) )
00849 *
00850 *                 Test ZHPGVD
00851 *
00852                   NTEST = NTEST + 1
00853 *
00854 *                 Copy the matrices into packed storage.
00855 *
00856                   IF( LSAME( UPLO, 'U' ) ) THEN
00857                      IJ = 1
00858                      DO 160 J = 1, N
00859                         DO 150 I = 1, J
00860                            AP( IJ ) = A( I, J )
00861                            BP( IJ ) = B( I, J )
00862                            IJ = IJ + 1
00863   150                   CONTINUE
00864   160                CONTINUE
00865                   ELSE
00866                      IJ = 1
00867                      DO 180 J = 1, N
00868                         DO 170 I = J, N
00869                            AP( IJ ) = A( I, J )
00870                            BP( IJ ) = B( I, J )
00871                            IJ = IJ + 1
00872   170                   CONTINUE
00873   180                CONTINUE
00874                   END IF
00875 *
00876                   CALL ZHPGVD( IBTYPE, 'V', UPLO, N, AP, BP, D, Z, LDZ,
00877      $                         WORK, NWORK, RWORK, LRWORK, IWORK,
00878      $                         LIWORK, IINFO )
00879                   IF( IINFO.NE.0 ) THEN
00880                      WRITE( NOUNIT, FMT = 9999 )'ZHPGVD(V,' // UPLO //
00881      $                  ')', IINFO, N, JTYPE, IOLDSD
00882                      INFO = ABS( IINFO )
00883                      IF( IINFO.LT.0 ) THEN
00884                         RETURN
00885                      ELSE
00886                         RESULT( NTEST ) = ULPINV
00887                         GO TO 310
00888                      END IF
00889                   END IF
00890 *
00891 *                 Do Test
00892 *
00893                   CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
00894      $                         LDZ, D, WORK, RWORK, RESULT( NTEST ) )
00895 *
00896 *                 Test ZHPGVX
00897 *
00898                   NTEST = NTEST + 1
00899 *
00900 *                 Copy the matrices into packed storage.
00901 *
00902                   IF( LSAME( UPLO, 'U' ) ) THEN
00903                      IJ = 1
00904                      DO 200 J = 1, N
00905                         DO 190 I = 1, J
00906                            AP( IJ ) = A( I, J )
00907                            BP( IJ ) = B( I, J )
00908                            IJ = IJ + 1
00909   190                   CONTINUE
00910   200                CONTINUE
00911                   ELSE
00912                      IJ = 1
00913                      DO 220 J = 1, N
00914                         DO 210 I = J, N
00915                            AP( IJ ) = A( I, J )
00916                            BP( IJ ) = B( I, J )
00917                            IJ = IJ + 1
00918   210                   CONTINUE
00919   220                CONTINUE
00920                   END IF
00921 *
00922                   CALL ZHPGVX( IBTYPE, 'V', 'A', UPLO, N, AP, BP, VL,
00923      $                         VU, IL, IU, ABSTOL, M, D, Z, LDZ, WORK,
00924      $                         RWORK, IWORK( N+1 ), IWORK, INFO )
00925                   IF( IINFO.NE.0 ) THEN
00926                      WRITE( NOUNIT, FMT = 9999 )'ZHPGVX(V,A' // UPLO //
00927      $                  ')', IINFO, N, JTYPE, IOLDSD
00928                      INFO = ABS( IINFO )
00929                      IF( IINFO.LT.0 ) THEN
00930                         RETURN
00931                      ELSE
00932                         RESULT( NTEST ) = ULPINV
00933                         GO TO 310
00934                      END IF
00935                   END IF
00936 *
00937 *                 Do Test
00938 *
00939                   CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
00940      $                         LDZ, D, WORK, RWORK, RESULT( NTEST ) )
00941 *
00942                   NTEST = NTEST + 1
00943 *
00944 *                 Copy the matrices into packed storage.
00945 *
00946                   IF( LSAME( UPLO, 'U' ) ) THEN
00947                      IJ = 1
00948                      DO 240 J = 1, N
00949                         DO 230 I = 1, J
00950                            AP( IJ ) = A( I, J )
00951                            BP( IJ ) = B( I, J )
00952                            IJ = IJ + 1
00953   230                   CONTINUE
00954   240                CONTINUE
00955                   ELSE
00956                      IJ = 1
00957                      DO 260 J = 1, N
00958                         DO 250 I = J, N
00959                            AP( IJ ) = A( I, J )
00960                            BP( IJ ) = B( I, J )
00961                            IJ = IJ + 1
00962   250                   CONTINUE
00963   260                CONTINUE
00964                   END IF
00965 *
00966                   VL = ZERO
00967                   VU = ANORM
00968                   CALL ZHPGVX( IBTYPE, 'V', 'V', UPLO, N, AP, BP, VL,
00969      $                         VU, IL, IU, ABSTOL, M, D, Z, LDZ, WORK,
00970      $                         RWORK, IWORK( N+1 ), IWORK, INFO )
00971                   IF( IINFO.NE.0 ) THEN
00972                      WRITE( NOUNIT, FMT = 9999 )'ZHPGVX(V,V' // UPLO //
00973      $                  ')', IINFO, N, JTYPE, IOLDSD
00974                      INFO = ABS( IINFO )
00975                      IF( IINFO.LT.0 ) THEN
00976                         RETURN
00977                      ELSE
00978                         RESULT( NTEST ) = ULPINV
00979                         GO TO 310
00980                      END IF
00981                   END IF
00982 *
00983 *                 Do Test
00984 *
00985                   CALL ZSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
00986      $                         LDZ, D, WORK, RWORK, RESULT( NTEST ) )
00987 *
00988                   NTEST = NTEST + 1
00989 *
00990 *                 Copy the matrices into packed storage.
00991 *
00992                   IF( LSAME( UPLO, 'U' ) ) THEN
00993                      IJ = 1
00994                      DO 280 J = 1, N
00995                         DO 270 I = 1, J
00996                            AP( IJ ) = A( I, J )
00997                            BP( IJ ) = B( I, J )
00998                            IJ = IJ + 1
00999   270                   CONTINUE
01000   280                CONTINUE
01001                   ELSE
01002                      IJ = 1
01003                      DO 300 J = 1, N
01004                         DO 290 I = J, N
01005                            AP( IJ ) = A( I, J )
01006                            BP( IJ ) = B( I, J )
01007                            IJ = IJ + 1
01008   290                   CONTINUE
01009   300                CONTINUE
01010                   END IF
01011 *
01012                   CALL ZHPGVX( IBTYPE, 'V', 'I', UPLO, N, AP, BP, VL,
01013      $                         VU, IL, IU, ABSTOL, M, D, Z, LDZ, WORK,
01014      $                         RWORK, IWORK( N+1 ), IWORK, INFO )
01015                   IF( IINFO.NE.0 ) THEN
01016                      WRITE( NOUNIT, FMT = 9999 )'ZHPGVX(V,I' // UPLO //
01017      $                  ')', IINFO, N, JTYPE, IOLDSD
01018                      INFO = ABS( IINFO )
01019                      IF( IINFO.LT.0 ) THEN
01020                         RETURN
01021                      ELSE
01022                         RESULT( NTEST ) = ULPINV
01023                         GO TO 310
01024                      END IF
01025                   END IF
01026 *
01027 *                 Do Test
01028 *
01029                   CALL ZSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
01030      $                         LDZ, D, WORK, RWORK, RESULT( NTEST ) )
01031 *
01032   310             CONTINUE
01033 *
01034                   IF( IBTYPE.EQ.1 ) THEN
01035 *
01036 *                    TEST ZHBGV
01037 *
01038                      NTEST = NTEST + 1
01039 *
01040 *                    Copy the matrices into band storage.
01041 *
01042                      IF( LSAME( UPLO, 'U' ) ) THEN
01043                         DO 340 J = 1, N
01044                            DO 320 I = MAX( 1, J-KA ), J
01045                               AB( KA+1+I-J, J ) = A( I, J )
01046   320                      CONTINUE
01047                            DO 330 I = MAX( 1, J-KB ), J
01048                               BB( KB+1+I-J, J ) = B( I, J )
01049   330                      CONTINUE
01050   340                   CONTINUE
01051                      ELSE
01052                         DO 370 J = 1, N
01053                            DO 350 I = J, MIN( N, J+KA )
01054                               AB( 1+I-J, J ) = A( I, J )
01055   350                      CONTINUE
01056                            DO 360 I = J, MIN( N, J+KB )
01057                               BB( 1+I-J, J ) = B( I, J )
01058   360                      CONTINUE
01059   370                   CONTINUE
01060                      END IF
01061 *
01062                      CALL ZHBGV( 'V', UPLO, N, KA, KB, AB, LDA, BB, LDB,
01063      $                           D, Z, LDZ, WORK, RWORK, IINFO )
01064                      IF( IINFO.NE.0 ) THEN
01065                         WRITE( NOUNIT, FMT = 9999 )'ZHBGV(V,' //
01066      $                     UPLO // ')', IINFO, N, JTYPE, IOLDSD
01067                         INFO = ABS( IINFO )
01068                         IF( IINFO.LT.0 ) THEN
01069                            RETURN
01070                         ELSE
01071                            RESULT( NTEST ) = ULPINV
01072                            GO TO 620
01073                         END IF
01074                      END IF
01075 *
01076 *                    Do Test
01077 *
01078                      CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
01079      $                            LDZ, D, WORK, RWORK, RESULT( NTEST ) )
01080 *
01081 *                    TEST ZHBGVD
01082 *
01083                      NTEST = NTEST + 1
01084 *
01085 *                    Copy the matrices into band storage.
01086 *
01087                      IF( LSAME( UPLO, 'U' ) ) THEN
01088                         DO 400 J = 1, N
01089                            DO 380 I = MAX( 1, J-KA ), J
01090                               AB( KA+1+I-J, J ) = A( I, J )
01091   380                      CONTINUE
01092                            DO 390 I = MAX( 1, J-KB ), J
01093                               BB( KB+1+I-J, J ) = B( I, J )
01094   390                      CONTINUE
01095   400                   CONTINUE
01096                      ELSE
01097                         DO 430 J = 1, N
01098                            DO 410 I = J, MIN( N, J+KA )
01099                               AB( 1+I-J, J ) = A( I, J )
01100   410                      CONTINUE
01101                            DO 420 I = J, MIN( N, J+KB )
01102                               BB( 1+I-J, J ) = B( I, J )
01103   420                      CONTINUE
01104   430                   CONTINUE
01105                      END IF
01106 *
01107                      CALL ZHBGVD( 'V', UPLO, N, KA, KB, AB, LDA, BB,
01108      $                            LDB, D, Z, LDZ, WORK, NWORK, RWORK,
01109      $                            LRWORK, IWORK, LIWORK, IINFO )
01110                      IF( IINFO.NE.0 ) THEN
01111                         WRITE( NOUNIT, FMT = 9999 )'ZHBGVD(V,' //
01112      $                     UPLO // ')', IINFO, N, JTYPE, IOLDSD
01113                         INFO = ABS( IINFO )
01114                         IF( IINFO.LT.0 ) THEN
01115                            RETURN
01116                         ELSE
01117                            RESULT( NTEST ) = ULPINV
01118                            GO TO 620
01119                         END IF
01120                      END IF
01121 *
01122 *                    Do Test
01123 *
01124                      CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
01125      $                            LDZ, D, WORK, RWORK, RESULT( NTEST ) )
01126 *
01127 *                    Test ZHBGVX
01128 *
01129                      NTEST = NTEST + 1
01130 *
01131 *                    Copy the matrices into band storage.
01132 *
01133                      IF( LSAME( UPLO, 'U' ) ) THEN
01134                         DO 460 J = 1, N
01135                            DO 440 I = MAX( 1, J-KA ), J
01136                               AB( KA+1+I-J, J ) = A( I, J )
01137   440                      CONTINUE
01138                            DO 450 I = MAX( 1, J-KB ), J
01139                               BB( KB+1+I-J, J ) = B( I, J )
01140   450                      CONTINUE
01141   460                   CONTINUE
01142                      ELSE
01143                         DO 490 J = 1, N
01144                            DO 470 I = J, MIN( N, J+KA )
01145                               AB( 1+I-J, J ) = A( I, J )
01146   470                      CONTINUE
01147                            DO 480 I = J, MIN( N, J+KB )
01148                               BB( 1+I-J, J ) = B( I, J )
01149   480                      CONTINUE
01150   490                   CONTINUE
01151                      END IF
01152 *
01153                      CALL ZHBGVX( 'V', 'A', UPLO, N, KA, KB, AB, LDA,
01154      $                            BB, LDB, BP, MAX( 1, N ), VL, VU, IL,
01155      $                            IU, ABSTOL, M, D, Z, LDZ, WORK, RWORK,
01156      $                            IWORK( N+1 ), IWORK, IINFO )
01157                      IF( IINFO.NE.0 ) THEN
01158                         WRITE( NOUNIT, FMT = 9999 )'ZHBGVX(V,A' //
01159      $                     UPLO // ')', IINFO, N, JTYPE, IOLDSD
01160                         INFO = ABS( IINFO )
01161                         IF( IINFO.LT.0 ) THEN
01162                            RETURN
01163                         ELSE
01164                            RESULT( NTEST ) = ULPINV
01165                            GO TO 620
01166                         END IF
01167                      END IF
01168 *
01169 *                    Do Test
01170 *
01171                      CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
01172      $                            LDZ, D, WORK, RWORK, RESULT( NTEST ) )
01173 *
01174                      NTEST = NTEST + 1
01175 *
01176 *                    Copy the matrices into band storage.
01177 *
01178                      IF( LSAME( UPLO, 'U' ) ) THEN
01179                         DO 520 J = 1, N
01180                            DO 500 I = MAX( 1, J-KA ), J
01181                               AB( KA+1+I-J, J ) = A( I, J )
01182   500                      CONTINUE
01183                            DO 510 I = MAX( 1, J-KB ), J
01184                               BB( KB+1+I-J, J ) = B( I, J )
01185   510                      CONTINUE
01186   520                   CONTINUE
01187                      ELSE
01188                         DO 550 J = 1, N
01189                            DO 530 I = J, MIN( N, J+KA )
01190                               AB( 1+I-J, J ) = A( I, J )
01191   530                      CONTINUE
01192                            DO 540 I = J, MIN( N, J+KB )
01193                               BB( 1+I-J, J ) = B( I, J )
01194   540                      CONTINUE
01195   550                   CONTINUE
01196                      END IF
01197 *
01198                      VL = ZERO
01199                      VU = ANORM
01200                      CALL ZHBGVX( 'V', 'V', UPLO, N, KA, KB, AB, LDA,
01201      $                            BB, LDB, BP, MAX( 1, N ), VL, VU, IL,
01202      $                            IU, ABSTOL, M, D, Z, LDZ, WORK, RWORK,
01203      $                            IWORK( N+1 ), IWORK, IINFO )
01204                      IF( IINFO.NE.0 ) THEN
01205                         WRITE( NOUNIT, FMT = 9999 )'ZHBGVX(V,V' //
01206      $                     UPLO // ')', IINFO, N, JTYPE, IOLDSD
01207                         INFO = ABS( IINFO )
01208                         IF( IINFO.LT.0 ) THEN
01209                            RETURN
01210                         ELSE
01211                            RESULT( NTEST ) = ULPINV
01212                            GO TO 620
01213                         END IF
01214                      END IF
01215 *
01216 *                    Do Test
01217 *
01218                      CALL ZSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
01219      $                            LDZ, D, WORK, RWORK, RESULT( NTEST ) )
01220 *
01221                      NTEST = NTEST + 1
01222 *
01223 *                    Copy the matrices into band storage.
01224 *
01225                      IF( LSAME( UPLO, 'U' ) ) THEN
01226                         DO 580 J = 1, N
01227                            DO 560 I = MAX( 1, J-KA ), J
01228                               AB( KA+1+I-J, J ) = A( I, J )
01229   560                      CONTINUE
01230                            DO 570 I = MAX( 1, J-KB ), J
01231                               BB( KB+1+I-J, J ) = B( I, J )
01232   570                      CONTINUE
01233   580                   CONTINUE
01234                      ELSE
01235                         DO 610 J = 1, N
01236                            DO 590 I = J, MIN( N, J+KA )
01237                               AB( 1+I-J, J ) = A( I, J )
01238   590                      CONTINUE
01239                            DO 600 I = J, MIN( N, J+KB )
01240                               BB( 1+I-J, J ) = B( I, J )
01241   600                      CONTINUE
01242   610                   CONTINUE
01243                      END IF
01244 *
01245                      CALL ZHBGVX( 'V', 'I', UPLO, N, KA, KB, AB, LDA,
01246      $                            BB, LDB, BP, MAX( 1, N ), VL, VU, IL,
01247      $                            IU, ABSTOL, M, D, Z, LDZ, WORK, RWORK,
01248      $                            IWORK( N+1 ), IWORK, IINFO )
01249                      IF( IINFO.NE.0 ) THEN
01250                         WRITE( NOUNIT, FMT = 9999 )'ZHBGVX(V,I' //
01251      $                     UPLO // ')', IINFO, N, JTYPE, IOLDSD
01252                         INFO = ABS( IINFO )
01253                         IF( IINFO.LT.0 ) THEN
01254                            RETURN
01255                         ELSE
01256                            RESULT( NTEST ) = ULPINV
01257                            GO TO 620
01258                         END IF
01259                      END IF
01260 *
01261 *                    Do Test
01262 *
01263                      CALL ZSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
01264      $                            LDZ, D, WORK, RWORK, RESULT( NTEST ) )
01265 *
01266                   END IF
01267 *
01268   620          CONTINUE
01269   630       CONTINUE
01270 *
01271 *           End of Loop -- Check for RESULT(j) > THRESH
01272 *
01273             NTESTT = NTESTT + NTEST
01274             CALL DLAFTS( 'ZSG', N, N, JTYPE, NTEST, RESULT, IOLDSD,
01275      $                   THRESH, NOUNIT, NERRS )
01276   640    CONTINUE
01277   650 CONTINUE
01278 *
01279 *     Summary
01280 *
01281       CALL DLASUM( 'ZSG', NOUNIT, NERRS, NTESTT )
01282 *
01283       RETURN
01284 *
01285  9999 FORMAT( ' ZDRVSG: ', A, ' returned INFO=', I6, '.', / 9X, 'N=',
01286      $      I6, ', JTYPE=', I6, ', ISEED=(', 3( I5, ',' ), I5, ')' )
01287 *
01288 *     End of ZDRVSG
01289 *
01290       END
 All Files Functions