1       SUBROUTINE CCHKST( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
   2      $                   NOUNIT, A, LDA, AP, SD, SE, D1, D2, D3, D4, D5,
   3      $                   WA1, WA2, WA3, WR, U, LDU, V, VP, TAU, Z, WORK,
   4      $                   LWORK, RWORK, LRWORK, IWORK, LIWORK, RESULT,
   5      $                   INFO )
   6       IMPLICIT NONE
   7 *
   8 *  -- LAPACK test routine (version 3.1) --
   9 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
  10 *     November 2006
  11 *
  12 *     .. Scalar Arguments ..
  13       INTEGER            INFO, LDA, LDU, LIWORK, LRWORK, LWORK, NOUNIT,
  14      $                   NSIZES, NTYPES
  15       REAL               THRESH
  16 *     ..
  17 *     .. Array Arguments ..
  18       LOGICAL            DOTYPE( * )
  19       INTEGER            ISEED( 4 ), IWORK( * ), NN( * )
  20       REAL               D1( * ), D2( * ), D3( * ), D4( * ), D5( * ),
  21      $                   RESULT* ), RWORK( * ), SD( * ), SE( * ),
  22      $                   WA1( * ), WA2( * ), WA3( * ), WR( * )
  23       COMPLEX            A( LDA, * ), AP( * ), TAU( * ), U( LDU, * ),
  24      $                   V( LDU, * ), VP( * ), WORK( * ), Z( LDU, * )
  25 *     ..
  26 *
  27 *  Purpose
  28 *  =======
  29 *
  30 *  CCHKST  checks the Hermitian eigenvalue problem routines.
  31 *
  32 *     CHETRD factors A as  U S U* , where * means conjugate transpose,
  33 *     S is real symmetric tridiagonal, and U is unitary.
  34 *     CHETRD can use either just the lower or just the upper triangle
  35 *     of A; CCHKST checks both cases.
  36 *     U is represented as a product of Householder
  37 *     transformations, whose vectors are stored in the first
  38 *     n-1 columns of V, and whose scale factors are in TAU.
  39 *
  40 *     CHPTRD does the same as CHETRD, except that A and V are stored
  41 *     in "packed" format.
  42 *
  43 *     CUNGTR constructs the matrix U from the contents of V and TAU.
  44 *
  45 *     CUPGTR constructs the matrix U from the contents of VP and TAU.
  46 *
  47 *     CSTEQR factors S as  Z D1 Z* , where Z is the unitary
  48 *     matrix of eigenvectors and D1 is a diagonal matrix with
  49 *     the eigenvalues on the diagonal.  D2 is the matrix of
  50 *     eigenvalues computed when Z is not computed.
  51 *
  52 *     SSTERF computes D3, the matrix of eigenvalues, by the
  53 *     PWK method, which does not yield eigenvectors.
  54 *
  55 *     CPTEQR factors S as  Z4 D4 Z4* , for a
  56 *     Hermitian positive definite tridiagonal matrix.
  57 *     D5 is the matrix of eigenvalues computed when Z is not
  58 *     computed.
  59 *
  60 *     SSTEBZ computes selected eigenvalues.  WA1, WA2, and
  61 *     WA3 will denote eigenvalues computed to high
  62 *     absolute accuracy, with different range options.
  63 *     WR will denote eigenvalues computed to high relative
  64 *     accuracy.
  65 *
  66 *     CSTEIN computes Y, the eigenvectors of S, given the
  67 *     eigenvalues.
  68 *
  69 *     CSTEDC factors S as Z D1 Z* , where Z is the unitary
  70 *     matrix of eigenvectors and D1 is a diagonal matrix with
  71 *     the eigenvalues on the diagonal ('I' option). It may also
  72 *     update an input unitary matrix, usually the output
  73 *     from CHETRD/CUNGTR or CHPTRD/CUPGTR ('V' option). It may
  74 *     also just compute eigenvalues ('N' option).
  75 *
  76 *     CSTEMR factors S as Z D1 Z* , where Z is the unitary
  77 *     matrix of eigenvectors and D1 is a diagonal matrix with
  78 *     the eigenvalues on the diagonal ('I' option).  CSTEMR
  79 *     uses the Relatively Robust Representation whenever possible.
  80 *
  81 *  When CCHKST is called, a number of matrix "sizes" ("n's") and a
  82 *  number of matrix "types" are specified.  For each size ("n")
  83 *  and each type of matrix, one matrix will be generated and used
  84 *  to test the Hermitian eigenroutines.  For each matrix, a number
  85 *  of tests will be performed:
  86 *
  87 *  (1)     | A - V S V* | / ( |A| n ulp ) CHETRD( UPLO='U', ... )
  88 *
  89 *  (2)     | I - UV* | / ( n ulp )        CUNGTR( UPLO='U', ... )
  90 *
  91 *  (3)     | A - V S V* | / ( |A| n ulp ) CHETRD( UPLO='L', ... )
  92 *
  93 *  (4)     | I - UV* | / ( n ulp )        CUNGTR( UPLO='L', ... )
  94 *
  95 *  (5-8)   Same as 1-4, but for CHPTRD and CUPGTR.
  96 *
  97 *  (9)     | S - Z D Z* | / ( |S| n ulp ) CSTEQR('V',...)
  98 *
  99 *  (10)    | I - ZZ* | / ( n ulp )        CSTEQR('V',...)
 100 *
 101 *  (11)    | D1 - D2 | / ( |D1| ulp )        CSTEQR('N',...)
 102 *
 103 *  (12)    | D1 - D3 | / ( |D1| ulp )        SSTERF
 104 *
 105 *  (13)    0 if the true eigenvalues (computed by sturm count)
 106 *          of S are within THRESH of
 107 *          those in D1.  2*THRESH if they are not.  (Tested using
 108 *          SSTECH)
 109 *
 110 *  For S positive definite,
 111 *
 112 *  (14)    | S - Z4 D4 Z4* | / ( |S| n ulp ) CPTEQR('V',...)
 113 *
 114 *  (15)    | I - Z4 Z4* | / ( n ulp )        CPTEQR('V',...)
 115 *
 116 *  (16)    | D4 - D5 | / ( 100 |D4| ulp )       CPTEQR('N',...)
 117 *
 118 *  When S is also diagonally dominant by the factor gamma < 1,
 119 *
 120 *  (17)    max | D4(i) - WR(i) | / ( |D4(i)| omega ) ,
 121 *           i
 122 *          omega = 2 (2n-1) ULP (1 + 8 gamma**2) / (1 - gamma)**4
 123 *                                               SSTEBZ( 'A', 'E', ...)
 124 *
 125 *  (18)    | WA1 - D3 | / ( |D3| ulp )          SSTEBZ( 'A', 'E', ...)
 126 *
 127 *  (19)    ( max { min | WA2(i)-WA3(j) | } +
 128 *             i     j
 129 *            max { min | WA3(i)-WA2(j) | } ) / ( |D3| ulp )
 130 *             i     j
 131 *                                               SSTEBZ( 'I', 'E', ...)
 132 *
 133 *  (20)    | S - Y WA1 Y* | / ( |S| n ulp )  SSTEBZ, CSTEIN
 134 *
 135 *  (21)    | I - Y Y* | / ( n ulp )          SSTEBZ, CSTEIN
 136 *
 137 *  (22)    | S - Z D Z* | / ( |S| n ulp )    CSTEDC('I')
 138 *
 139 *  (23)    | I - ZZ* | / ( n ulp )           CSTEDC('I')
 140 *
 141 *  (24)    | S - Z D Z* | / ( |S| n ulp )    CSTEDC('V')
 142 *
 143 *  (25)    | I - ZZ* | / ( n ulp )           CSTEDC('V')
 144 *
 145 *  (26)    | D1 - D2 | / ( |D1| ulp )           CSTEDC('V') and
 146 *                                               CSTEDC('N')
 147 *
 148 *  Test 27 is disabled at the moment because CSTEMR does not
 149 *  guarantee high relatvie accuracy.
 150 *
 151 *  (27)    max | D6(i) - WR(i) | / ( |D6(i)| omega ) ,
 152 *           i
 153 *          omega = 2 (2n-1) ULP (1 + 8 gamma**2) / (1 - gamma)**4
 154 *                                               CSTEMR('V', 'A')
 155 *
 156 *  (28)    max | D6(i) - WR(i) | / ( |D6(i)| omega ) ,
 157 *           i
 158 *          omega = 2 (2n-1) ULP (1 + 8 gamma**2) / (1 - gamma)**4
 159 *                                               CSTEMR('V', 'I')
 160 *
 161 *  Tests 29 through 34 are disable at present because CSTEMR
 162 *  does not handle partial specturm requests.
 163 *
 164 *  (29)    | S - Z D Z* | / ( |S| n ulp )    CSTEMR('V', 'I')
 165 *
 166 *  (30)    | I - ZZ* | / ( n ulp )           CSTEMR('V', 'I')
 167 *
 168 *  (31)    ( max { min | WA2(i)-WA3(j) | } +
 169 *             i     j
 170 *            max { min | WA3(i)-WA2(j) | } ) / ( |D3| ulp )
 171 *             i     j
 172 *          CSTEMR('N', 'I') vs. CSTEMR('V', 'I')
 173 *
 174 *  (32)    | S - Z D Z* | / ( |S| n ulp )    CSTEMR('V', 'V')
 175 *
 176 *  (33)    | I - ZZ* | / ( n ulp )           CSTEMR('V', 'V')
 177 *
 178 *  (34)    ( max { min | WA2(i)-WA3(j) | } +
 179 *             i     j
 180 *            max { min | WA3(i)-WA2(j) | } ) / ( |D3| ulp )
 181 *             i     j
 182 *          CSTEMR('N', 'V') vs. CSTEMR('V', 'V')
 183 *
 184 *  (35)    | S - Z D Z* | / ( |S| n ulp )    CSTEMR('V', 'A')
 185 *
 186 *  (36)    | I - ZZ* | / ( n ulp )           CSTEMR('V', 'A')
 187 *
 188 *  (37)    ( max { min | WA2(i)-WA3(j) | } +
 189 *             i     j
 190 *            max { min | WA3(i)-WA2(j) | } ) / ( |D3| ulp )
 191 *             i     j
 192 *          CSTEMR('N', 'A') vs. CSTEMR('V', 'A')
 193 *
 194 *  The "sizes" are specified by an array NN(1:NSIZES); the value of
 195 *  each element NN(j) specifies one size.
 196 *  The "types" are specified by a logical array DOTYPE( 1:NTYPES );
 197 *  if DOTYPE(j) is .TRUE., then matrix type "j" will be generated.
 198 *  Currently, the list of possible types is:
 199 *
 200 *  (1)  The zero matrix.
 201 *  (2)  The identity matrix.
 202 *
 203 *  (3)  A diagonal matrix with evenly spaced entries
 204 *       1, ..., ULP  and random signs.
 205 *       (ULP = (first number larger than 1) - 1 )
 206 *  (4)  A diagonal matrix with geometrically spaced entries
 207 *       1, ..., ULP  and random signs.
 208 *  (5)  A diagonal matrix with "clustered" entries 1, ULP, ..., ULP
 209 *       and random signs.
 210 *
 211 *  (6)  Same as (4), but multiplied by SQRT( overflow threshold )
 212 *  (7)  Same as (4), but multiplied by SQRT( underflow threshold )
 213 *
 214 *  (8)  A matrix of the form  U* D U, where U is unitary and
 215 *       D has evenly spaced entries 1, ..., ULP with random signs
 216 *       on the diagonal.
 217 *
 218 *  (9)  A matrix of the form  U* D U, where U is unitary and
 219 *       D has geometrically spaced entries 1, ..., ULP with random
 220 *       signs on the diagonal.
 221 *
 222 *  (10) A matrix of the form  U* D U, where U is unitary and
 223 *       D has "clustered" entries 1, ULP,..., ULP with random
 224 *       signs on the diagonal.
 225 *
 226 *  (11) Same as (8), but multiplied by SQRT( overflow threshold )
 227 *  (12) Same as (8), but multiplied by SQRT( underflow threshold )
 228 *
 229 *  (13) Hermitian matrix with random entries chosen from (-1,1).
 230 *  (14) Same as (13), but multiplied by SQRT( overflow threshold )
 231 *  (15) Same as (13), but multiplied by SQRT( underflow threshold )
 232 *  (16) Same as (8), but diagonal elements are all positive.
 233 *  (17) Same as (9), but diagonal elements are all positive.
 234 *  (18) Same as (10), but diagonal elements are all positive.
 235 *  (19) Same as (16), but multiplied by SQRT( overflow threshold )
 236 *  (20) Same as (16), but multiplied by SQRT( underflow threshold )
 237 *  (21) A diagonally dominant tridiagonal matrix with geometrically
 238 *       spaced diagonal entries 1, ..., ULP.
 239 *
 240 *  Arguments
 241 *  =========
 242 *
 243 *  NSIZES  (input) INTEGER
 244 *          The number of sizes of matrices to use.  If it is zero,
 245 *          CCHKST does nothing.  It must be at least zero.
 246 *
 247 *  NN      (input) INTEGER array, dimension (NSIZES)
 248 *          An array containing the sizes to be used for the matrices.
 249 *          Zero values will be skipped.  The values must be at least
 250 *          zero.
 251 *
 252 *  NTYPES  (input) INTEGER
 253 *          The number of elements in DOTYPE.   If it is zero, CCHKST
 254 *          does nothing.  It must be at least zero.  If it is MAXTYP+1
 255 *          and NSIZES is 1, then an additional type, MAXTYP+1 is
 256 *          defined, which is to use whatever matrix is in A.  This
 257 *          is only useful if DOTYPE(1:MAXTYP) is .FALSE. and
 258 *          DOTYPE(MAXTYP+1) is .TRUE. .
 259 *
 260 *  DOTYPE  (input) LOGICAL array, dimension (NTYPES)
 261 *          If DOTYPE(j) is .TRUE., then for each size in NN a
 262 *          matrix of that size and of type j will be generated.
 263 *          If NTYPES is smaller than the maximum number of types
 264 *          defined (PARAMETER MAXTYP), then types NTYPES+1 through
 265 *          MAXTYP will not be generated.  If NTYPES is larger
 266 *          than MAXTYP, DOTYPE(MAXTYP+1) through DOTYPE(NTYPES)
 267 *          will be ignored.
 268 *
 269 *  ISEED   (input/output) INTEGER array, dimension (4)
 270 *          On entry ISEED specifies the seed of the random number
 271 *          generator. The array elements should be between 0 and 4095;
 272 *          if not they will be reduced mod 4096.  Also, ISEED(4) must
 273 *          be odd.  The random number generator uses a linear
 274 *          congruential sequence limited to small integers, and so
 275 *          should produce machine independent random numbers. The
 276 *          values of ISEED are changed on exit, and can be used in the
 277 *          next call to CCHKST to continue the same random number
 278 *          sequence.
 279 *
 280 *  THRESH  (input) REAL
 281 *          A test will count as "failed" if the "error", computed as
 282 *          described above, exceeds THRESH.  Note that the error
 283 *          is scaled to be O(1), so THRESH should be a reasonably
 284 *          small multiple of 1, e.g., 10 or 100.  In particular,
 285 *          it should not depend on the precision (single vs. double)
 286 *          or the size of the matrix.  It must be at least zero.
 287 *
 288 *  NOUNIT  (input) INTEGER
 289 *          The FORTRAN unit number for printing out error messages
 290 *          (e.g., if a routine returns IINFO not equal to 0.)
 291 *
 292 *  A       (input/workspace/output) COMPLEX array of
 293 *                                  dimension ( LDA , max(NN) )
 294 *          Used to hold the matrix whose eigenvalues are to be
 295 *          computed.  On exit, A contains the last matrix actually
 296 *          used.
 297 *
 298 *  LDA     (input) INTEGER
 299 *          The leading dimension of A.  It must be at
 300 *          least 1 and at least max( NN ).
 301 *
 302 *  AP      (workspace) COMPLEX array of
 303 *                      dimension( max(NN)*max(NN+1)/2 )
 304 *          The matrix A stored in packed format.
 305 *
 306 *  SD      (workspace/output) REAL array of
 307 *                             dimension( max(NN) )
 308 *          The diagonal of the tridiagonal matrix computed by CHETRD.
 309 *          On exit, SD and SE contain the tridiagonal form of the
 310 *          matrix in A.
 311 *
 312 *  SE      (workspace/output) REAL array of
 313 *                             dimension( max(NN) )
 314 *          The off-diagonal of the tridiagonal matrix computed by
 315 *          CHETRD.  On exit, SD and SE contain the tridiagonal form of
 316 *          the matrix in A.
 317 *
 318 *  D1      (workspace/output) REAL array of
 319 *                             dimension( max(NN) )
 320 *          The eigenvalues of A, as computed by CSTEQR simlutaneously
 321 *          with Z.  On exit, the eigenvalues in D1 correspond with the
 322 *          matrix in A.
 323 *
 324 *  D2      (workspace/output) REAL array of
 325 *                             dimension( max(NN) )
 326 *          The eigenvalues of A, as computed by CSTEQR if Z is not
 327 *          computed.  On exit, the eigenvalues in D2 correspond with
 328 *          the matrix in A.
 329 *
 330 *  D3      (workspace/output) REAL array of
 331 *                             dimension( max(NN) )
 332 *          The eigenvalues of A, as computed by SSTERF.  On exit, the
 333 *          eigenvalues in D3 correspond with the matrix in A.
 334 *
 335 *  U       (workspace/output) COMPLEX array of
 336 *                             dimension( LDU, max(NN) ).
 337 *          The unitary matrix computed by CHETRD + CUNGTR.
 338 *
 339 *  LDU     (input) INTEGER
 340 *          The leading dimension of U, Z, and V.  It must be at least 1
 341 *          and at least max( NN ).
 342 *
 343 *  V       (workspace/output) COMPLEX array of
 344 *                             dimension( LDU, max(NN) ).
 345 *          The Housholder vectors computed by CHETRD in reducing A to
 346 *          tridiagonal form.  The vectors computed with UPLO='U' are
 347 *          in the upper triangle, and the vectors computed with UPLO='L'
 348 *          are in the lower triangle.  (As described in CHETRD, the
 349 *          sub- and superdiagonal are not set to 1, although the
 350 *          true Householder vector has a 1 in that position.  The
 351 *          routines that use V, such as CUNGTR, set those entries to
 352 *          1 before using them, and then restore them later.)
 353 *
 354 *  VP      (workspace) COMPLEX array of
 355 *                      dimension( max(NN)*max(NN+1)/2 )
 356 *          The matrix V stored in packed format.
 357 *
 358 *  TAU     (workspace/output) COMPLEX array of
 359 *                             dimension( max(NN) )
 360 *          The Householder factors computed by CHETRD in reducing A
 361 *          to tridiagonal form.
 362 *
 363 *  Z       (workspace/output) COMPLEX array of
 364 *                             dimension( LDU, max(NN) ).
 365 *          The unitary matrix of eigenvectors computed by CSTEQR,
 366 *          CPTEQR, and CSTEIN.
 367 *
 368 *  WORK    (workspace/output) COMPLEX array of
 369 *                      dimension( LWORK )
 370 *
 371 *  LWORK   (input) INTEGER
 372 *          The number of entries in WORK.  This must be at least
 373 *          1 + 4 * Nmax + 2 * Nmax * lg Nmax + 3 * Nmax**2
 374 *          where Nmax = max( NN(j), 2 ) and lg = log base 2.
 375 *
 376 *  IWORK   (workspace/output) INTEGER array,
 377 *             dimension (6 + 6*Nmax + 5 * Nmax * lg Nmax )
 378 *          where Nmax = max( NN(j), 2 ) and lg = log base 2.
 379 *          Workspace.
 380 *
 381 *  RWORK   (workspace/output) REAL array of
 382 *                      dimension( ??? )
 383 *
 384 *  RESULT  (output) REAL array, dimension (26)
 385 *          The values computed by the tests described above.
 386 *          The values are currently limited to 1/ulp, to avoid
 387 *          overflow.
 388 *
 389 *  INFO    (output) INTEGER
 390 *          If 0, then everything ran OK.
 391 *           -1: NSIZES < 0
 392 *           -2: Some NN(j) < 0
 393 *           -3: NTYPES < 0
 394 *           -5: THRESH < 0
 395 *           -9: LDA < 1 or LDA < NMAX, where NMAX is max( NN(j) ).
 396 *          -23: LDU < 1 or LDU < NMAX.
 397 *          -29: LWORK too small.
 398 *          If  CLATMR, CLATMS, CHETRD, CUNGTR, CSTEQR, SSTERF,
 399 *              or CUNMC2 returns an error code, the
 400 *              absolute value of it is returned.
 401 *
 402 *-----------------------------------------------------------------------
 403 *
 404 *       Some Local Variables and Parameters:
 405 *       ---- ----- --------- --- ----------
 406 *       ZERO, ONE       Real 0 and 1.
 407 *       MAXTYP          The number of types defined.
 408 *       NTEST           The number of tests performed, or which can
 409 *                       be performed so far, for the current matrix.
 410 *       NTESTT          The total number of tests performed so far.
 411 *       NBLOCK          Blocksize as returned by ENVIR.
 412 *       NMAX            Largest value in NN.
 413 *       NMATS           The number of matrices generated so far.
 414 *       NERRS           The number of tests which have exceeded THRESH
 415 *                       so far.
 416 *       COND, IMODE     Values to be passed to the matrix generators.
 417 *       ANORM           Norm of A; passed to matrix generators.
 418 *
 419 *       OVFL, UNFL      Overflow and underflow thresholds.
 420 *       ULP, ULPINV     Finest relative precision and its inverse.
 421 *       RTOVFL, RTUNFL  Square roots of the previous 2 values.
 422 *               The following four arrays decode JTYPE:
 423 *       KTYPE(j)        The general type (1-10) for type "j".
 424 *       KMODE(j)        The MODE value to be passed to the matrix
 425 *                       generator for type "j".
 426 *       KMAGN(j)        The order of magnitude ( O(1),
 427 *                       O(overflow^(1/2) ), O(underflow^(1/2) )
 428 *
 429 *  =====================================================================
 430 *
 431 *     .. Parameters ..
 432       REAL               ZERO, ONE, TWO, EIGHT, TEN, HUN
 433       PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0,
 434      $                   EIGHT = 8.0E0, TEN = 10.0E0, HUN = 100.0E0 )
 435       COMPLEX            CZERO, CONE
 436       PARAMETER          ( CZERO = ( 0.0E+00.0E+0 ),
 437      $                   CONE = ( 1.0E+00.0E+0 ) )
 438       REAL               HALF
 439       PARAMETER          ( HALF = ONE / TWO )
 440       INTEGER            MAXTYP
 441       PARAMETER          ( MAXTYP = 21 )
 442       LOGICAL            CRANGE
 443       PARAMETER          ( CRANGE = .FALSE. )
 444       LOGICAL            CREL
 445       PARAMETER          ( CREL = .FALSE. )
 446 *     ..
 447 *     .. Local Scalars ..
 448       LOGICAL            BADNN, TRYRAC
 449       INTEGER            I, IINFO, IL, IMODE, INDE, INDRWK, ITEMP,
 450      $                   ITYPE, IU, J, JC, JR, JSIZE, JTYPE, LGN,
 451      $                   LIWEDC, LOG2UI, LRWEDC, LWEDC, M, M2, M3,
 452      $                   MTYPES, N, NAP, NBLOCK, NERRS, NMATS, NMAX,
 453      $                   NSPLIT, NTEST, NTESTT
 454       REAL               ABSTOL, ANINV, ANORM, COND, OVFL, RTOVFL,
 455      $                   RTUNFL, TEMP1, TEMP2, TEMP3, TEMP4, ULP,
 456      $                   ULPINV, UNFL, VL, VU
 457 *     ..
 458 *     .. Local Arrays ..
 459       INTEGER            IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
 460      $                   KMAGN( MAXTYP ), KMODE( MAXTYP ),
 461      $                   KTYPE( MAXTYP )
 462       REAL               DUMMA( 1 )
 463 *     ..
 464 *     .. External Functions ..
 465       INTEGER            ILAENV
 466       REAL               SLAMCH, SLARND, SSXT1
 467       EXTERNAL           ILAENV, SLAMCH, SLARND, SSXT1
 468 *     ..
 469 *     .. External Subroutines ..
 470       EXTERNAL           CCOPY, CHET21, CHETRD, CHPT21, CHPTRD, CLACPY,
 471      $                   CLASET, CLATMR, CLATMS, CPTEQR, CSTEDC, CSTEMR,
 472      $                   CSTEIN, CSTEQR, CSTT21, CSTT22, CUNGTR, CUPGTR,
 473      $                   SCOPY, SLABAD, SLASUM, SSTEBZ, SSTECH, SSTERF,
 474      $                   XERBLA
 475 *     ..
 476 *     .. Intrinsic Functions ..
 477       INTRINSIC          ABSCONJGINTLOGMAXMIN, REAL, SQRT
 478 *     ..
 479 *     .. Data statements ..
 480       DATA               KTYPE / 1244444555558,
 481      $                   889999910 /
 482       DATA               KMAGN / 1111123111231,
 483      $                   23111231 /
 484       DATA               KMODE / 0043144431440,
 485      $                   00431443 /
 486 *     ..
 487 *     .. Executable Statements ..
 488 *
 489 *     Keep ftnchek happy
 490       IDUMMA( 1 ) = 1
 491 *
 492 *     Check for errors
 493 *
 494       NTESTT = 0
 495       INFO = 0
 496 *
 497 *     Important constants
 498 *
 499       BADNN = .FALSE.
 500       TRYRAC = .TRUE.
 501       NMAX = 1
 502       DO 10 J = 1, NSIZES
 503          NMAX = MAX( NMAX, NN( J ) )
 504          IF( NN( J ).LT.0 )
 505      $      BADNN = .TRUE.
 506    10 CONTINUE
 507 *
 508       NBLOCK = ILAENV( 1'CHETRD''L', NMAX, -1-1-1 )
 509       NBLOCK = MIN( NMAX, MAX1, NBLOCK ) )
 510 *
 511 *     Check for errors
 512 *
 513       IF( NSIZES.LT.0 ) THEN
 514          INFO = -1
 515       ELSE IF( BADNN ) THEN
 516          INFO = -2
 517       ELSE IF( NTYPES.LT.0 ) THEN
 518          INFO = -3
 519       ELSE IF( LDA.LT.NMAX ) THEN
 520          INFO = -9
 521       ELSE IF( LDU.LT.NMAX ) THEN
 522          INFO = -23
 523       ELSE IF2*MAX2, NMAX )**2.GT.LWORK ) THEN
 524          INFO = -29
 525       END IF
 526 *
 527       IF( INFO.NE.0 ) THEN
 528          CALL XERBLA( 'CCHKST'-INFO )
 529          RETURN
 530       END IF
 531 *
 532 *     Quick return if possible
 533 *
 534       IF( NSIZES.EQ.0 .OR. NTYPES.EQ.0 )
 535      $   RETURN
 536 *
 537 *     More Important constants
 538 *
 539       UNFL = SLAMCH( 'Safe minimum' )
 540       OVFL = ONE / UNFL
 541       CALL SLABAD( UNFL, OVFL )
 542       ULP = SLAMCH( 'Epsilon' )*SLAMCH( 'Base' )
 543       ULPINV = ONE / ULP
 544       LOG2UI = INTLOG( ULPINV ) / LOG( TWO ) )
 545       RTUNFL = SQRT( UNFL )
 546       RTOVFL = SQRT( OVFL )
 547 *
 548 *     Loop over sizes, types
 549 *
 550       DO 20 I = 14
 551          ISEED2( I ) = ISEED( I )
 552    20 CONTINUE
 553       NERRS = 0
 554       NMATS = 0
 555 *
 556       DO 310 JSIZE = 1, NSIZES
 557          N = NN( JSIZE )
 558          IF( N.GT.0 ) THEN
 559             LGN = INTLOGREAL( N ) ) / LOG( TWO ) )
 560             IF2**LGN.LT.N )
 561      $         LGN = LGN + 1
 562             IF2**LGN.LT.N )
 563      $         LGN = LGN + 1
 564             LWEDC = 1 + 4*+ 2*N*LGN + 3*N**2
 565             LRWEDC = 1 + 3*+ 2*N*LGN + 3*N**2
 566             LIWEDC = 6 + 6*+ 5*N*LGN
 567          ELSE
 568             LWEDC = 8
 569             LRWEDC = 7
 570             LIWEDC = 12
 571          END IF
 572          NAP = ( N*( N+1 ) ) / 2
 573          ANINV = ONE / REALMAX1, N ) )
 574 *
 575          IF( NSIZES.NE.1 ) THEN
 576             MTYPES = MIN( MAXTYP, NTYPES )
 577          ELSE
 578             MTYPES = MIN( MAXTYP+1, NTYPES )
 579          END IF
 580 *
 581          DO 300 JTYPE = 1, MTYPES
 582             IF.NOT.DOTYPE( JTYPE ) )
 583      $         GO TO 300
 584             NMATS = NMATS + 1
 585             NTEST = 0
 586 *
 587             DO 30 J = 14
 588                IOLDSD( J ) = ISEED( J )
 589    30       CONTINUE
 590 *
 591 *           Compute "A"
 592 *
 593 *           Control parameters:
 594 *
 595 *               KMAGN  KMODE        KTYPE
 596 *           =1  O(1)   clustered 1  zero
 597 *           =2  large  clustered 2  identity
 598 *           =3  small  exponential  (none)
 599 *           =4         arithmetic   diagonal, (w/ eigenvalues)
 600 *           =5         random log   Hermitian, w/ eigenvalues
 601 *           =6         random       (none)
 602 *           =7                      random diagonal
 603 *           =8                      random Hermitian
 604 *           =9                      positive definite
 605 *           =10                     diagonally dominant tridiagonal
 606 *
 607             IF( MTYPES.GT.MAXTYP )
 608      $         GO TO 100
 609 *
 610             ITYPE = KTYPE( JTYPE )
 611             IMODE = KMODE( JTYPE )
 612 *
 613 *           Compute norm
 614 *
 615             GO TO ( 405060 )KMAGN( JTYPE )
 616 *
 617    40       CONTINUE
 618             ANORM = ONE
 619             GO TO 70
 620 *
 621    50       CONTINUE
 622             ANORM = ( RTOVFL*ULP )*ANINV
 623             GO TO 70
 624 *
 625    60       CONTINUE
 626             ANORM = RTUNFL*N*ULPINV
 627             GO TO 70
 628 *
 629    70       CONTINUE
 630 *
 631             CALL CLASET( 'Full', LDA, N, CZERO, CZERO, A, LDA )
 632             IINFO = 0
 633             IF( JTYPE.LE.15 ) THEN
 634                COND = ULPINV
 635             ELSE
 636                COND = ULPINV*ANINV / TEN
 637             END IF
 638 *
 639 *           Special Matrices -- Identity & Jordan block
 640 *
 641 *              Zero
 642 *
 643             IF( ITYPE.EQ.1 ) THEN
 644                IINFO = 0
 645 *
 646             ELSE IF( ITYPE.EQ.2 ) THEN
 647 *
 648 *              Identity
 649 *
 650                DO 80 JC = 1, N
 651                   A( JC, JC ) = ANORM
 652    80          CONTINUE
 653 *
 654             ELSE IF( ITYPE.EQ.4 ) THEN
 655 *
 656 *              Diagonal Matrix, [Eigen]values Specified
 657 *
 658                CALL CLATMS( N, N, 'S', ISEED, 'H', RWORK, IMODE, COND,
 659      $                      ANORM, 00'N', A, LDA, WORK, IINFO )
 660 *
 661 *
 662             ELSE IF( ITYPE.EQ.5 ) THEN
 663 *
 664 *              Hermitian, eigenvalues specified
 665 *
 666                CALL CLATMS( N, N, 'S', ISEED, 'H', RWORK, IMODE, COND,
 667      $                      ANORM, N, N, 'N', A, LDA, WORK, IINFO )
 668 *
 669             ELSE IF( ITYPE.EQ.7 ) THEN
 670 *
 671 *              Diagonal, random eigenvalues
 672 *
 673                CALL CLATMR( N, N, 'S', ISEED, 'H', WORK, 6, ONE, CONE,
 674      $                      'T''N', WORK( N+1 ), 1, ONE,
 675      $                      WORK( 2*N+1 ), 1, ONE, 'N', IDUMMA, 00,
 676      $                      ZERO, ANORM, 'NO', A, LDA, IWORK, IINFO )
 677 *
 678             ELSE IF( ITYPE.EQ.8 ) THEN
 679 *
 680 *              Hermitian, random eigenvalues
 681 *
 682                CALL CLATMR( N, N, 'S', ISEED, 'H', WORK, 6, ONE, CONE,
 683      $                      'T''N', WORK( N+1 ), 1, ONE,
 684      $                      WORK( 2*N+1 ), 1, ONE, 'N', IDUMMA, N, N,
 685      $                      ZERO, ANORM, 'NO', A, LDA, IWORK, IINFO )
 686 *
 687             ELSE IF( ITYPE.EQ.9 ) THEN
 688 *
 689 *              Positive definite, eigenvalues specified.
 690 *
 691                CALL CLATMS( N, N, 'S', ISEED, 'P', RWORK, IMODE, COND,
 692      $                      ANORM, N, N, 'N', A, LDA, WORK, IINFO )
 693 *
 694             ELSE IF( ITYPE.EQ.10 ) THEN
 695 *
 696 *              Positive definite tridiagonal, eigenvalues specified.
 697 *
 698                CALL CLATMS( N, N, 'S', ISEED, 'P', RWORK, IMODE, COND,
 699      $                      ANORM, 11'N', A, LDA, WORK, IINFO )
 700                DO 90 I = 2, N
 701                   TEMP1 = ABS( A( I-1, I ) )
 702                   TEMP2 = SQRTABS( A( I-1, I-1 )*A( I, I ) ) )
 703                   IF( TEMP1.GT.HALF*TEMP2 ) THEN
 704                      A( I-1, I ) = A( I-1, I )*
 705      $                             ( HALF*TEMP2 / ( UNFL+TEMP1 ) )
 706                      A( I, I-1 ) = CONJG( A( I-1, I ) )
 707                   END IF
 708    90          CONTINUE
 709 *
 710             ELSE
 711 *
 712                IINFO = 1
 713             END IF
 714 *
 715             IF( IINFO.NE.0 ) THEN
 716                WRITE( NOUNIT, FMT = 9999 )'Generator', IINFO, N, JTYPE,
 717      $            IOLDSD
 718                INFO = ABS( IINFO )
 719                RETURN
 720             END IF
 721 *
 722   100       CONTINUE
 723 *
 724 *           Call CHETRD and CUNGTR to compute S and U from
 725 *           upper triangle.
 726 *
 727             CALL CLACPY( 'U', N, N, A, LDA, V, LDU )
 728 *
 729             NTEST = 1
 730             CALL CHETRD( 'U', N, V, LDU, SD, SE, TAU, WORK, LWORK,
 731      $                   IINFO )
 732 *
 733             IF( IINFO.NE.0 ) THEN
 734                WRITE( NOUNIT, FMT = 9999 )'CHETRD(U)', IINFO, N, JTYPE,
 735      $            IOLDSD
 736                INFO = ABS( IINFO )
 737                IF( IINFO.LT.0 ) THEN
 738                   RETURN
 739                ELSE
 740                   RESULT1 ) = ULPINV
 741                   GO TO 280
 742                END IF
 743             END IF
 744 *
 745             CALL CLACPY( 'U', N, N, V, LDU, U, LDU )
 746 *
 747             NTEST = 2
 748             CALL CUNGTR( 'U', N, U, LDU, TAU, WORK, LWORK, IINFO )
 749             IF( IINFO.NE.0 ) THEN
 750                WRITE( NOUNIT, FMT = 9999 )'CUNGTR(U)', IINFO, N, JTYPE,
 751      $            IOLDSD
 752                INFO = ABS( IINFO )
 753                IF( IINFO.LT.0 ) THEN
 754                   RETURN
 755                ELSE
 756                   RESULT2 ) = ULPINV
 757                   GO TO 280
 758                END IF
 759             END IF
 760 *
 761 *           Do tests 1 and 2
 762 *
 763             CALL CHET21( 2'Upper', N, 1, A, LDA, SD, SE, U, LDU, V,
 764      $                   LDU, TAU, WORK, RWORK, RESULT1 ) )
 765             CALL CHET21( 3'Upper', N, 1, A, LDA, SD, SE, U, LDU, V,
 766      $                   LDU, TAU, WORK, RWORK, RESULT2 ) )
 767 *
 768 *           Call CHETRD and CUNGTR to compute S and U from
 769 *           lower triangle, do tests.
 770 *
 771             CALL CLACPY( 'L', N, N, A, LDA, V, LDU )
 772 *
 773             NTEST = 3
 774             CALL CHETRD( 'L', N, V, LDU, SD, SE, TAU, WORK, LWORK,
 775      $                   IINFO )
 776 *
 777             IF( IINFO.NE.0 ) THEN
 778                WRITE( NOUNIT, FMT = 9999 )'CHETRD(L)', IINFO, N, JTYPE,
 779      $            IOLDSD
 780                INFO = ABS( IINFO )
 781                IF( IINFO.LT.0 ) THEN
 782                   RETURN
 783                ELSE
 784                   RESULT3 ) = ULPINV
 785                   GO TO 280
 786                END IF
 787             END IF
 788 *
 789             CALL CLACPY( 'L', N, N, V, LDU, U, LDU )
 790 *
 791             NTEST = 4
 792             CALL CUNGTR( 'L', N, U, LDU, TAU, WORK, LWORK, IINFO )
 793             IF( IINFO.NE.0 ) THEN
 794                WRITE( NOUNIT, FMT = 9999 )'CUNGTR(L)', IINFO, N, JTYPE,
 795      $            IOLDSD
 796                INFO = ABS( IINFO )
 797                IF( IINFO.LT.0 ) THEN
 798                   RETURN
 799                ELSE
 800                   RESULT4 ) = ULPINV
 801                   GO TO 280
 802                END IF
 803             END IF
 804 *
 805             CALL CHET21( 2'Lower', N, 1, A, LDA, SD, SE, U, LDU, V,
 806      $                   LDU, TAU, WORK, RWORK, RESULT3 ) )
 807             CALL CHET21( 3'Lower', N, 1, A, LDA, SD, SE, U, LDU, V,
 808      $                   LDU, TAU, WORK, RWORK, RESULT4 ) )
 809 *
 810 *           Store the upper triangle of A in AP
 811 *
 812             I = 0
 813             DO 120 JC = 1, N
 814                DO 110 JR = 1, JC
 815                   I = I + 1
 816                   AP( I ) = A( JR, JC )
 817   110          CONTINUE
 818   120       CONTINUE
 819 *
 820 *           Call CHPTRD and CUPGTR to compute S and U from AP
 821 *
 822             CALL CCOPY( NAP, AP, 1, VP, 1 )
 823 *
 824             NTEST = 5
 825             CALL CHPTRD( 'U', N, VP, SD, SE, TAU, IINFO )
 826 *
 827             IF( IINFO.NE.0 ) THEN
 828                WRITE( NOUNIT, FMT = 9999 )'CHPTRD(U)', IINFO, N, JTYPE,
 829      $            IOLDSD
 830                INFO = ABS( IINFO )
 831                IF( IINFO.LT.0 ) THEN
 832                   RETURN
 833                ELSE
 834                   RESULT5 ) = ULPINV
 835                   GO TO 280
 836                END IF
 837             END IF
 838 *
 839             NTEST = 6
 840             CALL CUPGTR( 'U', N, VP, TAU, U, LDU, WORK, IINFO )
 841             IF( IINFO.NE.0 ) THEN
 842                WRITE( NOUNIT, FMT = 9999 )'CUPGTR(U)', IINFO, N, JTYPE,
 843      $            IOLDSD
 844                INFO = ABS( IINFO )
 845                IF( IINFO.LT.0 ) THEN
 846                   RETURN
 847                ELSE
 848                   RESULT6 ) = ULPINV
 849                   GO TO 280
 850                END IF
 851             END IF
 852 *
 853 *           Do tests 5 and 6
 854 *
 855             CALL CHPT21( 2'Upper', N, 1, AP, SD, SE, U, LDU, VP, TAU,
 856      $                   WORK, RWORK, RESULT5 ) )
 857             CALL CHPT21( 3'Upper', N, 1, AP, SD, SE, U, LDU, VP, TAU,
 858      $                   WORK, RWORK, RESULT6 ) )
 859 *
 860 *           Store the lower triangle of A in AP
 861 *
 862             I = 0
 863             DO 140 JC = 1, N
 864                DO 130 JR = JC, N
 865                   I = I + 1
 866                   AP( I ) = A( JR, JC )
 867   130          CONTINUE
 868   140       CONTINUE
 869 *
 870 *           Call CHPTRD and CUPGTR to compute S and U from AP
 871 *
 872             CALL CCOPY( NAP, AP, 1, VP, 1 )
 873 *
 874             NTEST = 7
 875             CALL CHPTRD( 'L', N, VP, SD, SE, TAU, IINFO )
 876 *
 877             IF( IINFO.NE.0 ) THEN
 878                WRITE( NOUNIT, FMT = 9999 )'CHPTRD(L)', IINFO, N, JTYPE,
 879      $            IOLDSD
 880                INFO = ABS( IINFO )
 881                IF( IINFO.LT.0 ) THEN
 882                   RETURN
 883                ELSE
 884                   RESULT7 ) = ULPINV
 885                   GO TO 280
 886                END IF
 887             END IF
 888 *
 889             NTEST = 8
 890             CALL CUPGTR( 'L', N, VP, TAU, U, LDU, WORK, IINFO )
 891             IF( IINFO.NE.0 ) THEN
 892                WRITE( NOUNIT, FMT = 9999 )'CUPGTR(L)', IINFO, N, JTYPE,
 893      $            IOLDSD
 894                INFO = ABS( IINFO )
 895                IF( IINFO.LT.0 ) THEN
 896                   RETURN
 897                ELSE
 898                   RESULT8 ) = ULPINV
 899                   GO TO 280
 900                END IF
 901             END IF
 902 *
 903             CALL CHPT21( 2'Lower', N, 1, AP, SD, SE, U, LDU, VP, TAU,
 904      $                   WORK, RWORK, RESULT7 ) )
 905             CALL CHPT21( 3'Lower', N, 1, AP, SD, SE, U, LDU, VP, TAU,
 906      $                   WORK, RWORK, RESULT8 ) )
 907 *
 908 *           Call CSTEQR to compute D1, D2, and Z, do tests.
 909 *
 910 *           Compute D1 and Z
 911 *
 912             CALL SCOPY( N, SD, 1, D1, 1 )
 913             IF( N.GT.0 )
 914      $         CALL SCOPY( N-1, SE, 1, RWORK, 1 )
 915             CALL CLASET( 'Full', N, N, CZERO, CONE, Z, LDU )
 916 *
 917             NTEST = 9
 918             CALL CSTEQR( 'V', N, D1, RWORK, Z, LDU, RWORK( N+1 ),
 919      $                   IINFO )
 920             IF( IINFO.NE.0 ) THEN
 921                WRITE( NOUNIT, FMT = 9999 )'CSTEQR(V)', IINFO, N, JTYPE,
 922      $            IOLDSD
 923                INFO = ABS( IINFO )
 924                IF( IINFO.LT.0 ) THEN
 925                   RETURN
 926                ELSE
 927                   RESULT9 ) = ULPINV
 928                   GO TO 280
 929                END IF
 930             END IF
 931 *
 932 *           Compute D2
 933 *
 934             CALL SCOPY( N, SD, 1, D2, 1 )
 935             IF( N.GT.0 )
 936      $         CALL SCOPY( N-1, SE, 1, RWORK, 1 )
 937 *
 938             NTEST = 11
 939             CALL CSTEQR( 'N', N, D2, RWORK, WORK, LDU, RWORK( N+1 ),
 940      $                   IINFO )
 941             IF( IINFO.NE.0 ) THEN
 942                WRITE( NOUNIT, FMT = 9999 )'CSTEQR(N)', IINFO, N, JTYPE,
 943      $            IOLDSD
 944                INFO = ABS( IINFO )
 945                IF( IINFO.LT.0 ) THEN
 946                   RETURN
 947                ELSE
 948                   RESULT11 ) = ULPINV
 949                   GO TO 280
 950                END IF
 951             END IF
 952 *
 953 *           Compute D3 (using PWK method)
 954 *
 955             CALL SCOPY( N, SD, 1, D3, 1 )
 956             IF( N.GT.0 )
 957      $         CALL SCOPY( N-1, SE, 1, RWORK, 1 )
 958 *
 959             NTEST = 12
 960             CALL SSTERF( N, D3, RWORK, IINFO )
 961             IF( IINFO.NE.0 ) THEN
 962                WRITE( NOUNIT, FMT = 9999 )'SSTERF', IINFO, N, JTYPE,
 963      $            IOLDSD
 964                INFO = ABS( IINFO )
 965                IF( IINFO.LT.0 ) THEN
 966                   RETURN
 967                ELSE
 968                   RESULT12 ) = ULPINV
 969                   GO TO 280
 970                END IF
 971             END IF
 972 *
 973 *           Do Tests 9 and 10
 974 *
 975             CALL CSTT21( N, 0, SD, SE, D1, DUMMA, Z, LDU, WORK, RWORK,
 976      $                   RESULT9 ) )
 977 *
 978 *           Do Tests 11 and 12
 979 *
 980             TEMP1 = ZERO
 981             TEMP2 = ZERO
 982             TEMP3 = ZERO
 983             TEMP4 = ZERO
 984 *
 985             DO 150 J = 1, N
 986                TEMP1 = MAX( TEMP1, ABS( D1( J ) ), ABS( D2( J ) ) )
 987                TEMP2 = MAX( TEMP2, ABS( D1( J )-D2( J ) ) )
 988                TEMP3 = MAX( TEMP3, ABS( D1( J ) ), ABS( D3( J ) ) )
 989                TEMP4 = MAX( TEMP4, ABS( D1( J )-D3( J ) ) )
 990   150       CONTINUE
 991 *
 992             RESULT11 ) = TEMP2 / MAX( UNFL, ULP*MAX( TEMP1, TEMP2 ) )
 993             RESULT12 ) = TEMP4 / MAX( UNFL, ULP*MAX( TEMP3, TEMP4 ) )
 994 *
 995 *           Do Test 13 -- Sturm Sequence Test of Eigenvalues
 996 *                         Go up by factors of two until it succeeds
 997 *
 998             NTEST = 13
 999             TEMP1 = THRESH*( HALF-ULP )
1000 *
1001             DO 160 J = 0, LOG2UI
1002                CALL SSTECH( N, SD, SE, D1, TEMP1, RWORK, IINFO )
1003                IF( IINFO.EQ.0 )
1004      $            GO TO 170
1005                TEMP1 = TEMP1*TWO
1006   160       CONTINUE
1007 *
1008   170       CONTINUE
1009             RESULT13 ) = TEMP1
1010 *
1011 *           For positive definite matrices ( JTYPE.GT.15 ) call CPTEQR
1012 *           and do tests 14, 15, and 16 .
1013 *
1014             IF( JTYPE.GT.15 ) THEN
1015 *
1016 *              Compute D4 and Z4
1017 *
1018                CALL SCOPY( N, SD, 1, D4, 1 )
1019                IF( N.GT.0 )
1020      $            CALL SCOPY( N-1, SE, 1, RWORK, 1 )
1021                CALL CLASET( 'Full', N, N, CZERO, CONE, Z, LDU )
1022 *
1023                NTEST = 14
1024                CALL CPTEQR( 'V', N, D4, RWORK, Z, LDU, RWORK( N+1 ),
1025      $                      IINFO )
1026                IF( IINFO.NE.0 ) THEN
1027                   WRITE( NOUNIT, FMT = 9999 )'CPTEQR(V)', IINFO, N,
1028      $               JTYPE, IOLDSD
1029                   INFO = ABS( IINFO )
1030                   IF( IINFO.LT.0 ) THEN
1031                      RETURN
1032                   ELSE
1033                      RESULT14 ) = ULPINV
1034                      GO TO 280
1035                   END IF
1036                END IF
1037 *
1038 *              Do Tests 14 and 15
1039 *
1040                CALL CSTT21( N, 0, SD, SE, D4, DUMMA, Z, LDU, WORK,
1041      $                      RWORK, RESULT14 ) )
1042 *
1043 *              Compute D5
1044 *
1045                CALL SCOPY( N, SD, 1, D5, 1 )
1046                IF( N.GT.0 )
1047      $            CALL SCOPY( N-1, SE, 1, RWORK, 1 )
1048 *
1049                NTEST = 16
1050                CALL CPTEQR( 'N', N, D5, RWORK, Z, LDU, RWORK( N+1 ),
1051      $                      IINFO )
1052                IF( IINFO.NE.0 ) THEN
1053                   WRITE( NOUNIT, FMT = 9999 )'CPTEQR(N)', IINFO, N,
1054      $               JTYPE, IOLDSD
1055                   INFO = ABS( IINFO )
1056                   IF( IINFO.LT.0 ) THEN
1057                      RETURN
1058                   ELSE
1059                      RESULT16 ) = ULPINV
1060                      GO TO 280
1061                   END IF
1062                END IF
1063 *
1064 *              Do Test 16
1065 *
1066                TEMP1 = ZERO
1067                TEMP2 = ZERO
1068                DO 180 J = 1, N
1069                   TEMP1 = MAX( TEMP1, ABS( D4( J ) ), ABS( D5( J ) ) )
1070                   TEMP2 = MAX( TEMP2, ABS( D4( J )-D5( J ) ) )
1071   180          CONTINUE
1072 *
1073                RESULT16 ) = TEMP2 / MAX( UNFL,
1074      $                        HUN*ULP*MAX( TEMP1, TEMP2 ) )
1075             ELSE
1076                RESULT14 ) = ZERO
1077                RESULT15 ) = ZERO
1078                RESULT16 ) = ZERO
1079             END IF
1080 *
1081 *           Call SSTEBZ with different options and do tests 17-18.
1082 *
1083 *              If S is positive definite and diagonally dominant,
1084 *              ask for all eigenvalues with high relative accuracy.
1085 *
1086             VL = ZERO
1087             VU = ZERO
1088             IL = 0
1089             IU = 0
1090             IF( JTYPE.EQ.21 ) THEN
1091                NTEST = 17
1092                ABSTOL = UNFL + UNFL
1093                CALL SSTEBZ( 'A''E', N, VL, VU, IL, IU, ABSTOL, SD, SE,
1094      $                      M, NSPLIT, WR, IWORK( 1 ), IWORK( N+1 ),
1095      $                      RWORK, IWORK( 2*N+1 ), IINFO )
1096                IF( IINFO.NE.0 ) THEN
1097                   WRITE( NOUNIT, FMT = 9999 )'SSTEBZ(A,rel)', IINFO, N,
1098      $               JTYPE, IOLDSD
1099                   INFO = ABS( IINFO )
1100                   IF( IINFO.LT.0 ) THEN
1101                      RETURN
1102                   ELSE
1103                      RESULT17 ) = ULPINV
1104                      GO TO 280
1105                   END IF
1106                END IF
1107 *
1108 *              Do test 17
1109 *
1110                TEMP2 = TWO*( TWO*N-ONE )*ULP*( ONE+EIGHT*HALF**2 ) /
1111      $                 ( ONE-HALF )**4
1112 *
1113                TEMP1 = ZERO
1114                DO 190 J = 1, N
1115                   TEMP1 = MAX( TEMP1, ABS( D4( J )-WR( N-J+1 ) ) /
1116      $                    ( ABSTOL+ABS( D4( J ) ) ) )
1117   190          CONTINUE
1118 *
1119                RESULT17 ) = TEMP1 / TEMP2
1120             ELSE
1121                RESULT17 ) = ZERO
1122             END IF
1123 *
1124 *           Now ask for all eigenvalues with high absolute accuracy.
1125 *
1126             NTEST = 18
1127             ABSTOL = UNFL + UNFL
1128             CALL SSTEBZ( 'A''E', N, VL, VU, IL, IU, ABSTOL, SD, SE, M,
1129      $                   NSPLIT, WA1, IWORK( 1 ), IWORK( N+1 ), RWORK,
1130      $                   IWORK( 2*N+1 ), IINFO )
1131             IF( IINFO.NE.0 ) THEN
1132                WRITE( NOUNIT, FMT = 9999 )'SSTEBZ(A)', IINFO, N, JTYPE,
1133      $            IOLDSD
1134                INFO = ABS( IINFO )
1135                IF( IINFO.LT.0 ) THEN
1136                   RETURN
1137                ELSE
1138                   RESULT18 ) = ULPINV
1139                   GO TO 280
1140                END IF
1141             END IF
1142 *
1143 *           Do test 18
1144 *
1145             TEMP1 = ZERO
1146             TEMP2 = ZERO
1147             DO 200 J = 1, N
1148                TEMP1 = MAX( TEMP1, ABS( D3( J ) ), ABS( WA1( J ) ) )
1149                TEMP2 = MAX( TEMP2, ABS( D3( J )-WA1( J ) ) )
1150   200       CONTINUE
1151 *
1152             RESULT18 ) = TEMP2 / MAX( UNFL, ULP*MAX( TEMP1, TEMP2 ) )
1153 *
1154 *           Choose random values for IL and IU, and ask for the
1155 *           IL-th through IU-th eigenvalues.
1156 *
1157             NTEST = 19
1158             IF( N.LE.1 ) THEN
1159                IL = 1
1160                IU = N
1161             ELSE
1162                IL = 1 + ( N-1 )*INT( SLARND( 1, ISEED2 ) )
1163                IU = 1 + ( N-1 )*INT( SLARND( 1, ISEED2 ) )
1164                IF( IU.LT.IL ) THEN
1165                   ITEMP = IU
1166                   IU = IL
1167                   IL = ITEMP
1168                END IF
1169             END IF
1170 *
1171             CALL SSTEBZ( 'I''E', N, VL, VU, IL, IU, ABSTOL, SD, SE,
1172      $                   M2, NSPLIT, WA2, IWORK( 1 ), IWORK( N+1 ),
1173      $                   RWORK, IWORK( 2*N+1 ), IINFO )
1174             IF( IINFO.NE.0 ) THEN
1175                WRITE( NOUNIT, FMT = 9999 )'SSTEBZ(I)', IINFO, N, JTYPE,
1176      $            IOLDSD
1177                INFO = ABS( IINFO )
1178                IF( IINFO.LT.0 ) THEN
1179                   RETURN
1180                ELSE
1181                   RESULT19 ) = ULPINV
1182                   GO TO 280
1183                END IF
1184             END IF
1185 *
1186 *           Determine the values VL and VU of the IL-th and IU-th
1187 *           eigenvalues and ask for all eigenvalues in this range.
1188 *
1189             IF( N.GT.0 ) THEN
1190                IF( IL.NE.1 ) THEN
1191                   VL = WA1( IL ) - MAX( HALF*( WA1( IL )-WA1( IL-1 ) ),
1192      $                 ULP*ANORM, TWO*RTUNFL )
1193                ELSE
1194                   VL = WA1( 1 ) - MAX( HALF*( WA1( N )-WA1( 1 ) ),
1195      $                 ULP*ANORM, TWO*RTUNFL )
1196                END IF
1197                IF( IU.NE.N ) THEN
1198                   VU = WA1( IU ) + MAX( HALF*( WA1( IU+1 )-WA1( IU ) ),
1199      $                 ULP*ANORM, TWO*RTUNFL )
1200                ELSE
1201                   VU = WA1( N ) + MAX( HALF*( WA1( N )-WA1( 1 ) ),
1202      $                 ULP*ANORM, TWO*RTUNFL )
1203                END IF
1204             ELSE
1205                VL = ZERO
1206                VU = ONE
1207             END IF
1208 *
1209             CALL SSTEBZ( 'V''E', N, VL, VU, IL, IU, ABSTOL, SD, SE,
1210      $                   M3, NSPLIT, WA3, IWORK( 1 ), IWORK( N+1 ),
1211      $                   RWORK, IWORK( 2*N+1 ), IINFO )
1212             IF( IINFO.NE.0 ) THEN
1213                WRITE( NOUNIT, FMT = 9999 )'SSTEBZ(V)', IINFO, N, JTYPE,
1214      $            IOLDSD
1215                INFO = ABS( IINFO )
1216                IF( IINFO.LT.0 ) THEN
1217                   RETURN
1218                ELSE
1219                   RESULT19 ) = ULPINV
1220                   GO TO 280
1221                END IF
1222             END IF
1223 *
1224             IF( M3.EQ.0 .AND. N.NE.0 ) THEN
1225                RESULT19 ) = ULPINV
1226                GO TO 280
1227             END IF
1228 *
1229 *           Do test 19
1230 *
1231             TEMP1 = SSXT1( 1, WA2, M2, WA3, M3, ABSTOL, ULP, UNFL )
1232             TEMP2 = SSXT1( 1, WA3, M3, WA2, M2, ABSTOL, ULP, UNFL )
1233             IF( N.GT.0 ) THEN
1234                TEMP3 = MAXABS( WA1( N ) ), ABS( WA1( 1 ) ) )
1235             ELSE
1236                TEMP3 = ZERO
1237             END IF
1238 *
1239             RESULT19 ) = ( TEMP1+TEMP2 ) / MAX( UNFL, TEMP3*ULP )
1240 *
1241 *           Call CSTEIN to compute eigenvectors corresponding to
1242 *           eigenvalues in WA1.  (First call SSTEBZ again, to make sure
1243 *           it returns these eigenvalues in the correct order.)
1244 *
1245             NTEST = 21
1246             CALL SSTEBZ( 'A''B', N, VL, VU, IL, IU, ABSTOL, SD, SE, M,
1247      $                   NSPLIT, WA1, IWORK( 1 ), IWORK( N+1 ), RWORK,
1248      $                   IWORK( 2*N+1 ), IINFO )
1249             IF( IINFO.NE.0 ) THEN
1250                WRITE( NOUNIT, FMT = 9999 )'SSTEBZ(A,B)', IINFO, N,
1251      $            JTYPE, IOLDSD
1252                INFO = ABS( IINFO )
1253                IF( IINFO.LT.0 ) THEN
1254                   RETURN
1255                ELSE
1256                   RESULT20 ) = ULPINV
1257                   RESULT21 ) = ULPINV
1258                   GO TO 280
1259                END IF
1260             END IF
1261 *
1262             CALL CSTEIN( N, SD, SE, M, WA1, IWORK( 1 ), IWORK( N+1 ), Z,
1263      $                   LDU, RWORK, IWORK( 2*N+1 ), IWORK( 3*N+1 ),
1264      $                   IINFO )
1265             IF( IINFO.NE.0 ) THEN
1266                WRITE( NOUNIT, FMT = 9999 )'CSTEIN', IINFO, N, JTYPE,
1267      $            IOLDSD
1268                INFO = ABS( IINFO )
1269                IF( IINFO.LT.0 ) THEN
1270                   RETURN
1271                ELSE
1272                   RESULT20 ) = ULPINV
1273                   RESULT21 ) = ULPINV
1274                   GO TO 280
1275                END IF
1276             END IF
1277 *
1278 *           Do tests 20 and 21
1279 *
1280             CALL CSTT21( N, 0, SD, SE, WA1, DUMMA, Z, LDU, WORK, RWORK,
1281      $                   RESULT20 ) )
1282 *
1283 *           Call CSTEDC(I) to compute D1 and Z, do tests.
1284 *
1285 *           Compute D1 and Z
1286 *
1287             INDE = 1
1288             INDRWK = INDE + N
1289             CALL SCOPY( N, SD, 1, D1, 1 )
1290             IF( N.GT.0 )
1291      $         CALL SCOPY( N-1, SE, 1, RWORK( INDE ), 1 )
1292             CALL CLASET( 'Full', N, N, CZERO, CONE, Z, LDU )
1293 *
1294             NTEST = 22
1295             CALL CSTEDC( 'I', N, D1, RWORK( INDE ), Z, LDU, WORK, LWEDC,
1296      $                   RWORK( INDRWK ), LRWEDC, IWORK, LIWEDC, IINFO )
1297             IF( IINFO.NE.0 ) THEN
1298                WRITE( NOUNIT, FMT = 9999 )'CSTEDC(I)', IINFO, N, JTYPE,
1299      $            IOLDSD
1300                INFO = ABS( IINFO )
1301                IF( IINFO.LT.0 ) THEN
1302                   RETURN
1303                ELSE
1304                   RESULT22 ) = ULPINV
1305                   GO TO 280
1306                END IF
1307             END IF
1308 *
1309 *           Do Tests 22 and 23
1310 *
1311             CALL CSTT21( N, 0, SD, SE, D1, DUMMA, Z, LDU, WORK, RWORK,
1312      $                   RESULT22 ) )
1313 *
1314 *           Call CSTEDC(V) to compute D1 and Z, do tests.
1315 *
1316 *           Compute D1 and Z
1317 *
1318             CALL SCOPY( N, SD, 1, D1, 1 )
1319             IF( N.GT.0 )
1320      $         CALL SCOPY( N-1, SE, 1, RWORK( INDE ), 1 )
1321             CALL CLASET( 'Full', N, N, CZERO, CONE, Z, LDU )
1322 *
1323             NTEST = 24
1324             CALL CSTEDC( 'V', N, D1, RWORK( INDE ), Z, LDU, WORK, LWEDC,
1325      $                   RWORK( INDRWK ), LRWEDC, IWORK, LIWEDC, IINFO )
1326             IF( IINFO.NE.0 ) THEN
1327                WRITE( NOUNIT, FMT = 9999 )'CSTEDC(V)', IINFO, N, JTYPE,
1328      $            IOLDSD
1329                INFO = ABS( IINFO )
1330                IF( IINFO.LT.0 ) THEN
1331                   RETURN
1332                ELSE
1333                   RESULT24 ) = ULPINV
1334                   GO TO 280
1335                END IF
1336             END IF
1337 *
1338 *           Do Tests 24 and 25
1339 *
1340             CALL CSTT21( N, 0, SD, SE, D1, DUMMA, Z, LDU, WORK, RWORK,
1341      $                   RESULT24 ) )
1342 *
1343 *           Call CSTEDC(N) to compute D2, do tests.
1344 *
1345 *           Compute D2
1346 *
1347             CALL SCOPY( N, SD, 1, D2, 1 )
1348             IF( N.GT.0 )
1349      $         CALL SCOPY( N-1, SE, 1, RWORK( INDE ), 1 )
1350             CALL CLASET( 'Full', N, N, CZERO, CONE, Z, LDU )
1351 *
1352             NTEST = 26
1353             CALL CSTEDC( 'N', N, D2, RWORK( INDE ), Z, LDU, WORK, LWEDC,
1354      $                   RWORK( INDRWK ), LRWEDC, IWORK, LIWEDC, IINFO )
1355             IF( IINFO.NE.0 ) THEN
1356                WRITE( NOUNIT, FMT = 9999 )'CSTEDC(N)', IINFO, N, JTYPE,
1357      $            IOLDSD
1358                INFO = ABS( IINFO )
1359                IF( IINFO.LT.0 ) THEN
1360                   RETURN
1361                ELSE
1362                   RESULT26 ) = ULPINV
1363                   GO TO 280
1364                END IF
1365             END IF
1366 *
1367 *           Do Test 26
1368 *
1369             TEMP1 = ZERO
1370             TEMP2 = ZERO
1371 *
1372             DO 210 J = 1, N
1373                TEMP1 = MAX( TEMP1, ABS( D1( J ) ), ABS( D2( J ) ) )
1374                TEMP2 = MAX( TEMP2, ABS( D1( J )-D2( J ) ) )
1375   210       CONTINUE
1376 *
1377             RESULT26 ) = TEMP2 / MAX( UNFL, ULP*MAX( TEMP1, TEMP2 ) )
1378 *
1379 *           Only test CSTEMR if IEEE compliant
1380 *
1381             IF( ILAENV( 10'CSTEMR''VA'1000 ).EQ.1 .AND.
1382      $          ILAENV( 11'CSTEMR''VA'1000 ).EQ.1 ) THEN
1383 *
1384 *           Call CSTEMR, do test 27 (relative eigenvalue accuracy)
1385 *
1386 *              If S is positive definite and diagonally dominant,
1387 *              ask for all eigenvalues with high relative accuracy.
1388 *
1389                VL = ZERO
1390                VU = ZERO
1391                IL = 0
1392                IU = 0
1393                IF( JTYPE.EQ.21 .AND. CREL ) THEN
1394                   NTEST = 27
1395                   ABSTOL = UNFL + UNFL
1396                   CALL CSTEMR( 'V''A', N, SD, SE, VL, VU, IL, IU,
1397      $                         M, WR, Z, LDU, N, IWORK( 1 ), TRYRAC,
1398      $                         RWORK, LRWORK, IWORK( 2*N+1 ), LWORK-2*N,
1399      $                         IINFO )
1400                   IF( IINFO.NE.0 ) THEN
1401                      WRITE( NOUNIT, FMT = 9999 )'CSTEMR(V,A,rel)',
1402      $                  IINFO, N, JTYPE, IOLDSD
1403                      INFO = ABS( IINFO )
1404                      IF( IINFO.LT.0 ) THEN
1405                         RETURN
1406                      ELSE
1407                         RESULT27 ) = ULPINV
1408                         GO TO 270
1409                      END IF
1410                   END IF
1411 *
1412 *              Do test 27
1413 *
1414                   TEMP2 = TWO*( TWO*N-ONE )*ULP*( ONE+EIGHT*HALF**2 ) /
1415      $                    ( ONE-HALF )**4
1416 *
1417                   TEMP1 = ZERO
1418                   DO 220 J = 1, N
1419                      TEMP1 = MAX( TEMP1, ABS( D4( J )-WR( N-J+1 ) ) /
1420      $                       ( ABSTOL+ABS( D4( J ) ) ) )
1421   220             CONTINUE
1422 *
1423                   RESULT27 ) = TEMP1 / TEMP2
1424 *
1425                   IL = 1 + ( N-1 )*INT( SLARND( 1, ISEED2 ) )
1426                   IU = 1 + ( N-1 )*INT( SLARND( 1, ISEED2 ) )
1427                   IF( IU.LT.IL ) THEN
1428                      ITEMP = IU
1429                      IU = IL
1430                      IL = ITEMP
1431                   END IF
1432 *
1433                   IF( CRANGE ) THEN
1434                      NTEST = 28
1435                      ABSTOL = UNFL + UNFL
1436                      CALL CSTEMR( 'V''I', N, SD, SE, VL, VU, IL, IU,
1437      $                            M, WR, Z, LDU, N, IWORK( 1 ), TRYRAC,
1438      $                            RWORK, LRWORK, IWORK( 2*N+1 ),
1439      $                            LWORK-2*N, IINFO )
1440 *
1441                      IF( IINFO.NE.0 ) THEN
1442                         WRITE( NOUNIT, FMT = 9999 )'CSTEMR(V,I,rel)',
1443      $                     IINFO, N, JTYPE, IOLDSD
1444                         INFO = ABS( IINFO )
1445                         IF( IINFO.LT.0 ) THEN
1446                            RETURN
1447                         ELSE
1448                            RESULT28 ) = ULPINV
1449                            GO TO 270
1450                         END IF
1451                      END IF
1452 *
1453 *
1454 *                 Do test 28
1455 *
1456                      TEMP2 = TWO*( TWO*N-ONE )*ULP*
1457      $                       ( ONE+EIGHT*HALF**2 ) / ( ONE-HALF )**4
1458 *
1459                      TEMP1 = ZERO
1460                      DO 230 J = IL, IU
1461                         TEMP1 = MAX( TEMP1, ABS( WR( J-IL+1 )-D4( N-J+
1462      $                          1 ) ) / ( ABSTOL+ABS( WR( J-IL+1 ) ) ) )
1463   230                CONTINUE
1464 *
1465                      RESULT28 ) = TEMP1 / TEMP2
1466                   ELSE
1467                      RESULT28 ) = ZERO
1468                   END IF
1469                ELSE
1470                   RESULT27 ) = ZERO
1471                   RESULT28 ) = ZERO
1472                END IF
1473 *
1474 *           Call CSTEMR(V,I) to compute D1 and Z, do tests.
1475 *
1476 *           Compute D1 and Z
1477 *
1478                CALL SCOPY( N, SD, 1, D5, 1 )
1479                IF( N.GT.0 )
1480      $            CALL SCOPY( N-1, SE, 1, RWORK, 1 )
1481                CALL CLASET( 'Full', N, N, CZERO, CONE, Z, LDU )
1482 *
1483                IF( CRANGE ) THEN
1484                   NTEST = 29
1485                   IL = 1 + ( N-1 )*INT( SLARND( 1, ISEED2 ) )
1486                   IU = 1 + ( N-1 )*INT( SLARND( 1, ISEED2 ) )
1487                   IF( IU.LT.IL ) THEN
1488                      ITEMP = IU
1489                      IU = IL
1490                      IL = ITEMP
1491                   END IF
1492                   CALL CSTEMR( 'V''I', N, D5, RWORK, VL, VU, IL, IU,
1493      $                         M, D1, Z, LDU, N, IWORK( 1 ), TRYRAC,
1494      $                         RWORK( N+1 ), LRWORK-N, IWORK( 2*N+1 ),
1495      $                         LIWORK-2*N, IINFO )
1496                   IF( IINFO.NE.0 ) THEN
1497                      WRITE( NOUNIT, FMT = 9999 )'CSTEMR(V,I)', IINFO,
1498      $                  N, JTYPE, IOLDSD
1499                      INFO = ABS( IINFO )
1500                      IF( IINFO.LT.0 ) THEN
1501                         RETURN
1502                      ELSE
1503                         RESULT29 ) = ULPINV
1504                         GO TO 280
1505                      END IF
1506                   END IF
1507 *
1508 *           Do Tests 29 and 30
1509 *
1510 *
1511 *           Call CSTEMR to compute D2, do tests.
1512 *
1513 *           Compute D2
1514 *
1515                   CALL SCOPY( N, SD, 1, D5, 1 )
1516                   IF( N.GT.0 )
1517      $               CALL SCOPY( N-1, SE, 1, RWORK, 1 )
1518 *
1519                   NTEST = 31
1520                   CALL CSTEMR( 'N''I', N, D5, RWORK, VL, VU, IL, IU,
1521      $                         M, D2, Z, LDU, N, IWORK( 1 ), TRYRAC,
1522      $                         RWORK( N+1 ), LRWORK-N, IWORK( 2*N+1 ),
1523      $                         LIWORK-2*N, IINFO )
1524                   IF( IINFO.NE.0 ) THEN
1525                      WRITE( NOUNIT, FMT = 9999 )'CSTEMR(N,I)', IINFO,
1526      $                  N, JTYPE, IOLDSD
1527                      INFO = ABS( IINFO )
1528                      IF( IINFO.LT.0 ) THEN
1529                         RETURN
1530                      ELSE
1531                         RESULT31 ) = ULPINV
1532                         GO TO 280
1533                      END IF
1534                   END IF
1535 *
1536 *           Do Test 31
1537 *
1538                   TEMP1 = ZERO
1539                   TEMP2 = ZERO
1540 *
1541                   DO 240 J = 1, IU - IL + 1
1542                      TEMP1 = MAX( TEMP1, ABS( D1( J ) ),
1543      $                       ABS( D2( J ) ) )
1544                      TEMP2 = MAX( TEMP2, ABS( D1( J )-D2( J ) ) )
1545   240             CONTINUE
1546 *
1547                   RESULT31 ) = TEMP2 / MAX( UNFL,
1548      $                           ULP*MAX( TEMP1, TEMP2 ) )
1549 *
1550 *
1551 *           Call CSTEMR(V,V) to compute D1 and Z, do tests.
1552 *
1553 *           Compute D1 and Z
1554 *
1555                   CALL SCOPY( N, SD, 1, D5, 1 )
1556                   IF( N.GT.0 )
1557      $               CALL SCOPY( N-1, SE, 1, RWORK, 1 )
1558                   CALL CLASET( 'Full', N, N, CZERO, CONE, Z, LDU )
1559 *
1560                   NTEST = 32
1561 *
1562                   IF( N.GT.0 ) THEN
1563                      IF( IL.NE.1 ) THEN
1564                         VL = D2( IL ) - MAX( HALF*
1565      $                       ( D2( IL )-D2( IL-1 ) ), ULP*ANORM,
1566      $                       TWO*RTUNFL )
1567                      ELSE
1568                         VL = D2( 1 ) - MAX( HALF*( D2( N )-D2( 1 ) ),
1569      $                       ULP*ANORM, TWO*RTUNFL )
1570                      END IF
1571                      IF( IU.NE.N ) THEN
1572                         VU = D2( IU ) + MAX( HALF*
1573      $                       ( D2( IU+1 )-D2( IU ) ), ULP*ANORM,
1574      $                       TWO*RTUNFL )
1575                      ELSE
1576                         VU = D2( N ) + MAX( HALF*( D2( N )-D2( 1 ) ),
1577      $                       ULP*ANORM, TWO*RTUNFL )
1578                      END IF
1579                   ELSE
1580                      VL = ZERO
1581                      VU = ONE
1582                   END IF
1583 *
1584                   CALL CSTEMR( 'V''V', N, D5, RWORK, VL, VU, IL, IU,
1585      $                         M, D1, Z, LDU, N, IWORK( 1 ), TRYRAC,
1586      $                         RWORK( N+1 ), LRWORK-N, IWORK( 2*N+1 ),
1587      $                         LIWORK-2*N, IINFO )
1588                   IF( IINFO.NE.0 ) THEN
1589                      WRITE( NOUNIT, FMT = 9999 )'CSTEMR(V,V)', IINFO,
1590      $                  N, JTYPE, IOLDSD
1591                      INFO = ABS( IINFO )
1592                      IF( IINFO.LT.0 ) THEN
1593                         RETURN
1594                      ELSE
1595                         RESULT32 ) = ULPINV
1596                         GO TO 280
1597                      END IF
1598                   END IF
1599 *
1600 *           Do Tests 32 and 33
1601 *
1602                   CALL CSTT22( N, M, 0, SD, SE, D1, DUMMA, Z, LDU, WORK,
1603      $                         M, RWORK, RESULT32 ) )
1604 *
1605 *           Call CSTEMR to compute D2, do tests.
1606 *
1607 *           Compute D2
1608 *
1609                   CALL SCOPY( N, SD, 1, D5, 1 )
1610                   IF( N.GT.0 )
1611      $               CALL SCOPY( N-1, SE, 1, RWORK, 1 )
1612 *
1613                   NTEST = 34
1614                   CALL CSTEMR( 'N''V', N, D5, RWORK, VL, VU, IL, IU,
1615      $                         M, D2, Z, LDU, N, IWORK( 1 ), TRYRAC,
1616      $                         RWORK( N+1 ), LRWORK-N, IWORK( 2*N+1 ),
1617      $                         LIWORK-2*N, IINFO )
1618                   IF( IINFO.NE.0 ) THEN
1619                      WRITE( NOUNIT, FMT = 9999 )'CSTEMR(N,V)', IINFO,
1620      $                  N, JTYPE, IOLDSD
1621                      INFO = ABS( IINFO )
1622                      IF( IINFO.LT.0 ) THEN
1623                         RETURN
1624                      ELSE
1625                         RESULT34 ) = ULPINV
1626                         GO TO 280
1627                      END IF
1628                   END IF
1629 *
1630 *           Do Test 34
1631 *
1632                   TEMP1 = ZERO
1633                   TEMP2 = ZERO
1634 *
1635                   DO 250 J = 1, IU - IL + 1
1636                      TEMP1 = MAX( TEMP1, ABS( D1( J ) ),
1637      $                       ABS( D2( J ) ) )
1638                      TEMP2 = MAX( TEMP2, ABS( D1( J )-D2( J ) ) )
1639   250             CONTINUE
1640 *
1641                   RESULT34 ) = TEMP2 / MAX( UNFL,
1642      $                           ULP*MAX( TEMP1, TEMP2 ) )
1643                ELSE
1644                   RESULT29 ) = ZERO
1645                   RESULT30 ) = ZERO
1646                   RESULT31 ) = ZERO
1647                   RESULT32 ) = ZERO
1648                   RESULT33 ) = ZERO
1649                   RESULT34 ) = ZERO
1650                END IF
1651 *
1652 *
1653 *           Call CSTEMR(V,A) to compute D1 and Z, do tests.
1654 *
1655 *           Compute D1 and Z
1656 *
1657                CALL SCOPY( N, SD, 1, D5, 1 )
1658                IF( N.GT.0 )
1659      $            CALL SCOPY( N-1, SE, 1, RWORK, 1 )
1660 *
1661                NTEST = 35
1662 *
1663                CALL CSTEMR( 'V''A', N, D5, RWORK, VL, VU, IL, IU,
1664      $                      M, D1, Z, LDU, N, IWORK( 1 ), TRYRAC,
1665      $                      RWORK( N+1 ), LRWORK-N, IWORK( 2*N+1 ),
1666      $                      LIWORK-2*N, IINFO )
1667                IF( IINFO.NE.0 ) THEN
1668                   WRITE( NOUNIT, FMT = 9999 )'CSTEMR(V,A)', IINFO, N,
1669      $               JTYPE, IOLDSD
1670                   INFO = ABS( IINFO )
1671                   IF( IINFO.LT.0 ) THEN
1672                      RETURN
1673                   ELSE
1674                      RESULT35 ) = ULPINV
1675                      GO TO 280
1676                   END IF
1677                END IF
1678 *
1679 *           Do Tests 35 and 36
1680 *
1681                CALL CSTT22( N, M, 0, SD, SE, D1, DUMMA, Z, LDU, WORK, M,
1682      $                      RWORK, RESULT35 ) )
1683 *
1684 *           Call CSTEMR to compute D2, do tests.
1685 *
1686 *           Compute D2
1687 *
1688                CALL SCOPY( N, SD, 1, D5, 1 )
1689                IF( N.GT.0 )
1690      $            CALL SCOPY( N-1, SE, 1, RWORK, 1 )
1691 *
1692                NTEST = 37
1693                CALL CSTEMR( 'N''A', N, D5, RWORK, VL, VU, IL, IU,
1694      $                      M, D2, Z, LDU, N, IWORK( 1 ), TRYRAC,
1695      $                      RWORK( N+1 ), LRWORK-N, IWORK( 2*N+1 ),
1696      $                      LIWORK-2*N, IINFO )
1697                IF( IINFO.NE.0 ) THEN
1698                   WRITE( NOUNIT, FMT = 9999 )'CSTEMR(N,A)', IINFO, N,
1699      $               JTYPE, IOLDSD
1700                   INFO = ABS( IINFO )
1701                   IF( IINFO.LT.0 ) THEN
1702                      RETURN
1703                   ELSE
1704                      RESULT37 ) = ULPINV
1705                      GO TO 280
1706                   END IF
1707                END IF
1708 *
1709 *           Do Test 34
1710 *
1711                TEMP1 = ZERO
1712                TEMP2 = ZERO
1713 *
1714                DO 260 J = 1, N
1715                   TEMP1 = MAX( TEMP1, ABS( D1( J ) ), ABS( D2( J ) ) )
1716                   TEMP2 = MAX( TEMP2, ABS( D1( J )-D2( J ) ) )
1717   260          CONTINUE
1718 *
1719                RESULT37 ) = TEMP2 / MAX( UNFL,
1720      $                        ULP*MAX( TEMP1, TEMP2 ) )
1721             END IF
1722   270       CONTINUE
1723   280       CONTINUE
1724             NTESTT = NTESTT + NTEST
1725 *
1726 *           End of Loop -- Check for RESULT(j) > THRESH
1727 *
1728 *
1729 *           Print out tests which fail.
1730 *
1731             DO 290 JR = 1, NTEST
1732                IFRESULT( JR ).GE.THRESH ) THEN
1733 *
1734 *                 If this is the first test to fail,
1735 *                 print a header to the data file.
1736 *
1737                   IF( NERRS.EQ.0 ) THEN
1738                      WRITE( NOUNIT, FMT = 9998 )'CST'
1739                      WRITE( NOUNIT, FMT = 9997 )
1740                      WRITE( NOUNIT, FMT = 9996 )
1741                      WRITE( NOUNIT, FMT = 9995 )'Hermitian'
1742                      WRITE( NOUNIT, FMT = 9994 )
1743 *
1744 *                    Tests performed
1745 *
1746                      WRITE( NOUNIT, FMT = 9987 )
1747                   END IF
1748                   NERRS = NERRS + 1
1749                   IFRESULT( JR ).LT.10000.0E0 ) THEN
1750                      WRITE( NOUNIT, FMT = 9989 )N, JTYPE, IOLDSD, JR,
1751      $                  RESULT( JR )
1752                   ELSE
1753                      WRITE( NOUNIT, FMT = 9988 )N, JTYPE, IOLDSD, JR,
1754      $                  RESULT( JR )
1755                   END IF
1756                END IF
1757   290       CONTINUE
1758   300    CONTINUE
1759   310 CONTINUE
1760 *
1761 *     Summary
1762 *
1763       CALL SLASUM( 'CST', NOUNIT, NERRS, NTESTT )
1764       RETURN
1765 *
1766  9999 FORMAT' CCHKST: ', A, ' returned INFO=', I6, '.'/ 9X'N=',
1767      $      I6, ', JTYPE=', I6, ', ISEED=('3( I5, ',' ), I5, ')' )
1768 *
1769  9998 FORMAT/ 1X, A3, ' -- Complex Hermitian eigenvalue problem' )
1770  9997 FORMAT' Matrix types (see CCHKST for details): ' )
1771 *
1772  9996 FORMAT/ ' Special Matrices:',
1773      $      / '  1=Zero matrix.                        ',
1774      $      '  5=Diagonal: clustered entries.',
1775      $      / '  2=Identity matrix.                    ',
1776      $      '  6=Diagonal: large, evenly spaced.',
1777      $      / '  3=Diagonal: evenly spaced entries.    ',
1778      $      '  7=Diagonal: small, evenly spaced.',
1779      $      / '  4=Diagonal: geometr. spaced entries.' )
1780  9995 FORMAT' Dense ', A, ' Matrices:',
1781      $      / '  8=Evenly spaced eigenvals.            ',
1782      $      ' 12=Small, evenly spaced eigenvals.',
1783      $      / '  9=Geometrically spaced eigenvals.     ',
1784      $      ' 13=Matrix with random O(1) entries.',
1785      $      / ' 10=Clustered eigenvalues.              ',
1786      $      ' 14=Matrix with large random entries.',
1787      $      / ' 11=Large, evenly spaced eigenvals.     ',
1788      $      ' 15=Matrix with small random entries.' )
1789  9994 FORMAT' 16=Positive definite, evenly spaced eigenvalues',
1790      $      / ' 17=Positive definite, geometrically spaced eigenvlaues',
1791      $      / ' 18=Positive definite, clustered eigenvalues',
1792      $      / ' 19=Positive definite, small evenly spaced eigenvalues',
1793      $      / ' 20=Positive definite, large evenly spaced eigenvalues',
1794      $      / ' 21=Diagonally dominant tridiagonal, geometrically',
1795      $      ' spaced eigenvalues' )
1796 *
1797  9993 FORMAT/ ' Tests performed:   ',
1798      $      '(S is Tridiag, D is diagonal, U and Z are ', A, ','/ 20X,
1799      $      A, ', W is a diagonal matrix of eigenvalues,'/ 20X,
1800      $      ' V is U represented by Householder vectors, and'/ 20X,
1801      $      ' Y is a matrix of eigenvectors of S.)',
1802      $      / ' CHETRD, UPLO=''U'':'/ '  1= | A - V S V', A1,
1803      $      ' | / ( |A| n ulp )     ''  2= | I - U V', A1,
1804      $      ' | / ( n ulp )'/ ' CHETRD, UPLO=''L'':',
1805      $      / '  3= | A - V S V', A1, ' | / ( |A| n ulp )     ',
1806      $      '  4= | I - U V', A1, ' | / ( n ulp )' )
1807  9992 FORMAT' CHPTRD, UPLO=''U'':'/ '  5= | A - V S V', A1,
1808      $      ' | / ( |A| n ulp )     ''  6= | I - U V', A1,
1809      $      ' | / ( n ulp )'/ ' CHPTRD, UPLO=''L'':',
1810      $      / '  7= | A - V S V', A1, ' | / ( |A| n ulp )     ',
1811      $      '  8= | I - U V', A1, ' | / ( n ulp )',
1812      $      / '  9= | S - Z D Z', A1, ' | / ( |S| n ulp )     ',
1813      $      ' 10= | I - Z Z', A1, ' | / ( n ulp )',
1814      $      / ' 11= |D(with Z) - D(w/o Z)| / (|D| ulp) ',
1815      $      ' 12= | D(PWK) - D(QR) | / (|D| ulp)',
1816      $      / ' 13=   Sturm sequence test on W         ' )
1817  9991 FORMAT' 14= | S - Z4 D4 Z4', A1, ' | / (|S| n ulp)',
1818      $      / ' 15= | I - Z4 Z4', A1, ' | / (n ulp ) ',
1819      $      ' 16= | D4 - D5 | / ( 100 |D4| ulp ) ',
1820      $      / ' 17= max | D4(i) - WR(i) | / ( |D4(i)| (2n-1) ulp )',
1821      $      / ' 18= | WA1 - D3 | / ( |D3| ulp )',
1822      $      / ' 19= max | WA2(i) - WA3(ii) | / ( |D3| ulp )',
1823      $      / ' 20= | S - Y WA1 Y', A1, ' | / ( |S| n ulp )',
1824      $      / ' 21= | I - Y Y', A1, ' | / ( n ulp )' )
1825  9990 FORMAT' 22= | S - Z D Z', A1,
1826      $      ' | / ( |S| n ulp ) for CSTEDC(I)'/ ' 23= | I - Z Z', A1,
1827      $      ' | / ( n ulp )       for CSTEDC(I)'/ ' 24= | S - Z D Z',
1828      $      A1, ' | / ( |S| n ulp ) for CSTEDC(V)'/ ' 25= | I - Z Z',
1829      $      A1, ' | / ( n ulp )       for CSTEDC(V)',
1830      $      / ' 26= | D1(CSTEDC(V)) - D2(CSTEDC(N)) | / ( |D1| ulp )' )
1831  9989 FORMAT' Matrix order=', I5, ', type=', I2, ', seed=',
1832      $      4( I4, ',' ), ' result ', I3, ' is', 0P, F8.2 )
1833  9988 FORMAT' Matrix order=', I5, ', type=', I2, ', seed=',
1834      $      4( I4, ',' ), ' result ', I3, ' is', 1P, E10.3 )
1835 *
1836  9987 FORMAT/ 'Test performed:  see CCHKST for details.'/ )
1837 *     End of CCHKST
1838 *
1839       END