1       PROGRAM ZBLAT2
   2 *
   3 *  Test program for the COMPLEX*16          Level 2 Blas.
   4 *
   5 *  The program must be driven by a short data file. The first 17 records
   6 *  of the file are read using list-directed input, the last 17 records
   7 *  are read using the format ( A12, L2 ). An annotated example of a data
   8 *  file can be obtained by deleting the first 3 characters from the
   9 *  following 34 lines:
  10 *  'CBLAT2.SNAP'     NAME OF SNAPSHOT OUTPUT FILE
  11 *  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)
  12 *  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.
  13 *  F        LOGICAL FLAG, T TO STOP ON FAILURES.
  14 *  T        LOGICAL FLAG, T TO TEST ERROR EXITS.
  15 *  2        0 TO TEST COLUMN-MAJOR, 1 TO TEST ROW-MAJOR, 2 TO TEST BOTH
  16 *  16.0     THRESHOLD VALUE OF TEST RATIO
  17 *  6                 NUMBER OF VALUES OF N
  18 *  0 1 2 3 5 9       VALUES OF N
  19 *  4                 NUMBER OF VALUES OF K
  20 *  0 1 2 4           VALUES OF K
  21 *  4                 NUMBER OF VALUES OF INCX AND INCY
  22 *  1 2 -1 -2         VALUES OF INCX AND INCY
  23 *  3                 NUMBER OF VALUES OF ALPHA
  24 *  (0.0,0.0) (1.0,0.0) (0.7,-0.9)       VALUES OF ALPHA
  25 *  3                 NUMBER OF VALUES OF BETA
  26 *  (0.0,0.0) (1.0,0.0) (1.3,-1.1)       VALUES OF BETA
  27 *  cblas_zgemv  T PUT F FOR NO TEST. SAME COLUMNS.
  28 *  cblas_zgbmv  T PUT F FOR NO TEST. SAME COLUMNS.
  29 *  cblas_zhemv  T PUT F FOR NO TEST. SAME COLUMNS.
  30 *  cblas_zhbmv  T PUT F FOR NO TEST. SAME COLUMNS.
  31 *  cblas_zhpmv  T PUT F FOR NO TEST. SAME COLUMNS.
  32 *  cblas_ztrmv  T PUT F FOR NO TEST. SAME COLUMNS.
  33 *  cblas_ztbmv  T PUT F FOR NO TEST. SAME COLUMNS.
  34 *  cblas_ztpmv  T PUT F FOR NO TEST. SAME COLUMNS.
  35 *  cblas_ztrsv  T PUT F FOR NO TEST. SAME COLUMNS.
  36 *  cblas_ztbsv  T PUT F FOR NO TEST. SAME COLUMNS.
  37 *  cblas_ztpsv  T PUT F FOR NO TEST. SAME COLUMNS.
  38 *  cblas_zgerc  T PUT F FOR NO TEST. SAME COLUMNS.
  39 *  cblas_zgeru  T PUT F FOR NO TEST. SAME COLUMNS.
  40 *  cblas_zher   T PUT F FOR NO TEST. SAME COLUMNS.
  41 *  cblas_zhpr   T PUT F FOR NO TEST. SAME COLUMNS.
  42 *  cblas_zher2  T PUT F FOR NO TEST. SAME COLUMNS.
  43 *  cblas_zhpr2  T PUT F FOR NO TEST. SAME COLUMNS.
  44 *
  45 *     See:
  46 *
  47 *        Dongarra J. J., Du Croz J. J., Hammarling S.  and Hanson R. J..
  48 *        An  extended  set of Fortran  Basic Linear Algebra Subprograms.
  49 *
  50 *        Technical  Memoranda  Nos. 41 (revision 3) and 81,  Mathematics
  51 *        and  Computer Science  Division,  Argonne  National Laboratory,
  52 *        9700 South Cass Avenue, Argonne, Illinois 60439, US.
  53 *
  54 *        Or
  55 *
  56 *        NAG  Technical Reports TR3/87 and TR4/87,  Numerical Algorithms
  57 *        Group  Ltd.,  NAG  Central  Office,  256  Banbury  Road, Oxford
  58 *        OX2 7DE, UK,  and  Numerical Algorithms Group Inc.,  1101  31st
  59 *        Street,  Suite 100,  Downers Grove,  Illinois 60515-1263,  USA.
  60 *
  61 *
  62 *  -- Written on 10-August-1987.
  63 *     Richard Hanson, Sandia National Labs.
  64 *     Jeremy Du Croz, NAG Central Office.
  65 *
  66 *     .. Parameters ..
  67       INTEGER            NIN, NOUT
  68       PARAMETER          ( NIN = 5, NOUT = 6 )
  69       INTEGER            NSUBS
  70       PARAMETER          ( NSUBS = 17 )
  71       COMPLEX*16         ZERO, ONE
  72       PARAMETER          ( ZERO = ( 0.0D00.0D0 ), 
  73      $                    ONE = ( 1.0D00.0D0 ) )
  74       DOUBLE PRECISION   RZERO, RHALF, RONE
  75       PARAMETER          ( RZERO = 0.0D0, RHALF = 0.5D0, RONE = 1.0D0 )
  76       INTEGER            NMAX, INCMAX
  77       PARAMETER          ( NMAX = 65, INCMAX = 2 )
  78       INTEGER            NINMAX, NIDMAX, NKBMAX, NALMAX, NBEMAX
  79       PARAMETER          ( NINMAX = 7, NIDMAX = 9, NKBMAX = 7,
  80      $                   NALMAX = 7, NBEMAX = 7 )
  81 *     .. Local Scalars ..
  82       DOUBLE PRECISION   EPS, ERR, THRESH
  83       INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NINC, NKB,
  84      $                   NTRA, LAYOUT
  85       LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,
  86      $                   TSTERR, CORDER, RORDER
  87       CHARACTER*1        TRANS
  88       CHARACTER*12       SNAMET
  89       CHARACTER*32       SNAPS
  90 *     .. Local Arrays ..
  91       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ),
  92      $                   ALF( NALMAX ), AS( NMAX*NMAX ), BET( NBEMAX ),
  93      $                   X( NMAX ), XS( NMAX*INCMAX ),
  94      $                   XX( NMAX*INCMAX ), Y( NMAX ),
  95      $                   YS( NMAX*INCMAX ), YT( NMAX ),
  96      $                   YY( NMAX*INCMAX ), Z( 2*NMAX )
  97       DOUBLE PRECISION   G( NMAX )
  98       INTEGER            IDIM( NIDMAX ), INC( NINMAX ), KB( NKBMAX )
  99       LOGICAL            LTEST( NSUBS )
 100       CHARACTER*12       SNAMES( NSUBS )
 101 *     .. External Functions ..
 102       DOUBLE PRECISION   DDIFF
 103       LOGICAL            LZE
 104       EXTERNAL           DDIFF, LZE
 105 *     .. External Subroutines ..
 106       EXTERNAL           ZCHK1, ZCHK2, ZCHK3, ZCHK4, ZCHK5, ZCHK6,
 107      $                   CZ2CHKE, ZMVCH
 108 *     .. Intrinsic Functions ..
 109       INTRINSIC          ABSMAXMIN
 110 *     .. Scalars in Common ..
 111       INTEGER            INFOT, NOUTC
 112       LOGICAL            OK
 113       CHARACTER*12       SRNAMT
 114 *     .. Common blocks ..
 115       COMMON             /INFOC/INFOT, NOUTC, OK
 116       COMMON             /SRNAMC/SRNAMT
 117 *     .. Data statements ..
 118       DATA               SNAMES/'cblas_zgemv ''cblas_zgbmv ',
 119      $                   'cblas_zhemv ','cblas_zhbmv ','cblas_zhpmv ',
 120      $                   'cblas_ztrmv ','cblas_ztbmv ','cblas_ztpmv ',
 121      $                   'cblas_ztrsv ','cblas_ztbsv ','cblas_ztpsv ',
 122      $                   'cblas_zgerc ','cblas_zgeru ','cblas_zher  ',
 123      $                   'cblas_zhpr  ','cblas_zher2 ','cblas_zhpr2 '/
 124 *     .. Executable Statements ..
 125 *
 126       NOUTC = NOUT
 127 *
 128 *     Read name and unit number for summary output file and open file.
 129 *
 130       READ( NIN, FMT = * )SNAPS
 131       READ( NIN, FMT = * )NTRA
 132       TRACE = NTRA.GE.0
 133       IF( TRACE )THEN
 134          OPEN( NTRA, FILE = SNAPS )
 135       END IF
 136 *     Read the flag that directs rewinding of the snapshot file.
 137       READ( NIN, FMT = * )REWI
 138       REWI = REWI.AND.TRACE
 139 *     Read the flag that directs stopping on any failure.
 140       READ( NIN, FMT = * )SFATAL
 141 *     Read the flag that indicates whether error exits are to be tested.
 142       READ( NIN, FMT = * )TSTERR
 143 *     Read the flag that indicates whether row-major data layout to be tested.
 144       READ( NIN, FMT = * )LAYOUT
 145 *     Read the threshold value of the test ratio
 146       READ( NIN, FMT = * )THRESH
 147 *
 148 *     Read and check the parameter values for the tests.
 149 *
 150 *     Values of N
 151       READ( NIN, FMT = * )NIDIM
 152       IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN
 153          WRITE( NOUT, FMT = 9997 )'N', NIDMAX
 154          GO TO 230
 155       END IF
 156       READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )
 157       DO 10 I = 1, NIDIM
 158          IFIDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN
 159             WRITE( NOUT, FMT = 9996 )NMAX
 160             GO TO 230
 161          END IF
 162    10 CONTINUE
 163 *     Values of K
 164       READ( NIN, FMT = * )NKB
 165       IF( NKB.LT.1.OR.NKB.GT.NKBMAX )THEN
 166          WRITE( NOUT, FMT = 9997 )'K', NKBMAX
 167          GO TO 230
 168       END IF
 169       READ( NIN, FMT = * )( KB( I ), I = 1, NKB )
 170       DO 20 I = 1, NKB
 171          IF( KB( I ).LT.0 )THEN
 172             WRITE( NOUT, FMT = 9995 )
 173             GO TO 230
 174          END IF
 175    20 CONTINUE
 176 *     Values of INCX and INCY
 177       READ( NIN, FMT = * )NINC
 178       IF( NINC.LT.1.OR.NINC.GT.NINMAX )THEN
 179          WRITE( NOUT, FMT = 9997 )'INCX AND INCY', NINMAX
 180          GO TO 230
 181       END IF
 182       READ( NIN, FMT = * )( INC( I ), I = 1, NINC )
 183       DO 30 I = 1, NINC
 184          IF( INC( I ).EQ.0.OR.ABS( INC( I ) ).GT.INCMAX )THEN
 185             WRITE( NOUT, FMT = 9994 )INCMAX
 186             GO TO 230
 187          END IF
 188    30 CONTINUE
 189 *     Values of ALPHA
 190       READ( NIN, FMT = * )NALF
 191       IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN
 192          WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX
 193          GO TO 230
 194       END IF
 195       READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )
 196 *     Values of BETA
 197       READ( NIN, FMT = * )NBET
 198       IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN
 199          WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX
 200          GO TO 230
 201       END IF
 202       READ( NIN, FMT = * )( BET( I ), I = 1, NBET )
 203 *
 204 *     Report values of parameters.
 205 *
 206       WRITE( NOUT, FMT = 9993 )
 207       WRITE( NOUT, FMT = 9992 )( IDIM( I ), I = 1, NIDIM )
 208       WRITE( NOUT, FMT = 9991 )( KB( I ), I = 1, NKB )
 209       WRITE( NOUT, FMT = 9990 )( INC( I ), I = 1, NINC )
 210       WRITE( NOUT, FMT = 9989 )( ALF( I ), I = 1, NALF )
 211       WRITE( NOUT, FMT = 9988 )( BET( I ), I = 1, NBET )
 212       IF.NOT.TSTERR )THEN
 213          WRITE( NOUT, FMT = * )
 214          WRITE( NOUT, FMT = 9980 )
 215       END IF
 216       WRITE( NOUT, FMT = * )
 217       WRITE( NOUT, FMT = 9999 )THRESH
 218       WRITE( NOUT, FMT = * )
 219       RORDER = .FALSE.
 220       CORDER = .FALSE.
 221       IF (LAYOUT.EQ.2THEN
 222          RORDER = .TRUE.
 223          CORDER = .TRUE.
 224          WRITE*FMT = 10002 )
 225       ELSE IF (LAYOUT.EQ.1THEN
 226          RORDER = .TRUE.
 227          WRITE*FMT = 10001 )
 228       ELSE IF (LAYOUT.EQ.0THEN
 229          CORDER = .TRUE.
 230          WRITE*FMT = 10000 )
 231       END IF
 232       WRITE*FMT = * )
 233 *
 234 *     Read names of subroutines and flags which indicate
 235 *     whether they are to be tested.
 236 *
 237       DO 40 I = 1, NSUBS
 238          LTEST( I ) = .FALSE.
 239    40 CONTINUE
 240    50 READ( NIN, FMT = 9984END = 80 )SNAMET, LTESTT
 241       DO 60 I = 1, NSUBS
 242          IF( SNAMET.EQ.SNAMES( I ) )
 243      $      GO TO 70
 244    60 CONTINUE
 245       WRITE( NOUT, FMT = 9986 )SNAMET
 246       STOP
 247    70 LTEST( I ) = LTESTT
 248       GO TO 50
 249 *
 250    80 CONTINUE
 251       CLOSE ( NIN )
 252 *
 253 *     Compute EPS (the machine precision).
 254 *
 255       EPS = RONE
 256    90 CONTINUE
 257       IF( DDIFF( RONE + EPS, RONE ).EQ.RZERO )
 258      $   GO TO 100
 259       EPS = RHALF*EPS
 260       GO TO 90
 261   100 CONTINUE
 262       EPS = EPS + EPS
 263       WRITE( NOUT, FMT = 9998 )EPS
 264 *
 265 *     Check the reliability of ZMVCH using exact data.
 266 *
 267       N = MIN32, NMAX )
 268       DO 120 J = 1, N
 269          DO 110 I = 1, N
 270             A( I, J ) = MAX( I - J + 10 )
 271   110    CONTINUE
 272          X( J ) = J
 273          Y( J ) = ZERO
 274   120 CONTINUE
 275       DO 130 J = 1, N
 276          YY( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3
 277   130 CONTINUE
 278 *     YY holds the exact result. On exit from CMVCH YT holds
 279 *     the result computed by CMVCH.
 280       TRANS = 'N'
 281       CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, X, 1, ZERO, Y, 1, YT, G,
 282      $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )
 283       SAME = LZE( YY, YT, N )
 284       IF.NOT.SAME.OR.ERR.NE.RZERO )THEN
 285          WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR
 286          STOP
 287       END IF
 288       TRANS = 'T'
 289       CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, X, -1, ZERO, Y, -1, YT, G,
 290      $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )
 291       SAME = LZE( YY, YT, N )
 292       IF.NOT.SAME.OR.ERR.NE.RZERO )THEN
 293          WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR
 294          STOP
 295       END IF
 296 *
 297 *     Test each subroutine in turn.
 298 *
 299       DO 210 ISNUM = 1, NSUBS
 300          WRITE( NOUT, FMT = * )
 301          IF.NOT.LTEST( ISNUM ) )THEN
 302 *           Subprogram is not to be tested.
 303             WRITE( NOUT, FMT = 9983 )SNAMES( ISNUM )
 304          ELSE
 305             SRNAMT = SNAMES( ISNUM )
 306 *           Test error exits.
 307             IF( TSTERR )THEN
 308                CALL CZ2CHKE( SNAMES( ISNUM ) )
 309                WRITE( NOUT, FMT = * )
 310             END IF
 311 *           Test computations.
 312             INFOT = 0
 313             OK = .TRUE.
 314             FATAL = .FALSE.
 315             GO TO ( 140140150150150160160,
 316      $              160160160160170170180,
 317      $              180190190 )ISNUM
 318 *           Test ZGEMV, 01, and ZGBMV, 02.
 319   140       IF (CORDER) THEN
 320             CALL ZCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 321      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
 322      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
 323      $                  X, XX, XS, Y, YY, YS, YT, G, 0 )
 324             END IF
 325             IF (RORDER) THEN
 326             CALL ZCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 327      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
 328      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
 329      $                  X, XX, XS, Y, YY, YS, YT, G, 1 )
 330             END IF
 331             GO TO 200
 332 *           Test ZHEMV, 03, ZHBMV, 04, and ZHPMV, 05.
 333   150      IF (CORDER) THEN
 334            CALL ZCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 335      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
 336      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
 337      $                  X, XX, XS, Y, YY, YS, YT, G, 0 )
 338            END IF
 339            IF (RORDER) THEN
 340            CALL ZCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 341      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
 342      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
 343      $                  X, XX, XS, Y, YY, YS, YT, G, 1 )
 344            END IF
 345             GO TO 200
 346 *           Test ZTRMV, 06, ZTBMV, 07, ZTPMV, 08,
 347 *           ZTRSV, 09, ZTBSV, 10, and ZTPSV, 11.
 348   160      IF (CORDER) THEN
 349            CALL ZCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 350      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC,
 351      $                  NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z, 
 352      $          0 )
 353            END IF
 354            IF (RORDER) THEN
 355            CALL ZCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 356      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC,
 357      $                  NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z, 
 358      $          1 )
 359            END IF
 360             GO TO 200
 361 *           Test ZGERC, 12, ZGERU, 13.
 362   170      IF (CORDER) THEN
 363            CALL ZCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 364      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
 365      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
 366      $                  YT, G, Z, 0 )
 367            END IF
 368            IF (RORDER) THEN
 369            CALL ZCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 370      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
 371      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
 372      $                  YT, G, Z, 1 )
 373            END IF
 374             GO TO 200
 375 *           Test ZHER, 14, and ZHPR, 15.
 376   180      IF (CORDER) THEN
 377            CALL ZCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 378      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
 379      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
 380      $                  YT, G, Z, 0 )
 381            END IF
 382            IF (RORDER) THEN
 383            CALL ZCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 384      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
 385      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
 386      $                  YT, G, Z, 1 )
 387            END IF
 388             GO TO 200
 389 *           Test ZHER2, 16, and ZHPR2, 17.
 390   190      IF (CORDER) THEN
 391            CALL ZCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 392      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
 393      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
 394      $                  YT, G, Z, 0 )
 395            END IF
 396            IF (RORDER) THEN
 397            CALL ZCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
 398      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
 399      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
 400      $                  YT, G, Z, 1 )
 401            END IF
 402 *
 403   200       IF( FATAL.AND.SFATAL )
 404      $         GO TO 220
 405          END IF
 406   210 CONTINUE
 407       WRITE( NOUT, FMT = 9982 )
 408       GO TO 240
 409 *
 410   220 CONTINUE
 411       WRITE( NOUT, FMT = 9981 )
 412       GO TO 240
 413 *
 414   230 CONTINUE
 415       WRITE( NOUT, FMT = 9987 )
 416 *
 417   240 CONTINUE
 418       IF( TRACE )
 419      $   CLOSE ( NTRA )
 420       CLOSE ( NOUT )
 421       STOP
 422 *
 423 10002 FORMAT' COLUMN-MAJOR AND ROW-MAJOR DATA LAYOUTS ARE TESTED' )
 424 10001 FORMAT' ROW-MAJOR DATA LAYOUT IS TESTED' )
 425 10000 FORMAT' COLUMN-MAJOR DATA LAYOUT IS TESTED' )
 426  9999 FORMAT(' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',
 427      $      'S THAN'F8.2 )
 428  9998 FORMAT' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )
 429  9997 FORMAT(' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',
 430      $      'THAN ', I2 )
 431  9996 FORMAT' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )
 432  9995 FORMAT' VALUE OF K IS LESS THAN 0' )
 433  9994 FORMAT' ABSOLUTE VALUE OF INCX OR INCY IS 0 OR GREATER THAN ',
 434      $      I2 )
 435  9993 FORMAT(' TESTS OF THE COMPLEX*16      LEVEL 2 BLAS'//' THE F',
 436      $      'OLLOWING PARAMETER VALUES WILL BE USED:' )
 437  9992 FORMAT'   FOR N              ', 9I6 )
 438  9991 FORMAT'   FOR K              ', 7I6 )
 439  9990 FORMAT'   FOR INCX AND INCY  ', 7I6 )
 440  9989 FORMAT'   FOR ALPHA          ',
 441      $      7('('F4.1','F4.1')  ', : ) )
 442  9988 FORMAT'   FOR BETA           ',
 443      $      7('('F4.1','F4.1')  ', : ) )
 444  9987 FORMAT' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',
 445      $      /' ******* TESTS ABANDONED *******' )
 446  9986 FORMAT(' SUBPROGRAM NAME ',A12, ' NOT RECOGNIZED'/' ******* T',
 447      $      'ESTS ABANDONED *******' )
 448  9985 FORMAT(' ERROR IN CMVCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',
 449      $      'ATED WRONGLY.'/' CMVCH WAS CALLED WITH TRANS = ', A1,
 450      $      ' AND RETURNED SAME = ', L1, ' AND ERR = 'F12.3'.'/
 451      $  ' THIS MAY BE DUE TO FAULTS IN THE ARITHMETIC OR THE COMPILER.'
 452      $      , /' ******* TESTS ABANDONED *******' )
 453  9984 FORMAT( A12, L2 )
 454  9983 FORMAT1X,A12, ' WAS NOT TESTED' )
 455  9982 FORMAT/' END OF TESTS' )
 456  9981 FORMAT/' ******* FATAL ERROR - TESTS ABANDONED *******' )
 457  9980 FORMAT' ERROR-EXITS WILL NOT BE TESTED' )
 458 *
 459 *     End of ZBLAT2.
 460 *
 461       END
 462       SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
 463      $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,
 464      $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,
 465      $                  XS, Y, YY, YS, YT, G, IORDER )
 466 *
 467 *  Tests CGEMV and CGBMV.
 468 *
 469 *  Auxiliary routine for test program for Level 2 Blas.
 470 *
 471 *  -- Written on 10-August-1987.
 472 *     Richard Hanson, Sandia National Labs.
 473 *     Jeremy Du Croz, NAG Central Office.
 474 *
 475 *     .. Parameters ..
 476       COMPLEX*16        ZERO, HALF
 477       PARAMETER         ( ZERO = ( 0.0D00.0D0 ), 
 478      $                  HALF = ( 0.5D00.0D0 ) )
 479       DOUBLE PRECISION  RZERO
 480       PARAMETER         ( RZERO = 0.0D0 )
 481 *     .. Scalar Arguments ..
 482       DOUBLE PRECISION   EPS, THRESH
 483       INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,
 484      $                   NOUT, NTRA, IORDER
 485       LOGICAL            FATAL, REWI, TRACE
 486       CHARACTER*12       SNAME
 487 *     .. Array Arguments ..
 488       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
 489      $                   AS( NMAX*NMAX ), BET( NBET ), X( NMAX ),
 490      $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),
 491      $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),
 492      $                   YY( NMAX*INCMAX )
 493       DOUBLE PRECISION   G( NMAX )
 494       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
 495 *     .. Local Scalars ..
 496       COMPLEX*16         ALPHA, ALS, BETA, BLS, TRANSL
 497       DOUBLE PRECISION   ERR, ERRMAX
 498       INTEGER            I, IA, IB, IC, IKU, IM, IN, INCX, INCXS, INCY,
 499      $                   INCYS, IX, IY, KL, KLS, KU, KUS, LAA, LDA,
 500      $                   LDAS, LX, LY, M, ML, MS, N, NARGS, NC, ND, NK,
 501      $                   NL, NS
 502       LOGICAL            BANDED, FULL, NULL, RESET, SAME, TRAN
 503       CHARACTER*1        TRANS, TRANSS
 504       CHARACTER*14       CTRANS
 505       CHARACTER*3        ICH
 506 *     .. Local Arrays ..
 507       LOGICAL            ISAME( 13 )
 508 *     .. External Functions ..
 509       LOGICAL            LZE, LZERES
 510       EXTERNAL           LZE, LZERES
 511 *     .. External Subroutines ..
 512       EXTERNAL           CZGBMV, CZGEMV, ZMAKE, ZMVCH
 513 *     .. Intrinsic Functions ..
 514       INTRINSIC          ABSMAXMIN
 515 *     .. Scalars in Common ..
 516       INTEGER            INFOT, NOUTC
 517       LOGICAL             OK
 518 *     .. Common blocks ..
 519       COMMON             /INFOC/INFOT, NOUTC, OK
 520 *     .. Data statements ..
 521       DATA               ICH/'NTC'/
 522 *     .. Executable Statements ..
 523       FULL = SNAME( 99 ).EQ.'e'
 524       BANDED = SNAME( 99 ).EQ.'b'
 525 *     Define the number of arguments.
 526       IF( FULL )THEN
 527          NARGS = 11
 528       ELSE IF( BANDED )THEN
 529          NARGS = 13
 530       END IF
 531 *
 532       NC = 0
 533       RESET = .TRUE.
 534       ERRMAX = RZERO
 535 *
 536       DO 120 IN = 1, NIDIM
 537          N = IDIMIN )
 538          ND = N/2 + 1
 539 *
 540          DO 110 IM = 12
 541             IF( IM.EQ.1 )
 542      $         M = MAX( N - ND, 0 )
 543             IF( IM.EQ.2 )
 544      $         M = MIN( N + ND, NMAX )
 545 *
 546             IF( BANDED )THEN
 547                NK = NKB
 548             ELSE
 549                NK = 1
 550             END IF
 551             DO 100 IKU = 1, NK
 552                IF( BANDED )THEN
 553                   KU = KB( IKU )
 554                   KL = MAX( KU - 10 )
 555                ELSE
 556                   KU = N - 1
 557                   KL = M - 1
 558                END IF
 559 *              Set LDA to 1 more than minimum value if room.
 560                IF( BANDED )THEN
 561                   LDA = KL + KU + 1
 562                ELSE
 563                   LDA = M
 564                END IF
 565                IF( LDA.LT.NMAX )
 566      $            LDA = LDA + 1
 567 *              Skip tests if not enough room.
 568                IF( LDA.GT.NMAX )
 569      $            GO TO 100
 570                LAA = LDA*N
 571                NULL = N.LE.0.OR.M.LE.0
 572 *
 573 *              Generate the matrix A.
 574 *
 575                TRANSL = ZERO
 576                CALL ZMAKE( SNAME( 89 ), ' '' ', M, N, A, NMAX, AA,
 577      $                     LDA, KL, KU, RESET, TRANSL )
 578 *
 579                DO 90 IC = 13
 580                   TRANS = ICH( IC: IC )
 581                   IF (TRANS.EQ.'N')THEN
 582                      CTRANS = '  CblasNoTrans'
 583                   ELSE IF (TRANS.EQ.'T')THEN
 584                      CTRANS = '    CblasTrans'
 585                   ELSE 
 586                      CTRANS = 'CblasConjTrans'
 587                   END IF
 588                   TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'
 589 *
 590                   IF( TRAN )THEN
 591                      ML = N
 592                      NL = M
 593                   ELSE
 594                      ML = M
 595                      NL = N
 596                   END IF
 597 *
 598                   DO 80 IX = 1, NINC
 599                      INCX = INC( IX )
 600                      LX = ABS( INCX )*NL
 601 *
 602 *                    Generate the vector X.
 603 *
 604                      TRANSL = HALF
 605                      CALL ZMAKE( 'ge'' '' '1, NL, X, 1, XX,
 606      $                          ABS( INCX ), 0, NL - 1, RESET, TRANSL )
 607                      IF( NL.GT.1 )THEN
 608                         X( NL/2 ) = ZERO
 609                         XX( 1 + ABS( INCX )*( NL/2 - 1 ) ) = ZERO
 610                      END IF
 611 *
 612                      DO 70 IY = 1, NINC
 613                         INCY = INC( IY )
 614                         LY = ABS( INCY )*ML
 615 *
 616                         DO 60 IA = 1, NALF
 617                            ALPHA = ALF( IA )
 618 *
 619                            DO 50 IB = 1, NBET
 620                               BETA = BET( IB )
 621 *
 622 *                             Generate the vector Y.
 623 *
 624                               TRANSL = ZERO
 625                               CALL ZMAKE( 'ge'' '' '1, ML, Y, 1,
 626      $                                    YY, ABS( INCY ), 0, ML - 1,
 627      $                                    RESET, TRANSL )
 628 *
 629                               NC = NC + 1
 630 *
 631 *                             Save every datum before calling the
 632 *                             subroutine.
 633 *
 634                               TRANSS = TRANS
 635                               MS = M
 636                               NS = N
 637                               KLS = KL
 638                               KUS = KU
 639                               ALS = ALPHA
 640                               DO 10 I = 1, LAA
 641                                  AS( I ) = AA( I )
 642    10                         CONTINUE
 643                               LDAS = LDA
 644                               DO 20 I = 1, LX
 645                                  XS( I ) = XX( I )
 646    20                         CONTINUE
 647                               INCXS = INCX
 648                               BLS = BETA
 649                               DO 30 I = 1, LY
 650                                  YS( I ) = YY( I )
 651    30                         CONTINUE
 652                               INCYS = INCY
 653 *
 654 *                             Call the subroutine.
 655 *
 656                               IF( FULL )THEN
 657                                  IF( TRACE )
 658      $                              WRITE( NTRA, FMT = 9994 )NC, SNAME,
 659      $                             CTRANS, M, N, ALPHA, LDA, INCX, BETA,
 660      $                              INCY
 661                                  IF( REWI )
 662      $                              REWIND NTRA
 663                                  CALL CZGEMV( IORDER, TRANS, M, N,
 664      $                                      ALPHA, AA, LDA, XX, INCX,
 665      $                                      BETA, YY, INCY )
 666                               ELSE IF( BANDED )THEN
 667                                  IF( TRACE )
 668      $                              WRITE( NTRA, FMT = 9995 )NC, SNAME,
 669      $                              CTRANS, M, N, KL, KU, ALPHA, LDA,
 670      $                              INCX, BETA, INCY
 671                                  IF( REWI )
 672      $                              REWIND NTRA
 673                                  CALL CZGBMV( IORDER, TRANS, M, N, KL,
 674      $                                       KU, ALPHA, AA, LDA, XX,
 675      $                                       INCX, BETA, YY, INCY )
 676                               END IF
 677 *
 678 *                            Check if error-exit was taken incorrectly.
 679 *
 680                               IF.NOT.OK )THEN
 681                                  WRITE( NOUT, FMT = 9993 )
 682                                  FATAL = .TRUE.
 683                                  GO TO 130
 684                               END IF
 685 *
 686 *                             See what data changed inside subroutines.
 687 *
 688 *        IF(TRANS .NE. 'C' .OR. (INCX .GT. 0 .AND. INCY .GT. 0)) THEN 
 689                               ISAME( 1 ) = TRANS.EQ.TRANSS
 690                               ISAME( 2 ) = MS.EQ.M
 691                               ISAME( 3 ) = NS.EQ.N
 692                               IF( FULL )THEN
 693                                  ISAME( 4 ) = ALS.EQ.ALPHA
 694                                  ISAME( 5 ) = LZE( AS, AA, LAA )
 695                                  ISAME( 6 ) = LDAS.EQ.LDA
 696                                  ISAME( 7 ) = LZE( XS, XX, LX )
 697                                  ISAME( 8 ) = INCXS.EQ.INCX
 698                                  ISAME( 9 ) = BLS.EQ.BETA
 699                                  IFNULL )THEN
 700                                     ISAME( 10 ) = LZE( YS, YY, LY )
 701                                  ELSE
 702                                     ISAME( 10 ) = LZERES( 'ge'' '1,
 703      $                                            ML, YS, YY,
 704      $                                            ABS( INCY ) )
 705                                  END IF
 706                                  ISAME( 11 ) = INCYS.EQ.INCY
 707                               ELSE IF( BANDED )THEN
 708                                  ISAME( 4 ) = KLS.EQ.KL
 709                                  ISAME( 5 ) = KUS.EQ.KU
 710                                  ISAME( 6 ) = ALS.EQ.ALPHA
 711                                  ISAME( 7 ) = LZE( AS, AA, LAA )
 712                                  ISAME( 8 ) = LDAS.EQ.LDA
 713                                  ISAME( 9 ) = LZE( XS, XX, LX )
 714                                  ISAME( 10 ) = INCXS.EQ.INCX
 715                                  ISAME( 11 ) = BLS.EQ.BETA
 716                                  IFNULL )THEN
 717                                     ISAME( 12 ) = LZE( YS, YY, LY )
 718                                  ELSE
 719                                     ISAME( 12 ) = LZERES( 'ge'' '1,
 720      $                                            ML, YS, YY,
 721      $                                            ABS( INCY ) )
 722                                  END IF
 723                                  ISAME( 13 ) = INCYS.EQ.INCY
 724                               END IF
 725 *
 726 *                             If data was incorrectly changed, report
 727 *                             and return.
 728 *
 729                               SAME = .TRUE.
 730                               DO 40 I = 1, NARGS
 731                                  SAME = SAME.AND.ISAME( I )
 732                                  IF.NOT.ISAME( I ) )
 733      $                              WRITE( NOUT, FMT = 9998 )I
 734    40                         CONTINUE
 735                               IF.NOT.SAME )THEN
 736                                  FATAL = .TRUE.
 737                                  GO TO 130
 738                               END IF
 739 *
 740                               IF.NOT.NULL )THEN
 741 *
 742 *                                Check the result.
 743 *
 744                                  CALL ZMVCH( TRANS, M, N, ALPHA, A,
 745      $                                       NMAX, X, INCX, BETA, Y,
 746      $                                       INCY, YT, G, YY, EPS, ERR,
 747      $                                       FATAL, NOUT, .TRUE. )
 748                                  ERRMAX = MAX( ERRMAX, ERR )
 749 *                                If got really bad answer, report and
 750 *                                return.
 751                                  IF( FATAL )
 752      $                              GO TO 130
 753                               ELSE
 754 *                                Avoid repeating tests with M.le.0 or
 755 *                                N.le.0.
 756                                  GO TO 110
 757                               END IF
 758 *                          END IF
 759 *
 760    50                      CONTINUE
 761 *
 762    60                   CONTINUE
 763 *
 764    70                CONTINUE
 765 *
 766    80             CONTINUE
 767 *
 768    90          CONTINUE
 769 *
 770   100       CONTINUE
 771 *
 772   110    CONTINUE
 773 *
 774   120 CONTINUE
 775 *
 776 *     Report result.
 777 *
 778       IF( ERRMAX.LT.THRESH )THEN
 779          WRITE( NOUT, FMT = 9999 )SNAME, NC
 780       ELSE
 781          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
 782       END IF
 783       GO TO 140
 784 *
 785   130 CONTINUE
 786       WRITE( NOUT, FMT = 9996 )SNAME
 787       IF( FULL )THEN
 788          WRITE( NOUT, FMT = 9994 )NC, SNAME, CTRANS, M, N, ALPHA, LDA,
 789      $      INCX, BETA, INCY
 790       ELSE IF( BANDED )THEN
 791          WRITE( NOUT, FMT = 9995 )NC, SNAME, CTRANS, M, N, KL, KU,
 792      $      ALPHA, LDA, INCX, BETA, INCY
 793       END IF
 794 *
 795   140 CONTINUE
 796       RETURN
 797 *
 798  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
 799      $      'S)' )
 800  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
 801      $      'ANGED INCORRECTLY *******' )
 802  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
 803      $      'ALLS)'/' ******* BUT WITH MAXIMUM TEST RATIO'F8.2,
 804      $      ' - SUSPECT *******' )
 805  9996 FORMAT' ******* ',A12, ' FAILED ON CALL NUMBER:' )
 806  9995 FORMAT1X, I6, ': ',A12, '(', A14, ','4( I3, ',' ), '(',
 807      $      F4.1','F4.1'), A,',/ 10x, I3, ', X,', I2, ',(',
 808      $      F4.1','F4.1'), Y,', I2, ') .' )
 809  9994 FORMAT1X, I6, ': ',A12, '(', A14, ','2( I3, ',' ), '(',
 810      $      F4.1','F4.1'), A,',/ 10x, I3, ', X,', I2, ',(',
 811      $       F4.1','F4.1'), Y,', I2, ') .' )
 812  9993 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
 813      $      '******' )
 814 *
 815 *     End of ZCHK1.
 816 *
 817       END
 818       SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
 819      $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,
 820      $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,
 821      $                  XS, Y, YY, YS, YT, G, IORDER )
 822 *
 823 *  Tests CHEMV, CHBMV and CHPMV.
 824 *
 825 *  Auxiliary routine for test program for Level 2 Blas.
 826 *
 827 *  -- Written on 10-August-1987.
 828 *     Richard Hanson, Sandia National Labs.
 829 *     Jeremy Du Croz, NAG Central Office.
 830 *
 831 *     .. Parameters ..
 832       COMPLEX*16         ZERO, HALF
 833       PARAMETER          ( ZERO = ( 0.0D00.0D0 ),
 834      $                   HALF = ( 0.5D00.0D0 ) )
 835       DOUBLE PRECISION   RZERO
 836       PARAMETER          ( RZERO = 0.0D0 )
 837 *     .. Scalar Arguments ..
 838       DOUBLE PRECISION   EPS, THRESH
 839       INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,
 840      $                   NOUT, NTRA, IORDER
 841       LOGICAL            FATAL, REWI, TRACE
 842       CHARACTER*12       SNAME
 843 *     .. Array Arguments ..
 844       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
 845      $                   AS( NMAX*NMAX ), BET( NBET ), X( NMAX ),
 846      $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),
 847      $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),
 848      $                   YY( NMAX*INCMAX )
 849       DOUBLE PRECISION   G( NMAX )
 850       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
 851 *     .. Local Scalars ..
 852       COMPLEX*16         ALPHA, ALS, BETA, BLS, TRANSL
 853       DOUBLE PRECISION   ERR, ERRMAX
 854       INTEGER            I, IA, IB, IC, IK, IN, INCX, INCXS, INCY,
 855      $                   INCYS, IX, IY, K, KS, LAA, LDA, LDAS, LX, LY,
 856      $                   N, NARGS, NC, NK, NS
 857       LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME
 858       CHARACTER*1        UPLO, UPLOS
 859       CHARACTER*14       CUPLO
 860       CHARACTER*2        ICH
 861 *     .. Local Arrays ..
 862       LOGICAL            ISAME( 13 )
 863 *     .. External Functions ..
 864       LOGICAL            LZE, LZERES
 865       EXTERNAL           LZE, LZERES
 866 *     .. External Subroutines ..
 867       EXTERNAL           CZHBMV, CZHEMV, CZHPMV, ZMAKE, ZMVCH
 868 *     .. Intrinsic Functions ..
 869       INTRINSIC          ABSMAX
 870 *     .. Scalars in Common ..
 871       INTEGER            INFOT, NOUTC
 872       LOGICAL             OK
 873 *     .. Common blocks ..
 874       COMMON             /INFOC/INFOT, NOUTC, OK
 875 *     .. Data statements ..
 876       DATA               ICH/'UL'/
 877 *     .. Executable Statements ..
 878       FULL = SNAME( 99 ).EQ.'e'
 879       BANDED = SNAME( 99 ).EQ.'b'
 880       PACKED = SNAME( 99 ).EQ.'p'
 881 *     Define the number of arguments.
 882       IF( FULL )THEN
 883          NARGS = 10
 884       ELSE IF( BANDED )THEN
 885          NARGS = 11
 886       ELSE IF( PACKED )THEN
 887          NARGS = 9
 888       END IF
 889 *
 890       NC = 0
 891       RESET = .TRUE.
 892       ERRMAX = RZERO
 893 *
 894       DO 110 IN = 1, NIDIM
 895          N = IDIMIN )
 896 *
 897          IF( BANDED )THEN
 898             NK = NKB
 899          ELSE
 900             NK = 1
 901          END IF
 902          DO 100 IK = 1, NK
 903             IF( BANDED )THEN
 904                K = KB( IK )
 905             ELSE
 906                K = N - 1
 907             END IF
 908 *           Set LDA to 1 more than minimum value if room.
 909             IF( BANDED )THEN
 910                LDA = K + 1
 911             ELSE
 912                LDA = N
 913             END IF
 914             IF( LDA.LT.NMAX )
 915      $         LDA = LDA + 1
 916 *           Skip tests if not enough room.
 917             IF( LDA.GT.NMAX )
 918      $         GO TO 100
 919             IF( PACKED )THEN
 920                LAA = ( N*( N + 1 ) )/2
 921             ELSE
 922                LAA = LDA*N
 923             END IF
 924             NULL = N.LE.0
 925 *
 926             DO 90 IC = 12
 927                UPLO = ICH( IC: IC )
 928                IF (UPLO.EQ.'U')THEN
 929                   CUPLO = '    CblasUpper'
 930                ELSE 
 931                   CUPLO = '    CblasLower'
 932                END IF
 933 *
 934 *              Generate the matrix A.
 935 *
 936                TRANSL = ZERO
 937                CALL ZMAKE( SNAME( 89 ), UPLO, ' ', N, N, A, NMAX, AA,
 938      $                     LDA, K, K, RESET, TRANSL )
 939 *
 940                DO 80 IX = 1, NINC
 941                   INCX = INC( IX )
 942                   LX = ABS( INCX )*N
 943 *
 944 *                 Generate the vector X.
 945 *
 946                   TRANSL = HALF
 947                   CALL ZMAKE( 'ge'' '' '1, N, X, 1, XX,
 948      $                        ABS( INCX ), 0, N - 1, RESET, TRANSL )
 949                   IF( N.GT.1 )THEN
 950                      X( N/2 ) = ZERO
 951                      XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
 952                   END IF
 953 *
 954                   DO 70 IY = 1, NINC
 955                      INCY = INC( IY )
 956                      LY = ABS( INCY )*N
 957 *
 958                      DO 60 IA = 1, NALF
 959                         ALPHA = ALF( IA )
 960 *
 961                         DO 50 IB = 1, NBET
 962                            BETA = BET( IB )
 963 *
 964 *                          Generate the vector Y.
 965 *
 966                            TRANSL = ZERO
 967                            CALL ZMAKE( 'ge'' '' '1, N, Y, 1, YY,
 968      $                                 ABS( INCY ), 0, N - 1, RESET,
 969      $                                 TRANSL )
 970 *
 971                            NC = NC + 1
 972 *
 973 *                          Save every datum before calling the
 974 *                          subroutine.
 975 *
 976                            UPLOS = UPLO
 977                            NS = N
 978                            KS = K
 979                            ALS = ALPHA
 980                            DO 10 I = 1, LAA
 981                               AS( I ) = AA( I )
 982    10                      CONTINUE
 983                            LDAS = LDA
 984                            DO 20 I = 1, LX
 985                               XS( I ) = XX( I )
 986    20                      CONTINUE
 987                            INCXS = INCX
 988                            BLS = BETA
 989                            DO 30 I = 1, LY
 990                               YS( I ) = YY( I )
 991    30                      CONTINUE
 992                            INCYS = INCY
 993 *
 994 *                          Call the subroutine.
 995 *
 996                            IF( FULL )THEN
 997                               IF( TRACE )
 998      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
 999      $                           CUPLO, N, ALPHA, LDA, INCX, BETA, INCY
1000                               IF( REWI )
1001      $                           REWIND NTRA
1002                               CALL CZHEMV( IORDER, UPLO, N, ALPHA, AA,
1003      $                                    LDA, XX, INCX, BETA, YY,
1004      $                                    INCY )
1005                            ELSE IF( BANDED )THEN
1006                               IF( TRACE )
1007      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
1008      $                           CUPLO, N, K, ALPHA, LDA, INCX, BETA,
1009      $                           INCY
1010                               IF( REWI )
1011      $                           REWIND NTRA
1012                               CALL CZHBMV( IORDER, UPLO, N, K, ALPHA,
1013      $                                    AA, LDA, XX, INCX, BETA,
1014      $                                    YY, INCY )
1015                            ELSE IF( PACKED )THEN
1016                               IF( TRACE )
1017      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
1018      $                           CUPLO, N, ALPHA, INCX, BETA, INCY
1019                               IF( REWI )
1020      $                           REWIND NTRA
1021                               CALL CZHPMV( IORDER, UPLO, N, ALPHA, AA,
1022      $                                    XX, INCX, BETA, YY, INCY )
1023                            END IF
1024 *
1025 *                          Check if error-exit was taken incorrectly.
1026 *
1027                            IF.NOT.OK )THEN
1028                               WRITE( NOUT, FMT = 9992 )
1029                               FATAL = .TRUE.
1030                               GO TO 120
1031                            END IF
1032 *
1033 *                          See what data changed inside subroutines.
1034 *
1035                            ISAME( 1 ) = UPLO.EQ.UPLOS
1036                            ISAME( 2 ) = NS.EQ.N
1037                            IF( FULL )THEN
1038                               ISAME( 3 ) = ALS.EQ.ALPHA
1039                               ISAME( 4 ) = LZE( AS, AA, LAA )
1040                               ISAME( 5 ) = LDAS.EQ.LDA
1041                               ISAME( 6 ) = LZE( XS, XX, LX )
1042                               ISAME( 7 ) = INCXS.EQ.INCX
1043                               ISAME( 8 ) = BLS.EQ.BETA
1044                               IFNULL )THEN
1045                                  ISAME( 9 ) = LZE( YS, YY, LY )
1046                               ELSE
1047                                  ISAME( 9 ) = LZERES( 'ge'' '1, N,
1048      $                                        YS, YY, ABS( INCY ) )
1049                               END IF
1050                               ISAME( 10 ) = INCYS.EQ.INCY
1051                            ELSE IF( BANDED )THEN
1052                               ISAME( 3 ) = KS.EQ.K
1053                               ISAME( 4 ) = ALS.EQ.ALPHA
1054                               ISAME( 5 ) = LZE( AS, AA, LAA )
1055                               ISAME( 6 ) = LDAS.EQ.LDA
1056                               ISAME( 7 ) = LZE( XS, XX, LX )
1057                               ISAME( 8 ) = INCXS.EQ.INCX
1058                               ISAME( 9 ) = BLS.EQ.BETA
1059                               IFNULL )THEN
1060                                  ISAME( 10 ) = LZE( YS, YY, LY )
1061                               ELSE
1062                                  ISAME( 10 ) = LZERES( 'ge'' '1, N,
1063      $                                         YS, YY, ABS( INCY ) )
1064                               END IF
1065                               ISAME( 11 ) = INCYS.EQ.INCY
1066                            ELSE IF( PACKED )THEN
1067                               ISAME( 3 ) = ALS.EQ.ALPHA
1068                               ISAME( 4 ) = LZE( AS, AA, LAA )
1069                               ISAME( 5 ) = LZE( XS, XX, LX )
1070                               ISAME( 6 ) = INCXS.EQ.INCX
1071                               ISAME( 7 ) = BLS.EQ.BETA
1072                               IFNULL )THEN
1073                                  ISAME( 8 ) = LZE( YS, YY, LY )
1074                               ELSE
1075                                  ISAME( 8 ) = LZERES( 'ge'' '1, N,
1076      $                                        YS, YY, ABS( INCY ) )
1077                               END IF
1078                               ISAME( 9 ) = INCYS.EQ.INCY
1079                            END IF
1080 *
1081 *                          If data was incorrectly changed, report and
1082 *                          return.
1083 *
1084                            SAME = .TRUE.
1085                            DO 40 I = 1, NARGS
1086                               SAME = SAME.AND.ISAME( I )
1087                               IF.NOT.ISAME( I ) )
1088      $                           WRITE( NOUT, FMT = 9998 )I
1089    40                      CONTINUE
1090                            IF.NOT.SAME )THEN
1091                               FATAL = .TRUE.
1092                               GO TO 120
1093                            END IF
1094 *
1095                            IF.NOT.NULL )THEN
1096 *
1097 *                             Check the result.
1098 *
1099                               CALL ZMVCH( 'N', N, N, ALPHA, A, NMAX, X,
1100      $                                    INCX, BETA, Y, INCY, YT, G,
1101      $                                    YY, EPS, ERR, FATAL, NOUT,
1102      $                                    .TRUE. )
1103                               ERRMAX = MAX( ERRMAX, ERR )
1104 *                             If got really bad answer, report and
1105 *                             return.
1106                               IF( FATAL )
1107      $                           GO TO 120
1108                            ELSE
1109 *                             Avoid repeating tests with N.le.0
1110                               GO TO 110
1111                            END IF
1112 *
1113    50                   CONTINUE
1114 *
1115    60                CONTINUE
1116 *
1117    70             CONTINUE
1118 *
1119    80          CONTINUE
1120 *
1121    90       CONTINUE
1122 *
1123   100    CONTINUE
1124 *
1125   110 CONTINUE
1126 *
1127 *     Report result.
1128 *
1129       IF( ERRMAX.LT.THRESH )THEN
1130          WRITE( NOUT, FMT = 9999 )SNAME, NC
1131       ELSE
1132          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
1133       END IF
1134       GO TO 130
1135 *
1136   120 CONTINUE
1137       WRITE( NOUT, FMT = 9996 )SNAME
1138       IF( FULL )THEN
1139          WRITE( NOUT, FMT = 9993 )NC, SNAME, CUPLO, N, ALPHA, LDA, INCX,
1140      $      BETA, INCY
1141       ELSE IF( BANDED )THEN
1142          WRITE( NOUT, FMT = 9994 )NC, SNAME, CUPLO, N, K, ALPHA, LDA,
1143      $      INCX, BETA, INCY
1144       ELSE IF( PACKED )THEN
1145          WRITE( NOUT, FMT = 9995 )NC, SNAME, CUPLO, N, ALPHA, INCX,
1146      $      BETA, INCY
1147       END IF
1148 *
1149   130 CONTINUE
1150       RETURN
1151 *
1152  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
1153      $      'S)' )
1154  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
1155      $      'ANGED INCORRECTLY *******' )
1156  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
1157      $      'ALLS)'/' ******* BUT WITH MAXIMUM TEST RATIO'F8.2,
1158      $      ' - SUSPECT *******' )
1159  9996 FORMAT' ******* ',A12, ' FAILED ON CALL NUMBER:' )
1160  9995 FORMAT1X, I6, ': ',A12, '(', A14, ',', I3, ',('F4.1',',
1161      $      F4.1'), AP, X,',/ 10x, I2, ',('F4.1','F4.1,
1162      $      '), Y,', I2, ') .' )
1163  9994 FORMAT1X, I6, ': ',A12, '(', A14, ','2( I3, ',' ), '(',
1164      $      F4.1','F4.1'), A,', I3, ', X,',/ 10x, I2, ',(',
1165      $      F4.1','F4.1'), Y,', I2, ') .' )
1166  9993 FORMAT1X, I6, ': ',A12, '(', A14, ',', I3, ',('F4.1',',
1167      $     F4.1'), A,', I3, ', X,',/ 10x, I2, ',('F4.1',',
1168      $     F4.1'), ''Y,', I2, ') .' )
1169  9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
1170      $      '******' )
1171 *
1172 *     End of CZHK2.
1173 *
1174       END
1175       SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
1176      $                  FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX,
1177      $                 INCMAX, A, AA, AS, X, XX, XS, XT, G, Z, IORDER )
1178 *
1179 *  Tests ZTRMV, ZTBMV, ZTPMV, ZTRSV, ZTBSV and ZTPSV.
1180 *
1181 *  Auxiliary routine for test program for Level 2 Blas.
1182 *
1183 *  -- Written on 10-August-1987.
1184 *     Richard Hanson, Sandia National Labs.
1185 *     Jeremy Du Croz, NAG Central Office.
1186 *
1187 *     .. Parameters ..
1188       COMPLEX*16         ZERO, HALF, ONE
1189       PARAMETER          ( ZERO = ( 0.0D00.0D0 ),
1190      $                   HALF = ( 0.5D00.0D0 ),
1191      $                   ONE = ( 1.0D00.0D0 ) )
1192       DOUBLE PRECISION   RZERO
1193       PARAMETER          ( RZERO = 0.0D0 )
1194 *     .. Scalar Arguments ..
1195       DOUBLE PRECISION   EPS, THRESH
1196       INTEGER            INCMAX, NIDIM, NINC, NKB, NMAX, NOUT, NTRA,
1197      $                   IORDER
1198       LOGICAL            FATAL, REWI, TRACE
1199       CHARACTER*12       SNAME
1200 *     .. Array Arguments ..
1201       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ),
1202      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
1203      $                   XT( NMAX ), XX( NMAX*INCMAX ), Z( NMAX )
1204       DOUBLE PRECISION   G( NMAX )
1205       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
1206 *     .. Local Scalars ..
1207       COMPLEX*16         TRANSL
1208       DOUBLE PRECISION   ERR, ERRMAX
1209       INTEGER            I, ICD, ICT, ICU, IK, IN, INCX, INCXS, IX, K,
1210      $                   KS, LAA, LDA, LDAS, LX, N, NARGS, NC, NK, NS
1211       LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME
1212       CHARACTER*1        DIAG, DIAGS, TRANS, TRANSS, UPLO, UPLOS
1213       CHARACTER*14       CUPLO,CTRANS,CDIAG
1214       CHARACTER*2        ICHD, ICHU
1215       CHARACTER*3        ICHT
1216 *     .. Local Arrays ..
1217       LOGICAL            ISAME( 13 )
1218 *     .. External Functions ..
1219       LOGICAL            LZE, LZERES
1220       EXTERNAL           LZE, LZERES
1221 *     .. External Subroutines ..
1222       EXTERNAL           ZMAKE, ZMVCH, CZTBMV, CZTBSV, CZTPMV,
1223      $                   CZTPSV, CZTRMV, CZTRSV
1224 *     .. Intrinsic Functions ..
1225       INTRINSIC          ABSMAX
1226 *     .. Scalars in Common ..
1227       INTEGER            INFOT, NOUTC
1228       LOGICAL             OK
1229 *     .. Common blocks ..
1230       COMMON             /INFOC/INFOT, NOUTC, OK
1231 *     .. Data statements ..
1232       DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/
1233 *     .. Executable Statements ..
1234       FULL = SNAME( 99 ).EQ.'r'
1235       BANDED = SNAME( 99 ).EQ.'b'
1236       PACKED = SNAME( 99 ).EQ.'p'
1237 *     Define the number of arguments.
1238       IF( FULL )THEN
1239          NARGS = 8
1240       ELSE IF( BANDED )THEN
1241          NARGS = 9
1242       ELSE IF( PACKED )THEN
1243          NARGS = 7
1244       END IF
1245 *
1246       NC = 0
1247       RESET = .TRUE.
1248       ERRMAX = RZERO
1249 *     Set up zero vector for ZMVCH.
1250       DO 10 I = 1, NMAX
1251          Z( I ) = ZERO
1252    10 CONTINUE
1253 *
1254       DO 110 IN = 1, NIDIM
1255          N = IDIMIN )
1256 *
1257          IF( BANDED )THEN
1258             NK = NKB
1259          ELSE
1260             NK = 1
1261          END IF
1262          DO 100 IK = 1, NK
1263             IF( BANDED )THEN
1264                K = KB( IK )
1265             ELSE
1266                K = N - 1
1267             END IF
1268 *           Set LDA to 1 more than minimum value if room.
1269             IF( BANDED )THEN
1270                LDA = K + 1
1271             ELSE
1272                LDA = N
1273             END IF
1274             IF( LDA.LT.NMAX )
1275      $         LDA = LDA + 1
1276 *           Skip tests if not enough room.
1277             IF( LDA.GT.NMAX )
1278      $         GO TO 100
1279             IF( PACKED )THEN
1280                LAA = ( N*( N + 1 ) )/2
1281             ELSE
1282                LAA = LDA*N
1283             END IF
1284             NULL = N.LE.0
1285 *
1286             DO 90 ICU = 12
1287                UPLO = ICHU( ICU: ICU )
1288                IF (UPLO.EQ.'U')THEN
1289                   CUPLO = '    CblasUpper'
1290                ELSE 
1291                   CUPLO = '    CblasLower'
1292                END IF
1293 *
1294                DO 80 ICT = 13
1295                   TRANS = ICHT( ICT: ICT )
1296                   IF (TRANS.EQ.'N')THEN
1297                      CTRANS = '  CblasNoTrans'
1298                   ELSE IF (TRANS.EQ.'T')THEN
1299                      CTRANS = '    CblasTrans'
1300                   ELSE 
1301                      CTRANS = 'CblasConjTrans'
1302                   END IF
1303 *
1304                   DO 70 ICD = 12
1305                      DIAG = ICHD( ICD: ICD )
1306                      IF (DIAG.EQ.'N')THEN
1307                         CDIAG = '  CblasNonUnit'
1308                      ELSE
1309                         CDIAG = '     CblasUnit'
1310                      END IF
1311 *
1312 *                    Generate the matrix A.
1313 *
1314                      TRANSL = ZERO
1315                      CALL ZMAKE( SNAME( 89 ), UPLO, DIAG, N, N, A,
1316      $                           NMAX, AA, LDA, K, K, RESET, TRANSL )
1317 *
1318                      DO 60 IX = 1, NINC
1319                         INCX = INC( IX )
1320                         LX = ABS( INCX )*N
1321 *
1322 *                       Generate the vector X.
1323 *
1324                         TRANSL = HALF
1325                         CALL ZMAKE( 'ge'' '' '1, N, X, 1, XX,
1326      $                              ABS( INCX ), 0, N - 1, RESET,
1327      $                              TRANSL )
1328                         IF( N.GT.1 )THEN
1329                            X( N/2 ) = ZERO
1330                            XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
1331                         END IF
1332 *
1333                         NC = NC + 1
1334 *
1335 *                       Save every datum before calling the subroutine.
1336 *
1337                         UPLOS = UPLO
1338                         TRANSS = TRANS
1339                         DIAGS = DIAG
1340                         NS = N
1341                         KS = K
1342                         DO 20 I = 1, LAA
1343                            AS( I ) = AA( I )
1344    20                   CONTINUE
1345                         LDAS = LDA
1346                         DO 30 I = 1, LX
1347                            XS( I ) = XX( I )
1348    30                   CONTINUE
1349                         INCXS = INCX
1350 *
1351 *                       Call the subroutine.
1352 *
1353                         IF( SNAME( 45 ).EQ.'mv' )THEN
1354                            IF( FULL )THEN
1355                               IF( TRACE )
1356      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
1357      $                           CUPLO, CTRANS, CDIAG, N, LDA, INCX
1358                               IF( REWI )
1359      $                           REWIND NTRA
1360                               CALL CZTRMV( IORDER, UPLO, TRANS, DIAG,
1361      $                                    N, AA, LDA, XX, INCX )
1362                            ELSE IF( BANDED )THEN
1363                               IF( TRACE )
1364      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
1365      $                           CUPLO, CTRANS, CDIAG, N, K, LDA, INCX
1366                               IF( REWI )
1367      $                           REWIND NTRA
1368                               CALL CZTBMV( IORDER, UPLO, TRANS, DIAG,
1369      $                                    N, K, AA, LDA, XX, INCX )
1370                            ELSE IF( PACKED )THEN
1371                               IF( TRACE )
1372      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
1373      $                           CUPLO, CTRANS, CDIAG, N, INCX
1374                               IF( REWI )
1375      $                           REWIND NTRA
1376                               CALL CZTPMV( IORDER, UPLO, TRANS, DIAG,
1377      $                                    N, AA, XX, INCX )
1378                            END IF
1379                         ELSE IF( SNAME( 45 ).EQ.'sv' )THEN
1380                            IF( FULL )THEN
1381                               IF( TRACE )
1382      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
1383      $                           CUPLO, CTRANS, CDIAG, N, LDA, INCX
1384                               IF( REWI )
1385      $                           REWIND NTRA
1386                               CALL CZTRSV( IORDER, UPLO, TRANS, DIAG,
1387      $                                    N, AA, LDA, XX, INCX )
1388                            ELSE IF( BANDED )THEN
1389                               IF( TRACE )
1390      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
1391      $                           CUPLO, CTRANS, CDIAG, N, K, LDA, INCX
1392                               IF( REWI )
1393      $                           REWIND NTRA
1394                               CALL CZTBSV( IORDER, UPLO, TRANS, DIAG,
1395      $                                    N, K, AA, LDA, XX, INCX )
1396                            ELSE IF( PACKED )THEN
1397                               IF( TRACE )
1398      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
1399      $                           CUPLO, CTRANS, CDIAG, N, INCX
1400                               IF( REWI )
1401      $                           REWIND NTRA
1402                               CALL CZTPSV( IORDER, UPLO, TRANS, DIAG,
1403      $                                    N, AA, XX, INCX )
1404                            END IF
1405                         END IF
1406 *
1407 *                       Check if error-exit was taken incorrectly.
1408 *
1409                         IF.NOT.OK )THEN
1410                            WRITE( NOUT, FMT = 9992 )
1411                            FATAL = .TRUE.
1412                            GO TO 120
1413                         END IF
1414 *
1415 *                       See what data changed inside subroutines.
1416 *
1417                         ISAME( 1 ) = UPLO.EQ.UPLOS
1418                         ISAME( 2 ) = TRANS.EQ.TRANSS
1419                         ISAME( 3 ) = DIAG.EQ.DIAGS
1420                         ISAME( 4 ) = NS.EQ.N
1421                         IF( FULL )THEN
1422                            ISAME( 5 ) = LZE( AS, AA, LAA )
1423                            ISAME( 6 ) = LDAS.EQ.LDA
1424                            IFNULL )THEN
1425                               ISAME( 7 ) = LZE( XS, XX, LX )
1426                            ELSE
1427                               ISAME( 7 ) = LZERES( 'ge'' '1, N, XS,
1428      $                                     XX, ABS( INCX ) )
1429                            END IF
1430                            ISAME( 8 ) = INCXS.EQ.INCX
1431                         ELSE IF( BANDED )THEN
1432                            ISAME( 5 ) = KS.EQ.K
1433                            ISAME( 6 ) = LZE( AS, AA, LAA )
1434                            ISAME( 7 ) = LDAS.EQ.LDA
1435                            IFNULL )THEN
1436                               ISAME( 8 ) = LZE( XS, XX, LX )
1437                            ELSE
1438                               ISAME( 8 ) = LZERES( 'ge'' '1, N, XS,
1439      $                                     XX, ABS( INCX ) )
1440                            END IF
1441                            ISAME( 9 ) = INCXS.EQ.INCX
1442                         ELSE IF( PACKED )THEN
1443                            ISAME( 5 ) = LZE( AS, AA, LAA )
1444                            IFNULL )THEN
1445                               ISAME( 6 ) = LZE( XS, XX, LX )
1446                            ELSE
1447                               ISAME( 6 ) = LZERES( 'ge'' '1, N, XS,
1448      $                                     XX, ABS( INCX ) )
1449                            END IF
1450                            ISAME( 7 ) = INCXS.EQ.INCX
1451                         END IF
1452 *
1453 *                       If data was incorrectly changed, report and
1454 *                       return.
1455 *
1456                         SAME = .TRUE.
1457                         DO 40 I = 1, NARGS
1458                            SAME = SAME.AND.ISAME( I )
1459                            IF.NOT.ISAME( I ) )
1460      $                        WRITE( NOUT, FMT = 9998 )I
1461    40                   CONTINUE
1462                         IF.NOT.SAME )THEN
1463                            FATAL = .TRUE.
1464                            GO TO 120
1465                         END IF
1466 *
1467                         IF.NOT.NULL )THEN
1468                            IF( SNAME( 45 ).EQ.'mv' )THEN
1469 *
1470 *                             Check the result.
1471 *
1472                               CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, X,
1473      $                                    INCX, ZERO, Z, INCX, XT, G,
1474      $                                    XX, EPS, ERR, FATAL, NOUT,
1475      $                                    .TRUE. )
1476                            ELSE IF( SNAME( 45 ).EQ.'sv' )THEN
1477 *
1478 *                             Compute approximation to original vector.
1479 *
1480                               DO 50 I = 1, N
1481                                  Z( I ) = XX( 1 + ( I - 1 )*
1482      $                                    ABS( INCX ) )
1483                                  XX( 1 + ( I - 1 )*ABS( INCX ) )
1484      $                              = X( I )
1485    50                         CONTINUE
1486                               CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, Z,
1487      $                                    INCX, ZERO, X, INCX, XT, G,
1488      $                                    XX, EPS, ERR, FATAL, NOUT,
1489      $                                    .FALSE. )
1490                            END IF
1491                            ERRMAX = MAX( ERRMAX, ERR )
1492 *                          If got really bad answer, report and return.
1493                            IF( FATAL )
1494      $                        GO TO 120
1495                         ELSE
1496 *                          Avoid repeating tests with N.le.0.
1497                            GO TO 110
1498                         END IF
1499 *
1500    60                CONTINUE
1501 *
1502    70             CONTINUE
1503 *
1504    80          CONTINUE
1505 *
1506    90       CONTINUE
1507 *
1508   100    CONTINUE
1509 *
1510   110 CONTINUE
1511 *
1512 *     Report result.
1513 *
1514       IF( ERRMAX.LT.THRESH )THEN
1515          WRITE( NOUT, FMT = 9999 )SNAME, NC
1516       ELSE
1517          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
1518       END IF
1519       GO TO 130
1520 *
1521   120 CONTINUE
1522       WRITE( NOUT, FMT = 9996 )SNAME
1523       IF( FULL )THEN
1524          WRITE( NOUT, FMT = 9993 )NC, SNAME, CUPLO, CTRANS, CDIAG, N,
1525      $          LDA, INCX
1526       ELSE IF( BANDED )THEN
1527          WRITE( NOUT, FMT = 9994 )NC, SNAME, CUPLO, CTRANS, CDIAG, N, K,
1528      $      LDA, INCX
1529       ELSE IF( PACKED )THEN
1530          WRITE( NOUT, FMT = 9995 )NC, SNAME, CUPLO, CTRANS, CDIAG, N,
1531      $          INCX
1532       END IF
1533 *
1534   130 CONTINUE
1535       RETURN
1536 *
1537  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
1538      $      'S)' )
1539  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
1540      $      'ANGED INCORRECTLY *******' )
1541  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
1542      $      'ALLS)'/' ******* BUT WITH MAXIMUM TEST RATIO'F8.2,
1543      $      ' - SUSPECT *******' )
1544  9996 FORMAT' ******* ',A12, ' FAILED ON CALL NUMBER:' )
1545  9995 FORMAT(1X, I6, ': ',A12, '('3( A14, ',' ),/ 10x, I3, ', AP, ',
1546      $      'X,', I2, ') .' )
1547  9994 FORMAT(1X, I6, ': ',A12, '('3( A14, ',' ),/ 10x,  2( I3, ',' ),
1548      $     ' A,', I3, ', X,', I2, ') .' )
1549  9993 FORMAT1X, I6, ': ',A12, '('3( A14, ',' ),/ 10x, I3, ', A,',
1550      $      I3, ', X,', I2, ') .' )
1551  9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
1552      $      '******' )
1553 *
1554 *     End of ZCHK3.
1555 *
1556       END
1557       SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
1558      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
1559      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
1560      $                  Z, IORDER )
1561 *
1562 *  Tests ZGERC and ZGERU.
1563 *
1564 *  Auxiliary routine for test program for Level 2 Blas.
1565 *
1566 *  -- Written on 10-August-1987.
1567 *     Richard Hanson, Sandia National Labs.
1568 *     Jeremy Du Croz, NAG Central Office.
1569 *
1570 *     .. Parameters ..
1571       COMPLEX*16         ZERO, HALF, ONE
1572       PARAMETER          ( ZERO = ( 0.0D00.0D0 ), 
1573      $                   HALF = ( 0.5D00.0D0 ),
1574      $                   ONE = ( 1.0D00.0D0 ) )
1575       DOUBLE PRECISION   RZERO
1576       PARAMETER          ( RZERO = 0.0D0 )
1577 *     .. Scalar Arguments ..
1578       DOUBLE PRECISION   EPS, THRESH
1579       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA,
1580      $                   IORDER
1581       LOGICAL            FATAL, REWI, TRACE
1582       CHARACTER*12       SNAME
1583 *     .. Array Arguments ..
1584       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
1585      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
1586      $                   XX( NMAX*INCMAX ), Y( NMAX ),
1587      $                   YS( NMAX*INCMAX ), YT( NMAX ),
1588      $                   YY( NMAX*INCMAX ), Z( NMAX )
1589       DOUBLE PRECISION   G( NMAX )
1590       INTEGER            IDIM( NIDIM ), INC( NINC )
1591 *     .. Local Scalars ..
1592       COMPLEX*16         ALPHA, ALS, TRANSL
1593       DOUBLE PRECISION   ERR, ERRMAX
1594       INTEGER            I, IA, IM, IN, INCX, INCXS, INCY, INCYS, IX,
1595      $                  IY, J, LAA, LDA, LDAS, LX, LY, M, MS, N, NARGS,
1596      $                   NC, ND, NS
1597       LOGICAL            CONJ, NULL, RESET, SAME
1598 *     .. Local Arrays ..
1599       COMPLEX*16         W( 1 )
1600       LOGICAL            ISAME( 13 )
1601 *     .. External Functions ..
1602       LOGICAL            LZE, LZERES
1603       EXTERNAL           LZE, LZERES
1604 *     .. External Subroutines ..
1605       EXTERNAL           CZGERC, CZGERU, ZMAKE, ZMVCH
1606 *     .. Intrinsic Functions ..
1607       INTRINSIC          ABSDCONJGMAXMIN
1608 *     .. Scalars in Common ..
1609       INTEGER            INFOT, NOUTC
1610       LOGICAL             OK
1611 *     .. Common blocks ..
1612       COMMON             /INFOC/INFOT, NOUTC, OK
1613 *     .. Executable Statements ..
1614       CONJ = SNAME( 55 ).EQ.'c'
1615 *     Define the number of arguments.
1616       NARGS = 9
1617 *
1618       NC = 0
1619       RESET = .TRUE.
1620       ERRMAX = RZERO
1621 *
1622       DO 120 IN = 1, NIDIM
1623          N = IDIMIN )
1624          ND = N/2 + 1
1625 *
1626          DO 110 IM = 12
1627             IF( IM.EQ.1 )
1628      $         M = MAX( N - ND, 0 )
1629             IF( IM.EQ.2 )
1630      $         M = MIN( N + ND, NMAX )
1631 *
1632 *           Set LDA to 1 more than minimum value if room.
1633             LDA = M
1634             IF( LDA.LT.NMAX )
1635      $         LDA = LDA + 1
1636 *           Skip tests if not enough room.
1637             IF( LDA.GT.NMAX )
1638      $         GO TO 110
1639             LAA = LDA*N
1640             NULL = N.LE.0.OR.M.LE.0
1641 *
1642             DO 100 IX = 1, NINC
1643                INCX = INC( IX )
1644                LX = ABS( INCX )*M
1645 *
1646 *              Generate the vector X.
1647 *
1648                TRANSL = HALF
1649                CALL ZMAKE( 'ge'' '' '1, M, X, 1, XX, ABS( INCX ),
1650      $                     0, M - 1, RESET, TRANSL )
1651                IF( M.GT.1 )THEN
1652                   X( M/2 ) = ZERO
1653                   XX( 1 + ABS( INCX )*( M/2 - 1 ) ) = ZERO
1654                END IF
1655 *
1656                DO 90 IY = 1, NINC
1657                   INCY = INC( IY )
1658                   LY = ABS( INCY )*N
1659 *
1660 *                 Generate the vector Y.
1661 *
1662                   TRANSL = ZERO
1663                   CALL ZMAKE( 'ge'' '' '1, N, Y, 1, YY,
1664      $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )
1665                   IF( N.GT.1 )THEN
1666                      Y( N/2 ) = ZERO
1667                      YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO
1668                   END IF
1669 *
1670                   DO 80 IA = 1, NALF
1671                      ALPHA = ALF( IA )
1672 *
1673 *                    Generate the matrix A.
1674 *
1675                      TRANSL = ZERO
1676                      CALL ZMAKE(SNAME( 89 ), ' '' ', M, N, A, NMAX,
1677      $                           AA, LDA, M - 1, N - 1, RESET, TRANSL )
1678 *
1679                      NC = NC + 1
1680 *
1681 *                    Save every datum before calling the subroutine.
1682 *
1683                      MS = M
1684                      NS = N
1685                      ALS = ALPHA
1686                      DO 10 I = 1, LAA
1687                         AS( I ) = AA( I )
1688    10                CONTINUE
1689                      LDAS = LDA
1690                      DO 20 I = 1, LX
1691                         XS( I ) = XX( I )
1692    20                CONTINUE
1693                      INCXS = INCX
1694                      DO 30 I = 1, LY
1695                         YS( I ) = YY( I )
1696    30                CONTINUE
1697                      INCYS = INCY
1698 *
1699 *                    Call the subroutine.
1700 *
1701                      IF( TRACE )
1702      $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, M, N,
1703      $                  ALPHA, INCX, INCY, LDA
1704                      IF( CONJ )THEN
1705                         IF( REWI )
1706      $                     REWIND NTRA
1707                         CALL CZGERC( IORDER, M, N, ALPHA, XX, INCX,
1708      $                              YY, INCY, AA, LDA )
1709                      ELSE
1710                         IF( REWI )
1711      $                     REWIND NTRA
1712                         CALL CZGERU( IORDER, M, N, ALPHA, XX, INCX,
1713      $                              YY, INCY, AA, LDA )
1714                      END IF
1715 *
1716 *                    Check if error-exit was taken incorrectly.
1717 *
1718                      IF.NOT.OK )THEN
1719                         WRITE( NOUT, FMT = 9993 )
1720                         FATAL = .TRUE.
1721                         GO TO 140
1722                      END IF
1723 *
1724 *                    See what data changed inside subroutine.
1725 *
1726                      ISAME( 1 ) = MS.EQ.M
1727                      ISAME( 2 ) = NS.EQ.N
1728                      ISAME( 3 ) = ALS.EQ.ALPHA
1729                      ISAME( 4 ) = LZE( XS, XX, LX )
1730                      ISAME( 5 ) = INCXS.EQ.INCX
1731                      ISAME( 6 ) = LZE( YS, YY, LY )
1732                      ISAME( 7 ) = INCYS.EQ.INCY
1733                      IFNULL )THEN
1734                         ISAME( 8 ) = LZE( AS, AA, LAA )
1735                      ELSE
1736                         ISAME( 8 ) = LZERES( 'ge'' ', M, N, AS, AA,
1737      $                               LDA )
1738                      END IF
1739                      ISAME( 9 ) = LDAS.EQ.LDA
1740 *
1741 *                   If data was incorrectly changed, report and return.
1742 *
1743                      SAME = .TRUE.
1744                      DO 40 I = 1, NARGS
1745                         SAME = SAME.AND.ISAME( I )
1746                         IF.NOT.ISAME( I ) )
1747      $                     WRITE( NOUT, FMT = 9998 )I
1748    40                CONTINUE
1749                      IF.NOT.SAME )THEN
1750                         FATAL = .TRUE.
1751                         GO TO 140
1752                      END IF
1753 *
1754                      IF.NOT.NULL )THEN
1755 *
1756 *                       Check the result column by column.
1757 *
1758                         IF( INCX.GT.0 )THEN
1759                            DO 50 I = 1, M
1760                               Z( I ) = X( I )
1761    50                      CONTINUE
1762                         ELSE
1763                            DO 60 I = 1, M
1764                               Z( I ) = X( M - I + 1 )
1765    60                      CONTINUE
1766                         END IF
1767                         DO 70 J = 1, N
1768                            IF( INCY.GT.0 )THEN
1769                               W( 1 ) = Y( J )
1770                            ELSE
1771                               W( 1 ) = Y( N - J + 1 )
1772                            END IF
1773                            IF( CONJ )
1774      $                        W( 1 ) = DCONJG( W( 1 ) )
1775                            CALL ZMVCH( 'N', M, 1, ALPHA, Z, NMAX, W, 1,
1776      $                                 ONE, A( 1, J ), 1, YT, G,
1777      $                                 AA( 1 + ( J - 1 )*LDA ), EPS,
1778      $                                 ERR, FATAL, NOUT, .TRUE. )
1779                            ERRMAX = MAX( ERRMAX, ERR )
1780 *                          If got really bad answer, report and return.
1781                            IF( FATAL )
1782      $                        GO TO 130
1783    70                   CONTINUE
1784                      ELSE
1785 *                       Avoid repeating tests with M.le.0 or N.le.0.
1786                         GO TO 110
1787                      END IF
1788 *
1789    80             CONTINUE
1790 *
1791    90          CONTINUE
1792 *
1793   100       CONTINUE
1794 *
1795   110    CONTINUE
1796 *
1797   120 CONTINUE
1798 *
1799 *     Report result.
1800 *
1801       IF( ERRMAX.LT.THRESH )THEN
1802          WRITE( NOUT, FMT = 9999 )SNAME, NC
1803       ELSE
1804          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
1805       END IF
1806       GO TO 150
1807 *
1808   130 CONTINUE
1809       WRITE( NOUT, FMT = 9995 )J
1810 *
1811   140 CONTINUE
1812       WRITE( NOUT, FMT = 9996 )SNAME
1813       WRITE( NOUT, FMT = 9994 )NC, SNAME, M, N, ALPHA, INCX, INCY, LDA
1814 *
1815   150 CONTINUE
1816       RETURN
1817 *
1818  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
1819      $      'S)' )
1820  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
1821      $      'ANGED INCORRECTLY *******' )
1822  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
1823      $      'ALLS)'/' ******* BUT WITH MAXIMUM TEST RATIO'F8.2,
1824      $      ' - SUSPECT *******' )
1825  9996 FORMAT' ******* ',A12, ' FAILED ON CALL NUMBER:' )
1826  9995 FORMAT'      THESE ARE THE RESULTS FOR COLUMN ', I3 )
1827  9994 FORMAT(1X, I6, ': ',A12, '('2( I3, ',' ), '('F4.1','F4.1,
1828      $     '), X,', I2, ', Y,', I2, ', A,', I3, ') .' )
1829  9993 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
1830      $      '******' )
1831 *
1832 *     End of ZCHK4.
1833 *
1834       END
1835       SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
1836      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
1837      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
1838      $                  Z, IORDER )
1839 *
1840 *  Tests ZHER and ZHPR.
1841 *
1842 *  Auxiliary routine for test program for Level 2 Blas.
1843 *
1844 *  -- Written on 10-August-1987.
1845 *     Richard Hanson, Sandia National Labs.
1846 *     Jeremy Du Croz, NAG Central Office.
1847 *
1848 *     .. Parameters ..
1849       COMPLEX*16         ZERO, HALF, ONE
1850       PARAMETER          ( ZERO = ( 0.0D00.0D0 ), 
1851      $                   HALF = ( 0.5D00.0D0 ),
1852      $                   ONE = ( 1.0D00.0D0 ) )
1853       DOUBLE PRECISION   RZERO
1854       PARAMETER          ( RZERO = 0.0D0 )
1855 *     .. Scalar Arguments ..
1856       DOUBLE PRECISION   EPS, THRESH
1857       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA,
1858      $                   IORDER
1859       LOGICAL            FATAL, REWI, TRACE
1860       CHARACTER*12       SNAME
1861 *     .. Array Arguments ..
1862       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
1863      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
1864      $                   XX( NMAX*INCMAX ), Y( NMAX ),
1865      $                   YS( NMAX*INCMAX ), YT( NMAX ),
1866      $                   YY( NMAX*INCMAX ), Z( NMAX )
1867       DOUBLE PRECISION   G( NMAX )
1868       INTEGER            IDIM( NIDIM ), INC( NINC )
1869 *     .. Local Scalars ..
1870       COMPLEX*16         ALPHA, TRANSL
1871       DOUBLE PRECISION   ERR, ERRMAX, RALPHA, RALS
1872       INTEGER           I, IA, IC, IN, INCX, INCXS, IX, J, JA, JJ, LAA,
1873      $                   LDA, LDAS, LJ, LX, N, NARGS, NC, NS
1874       LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER
1875       CHARACTER*1        UPLO, UPLOS
1876       CHARACTER*14       CUPLO
1877       CHARACTER*2        ICH
1878 *     .. Local Arrays ..
1879       COMPLEX*16         W( 1 )
1880       LOGICAL            ISAME( 13 )
1881 *     .. External Functions ..
1882       LOGICAL            LZE, LZERES
1883       EXTERNAL           LZE, LZERES
1884 *     .. External Subroutines ..
1885       EXTERNAL           CZHER, CZHPR, ZMAKE, ZMVCH
1886 *     .. Intrinsic Functions ..
1887       INTRINSIC          ABSDCMPLXDCONJGMAXDBLE
1888 *     .. Scalars in Common ..
1889       INTEGER            INFOT, NOUTC
1890       LOGICAL             OK
1891 *     .. Common blocks ..
1892       COMMON             /INFOC/INFOT, NOUTC, OK
1893 *     .. Data statements ..
1894       DATA               ICH/'UL'/
1895 *     .. Executable Statements ..
1896       FULL = SNAME( 99 ).EQ.'e'
1897       PACKED = SNAME( 99 ).EQ.'p'
1898 *     Define the number of arguments.
1899       IF( FULL )THEN
1900          NARGS = 7
1901       ELSE IF( PACKED )THEN
1902          NARGS = 6
1903       END IF
1904 *
1905       NC = 0
1906       RESET = .TRUE.
1907       ERRMAX = RZERO
1908 *
1909       DO 100 IN = 1, NIDIM
1910          N = IDIMIN )
1911 *        Set LDA to 1 more than minimum value if room.
1912          LDA = N
1913          IF( LDA.LT.NMAX )
1914      $      LDA = LDA + 1
1915 *        Skip tests if not enough room.
1916          IF( LDA.GT.NMAX )
1917      $      GO TO 100
1918          IF( PACKED )THEN
1919             LAA = ( N*( N + 1 ) )/2
1920          ELSE
1921             LAA = LDA*N
1922          END IF
1923 *
1924          DO 90 IC = 12
1925             UPLO = ICH( IC: IC )
1926             IF (UPLO.EQ.'U')THEN
1927                CUPLO = '    CblasUpper'
1928             ELSE
1929                CUPLO = '    CblasLower'
1930             END IF
1931             UPPER = UPLO.EQ.'U'
1932 *
1933             DO 80 IX = 1, NINC
1934                INCX = INC( IX )
1935                LX = ABS( INCX )*N
1936 *
1937 *              Generate the vector X.
1938 *
1939                TRANSL = HALF
1940                CALL ZMAKE( 'ge'' '' '1, N, X, 1, XX, ABS( INCX ),
1941      $                     0, N - 1, RESET, TRANSL )
1942                IF( N.GT.1 )THEN
1943                   X( N/2 ) = ZERO
1944                   XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
1945                END IF
1946 *
1947                DO 70 IA = 1, NALF
1948                   RALPHA = DBLE( ALF( IA ) )
1949                   ALPHA = DCMPLX( RALPHA, RZERO )
1950                   NULL = N.LE.0.OR.RALPHA.EQ.RZERO
1951 *
1952 *                 Generate the matrix A.
1953 *
1954                   TRANSL = ZERO
1955                   CALL ZMAKE( SNAME( 89 ), UPLO, ' ', N, N, A, NMAX,
1956      $                        AA, LDA, N - 1, N - 1, RESET, TRANSL )
1957 *
1958                   NC = NC + 1
1959 *
1960 *                 Save every datum before calling the subroutine.
1961 *
1962                   UPLOS = UPLO
1963                   NS = N
1964                   RALS = RALPHA
1965                   DO 10 I = 1, LAA
1966                      AS( I ) = AA( I )
1967    10             CONTINUE
1968                   LDAS = LDA
1969                   DO 20 I = 1, LX
1970                      XS( I ) = XX( I )
1971    20             CONTINUE
1972                   INCXS = INCX
1973 *
1974 *                 Call the subroutine.
1975 *
1976                   IF( FULL )THEN
1977                      IF( TRACE )
1978      $                  WRITE( NTRA, FMT = 9993 )NC, SNAME, CUPLO, N,
1979      $                  RALPHA, INCX, LDA
1980                      IF( REWI )
1981      $                  REWIND NTRA
1982                      CALL CZHER( IORDER, UPLO, N, RALPHA, XX,
1983      $                            INCX, AA, LDA )
1984                   ELSE IF( PACKED )THEN
1985                      IF( TRACE )
1986      $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, CUPLO, N,
1987      $                  RALPHA, INCX
1988                      IF( REWI )
1989      $                  REWIND NTRA
1990                      CALL CZHPR( IORDER, UPLO, N, RALPHA,
1991      $                            XX, INCX, AA )
1992                   END IF
1993 *
1994 *                 Check if error-exit was taken incorrectly.
1995 *
1996                   IF.NOT.OK )THEN
1997                      WRITE( NOUT, FMT = 9992 )
1998                      FATAL = .TRUE.
1999                      GO TO 120
2000                   END IF
2001 *
2002 *                 See what data changed inside subroutines.
2003 *
2004                   ISAME( 1 ) = UPLO.EQ.UPLOS
2005                   ISAME( 2 ) = NS.EQ.N
2006                   ISAME( 3 ) = RALS.EQ.RALPHA
2007                   ISAME( 4 ) = LZE( XS, XX, LX )
2008                   ISAME( 5 ) = INCXS.EQ.INCX
2009                   IFNULL )THEN
2010                      ISAME( 6 ) = LZE( AS, AA, LAA )
2011                   ELSE
2012                     ISAME( 6 ) = LZERES( SNAME( 89 ), UPLO, N, N, AS,
2013      $                            AA, LDA )
2014                   END IF
2015                   IF.NOT.PACKED )THEN
2016                      ISAME( 7 ) = LDAS.EQ.LDA
2017                   END IF
2018 *
2019 *                 If data was incorrectly changed, report and return.
2020 *
2021                   SAME = .TRUE.
2022                   DO 30 I = 1, NARGS
2023                      SAME = SAME.AND.ISAME( I )
2024                      IF.NOT.ISAME( I ) )
2025      $                  WRITE( NOUT, FMT = 9998 )I
2026    30             CONTINUE
2027                   IF.NOT.SAME )THEN
2028                      FATAL = .TRUE.
2029                      GO TO 120
2030                   END IF
2031 *
2032                   IF.NOT.NULL )THEN
2033 *
2034 *                    Check the result column by column.
2035 *
2036                      IF( INCX.GT.0 )THEN
2037                         DO 40 I = 1, N
2038                            Z( I ) = X( I )
2039    40                   CONTINUE
2040                      ELSE
2041                         DO 50 I = 1, N
2042                            Z( I ) = X( N - I + 1 )
2043    50                   CONTINUE
2044                      END IF
2045                      JA = 1
2046                      DO 60 J = 1, N
2047                         W( 1 ) = DCONJG( Z( J ) )
2048                         IF( UPPER )THEN
2049                            JJ = 1
2050                            LJ = J
2051                         ELSE
2052                            JJ = J
2053                            LJ = N - J + 1
2054                         END IF
2055                         CALL ZMVCH( 'N', LJ, 1, ALPHA, Z( JJ ), LJ, W,
2056      $                              1, ONE, A( JJ, J ), 1, YT, G,
2057      $                              AA( JA ), EPS, ERR, FATAL, NOUT,
2058      $                              .TRUE. )
2059                         IF( FULL )THEN
2060                            IF( UPPER )THEN
2061                               JA = JA + LDA
2062                            ELSE
2063                               JA = JA + LDA + 1
2064                            END IF
2065                         ELSE
2066                            JA = JA + LJ
2067                         END IF
2068                         ERRMAX = MAX( ERRMAX, ERR )
2069 *                       If got really bad answer, report and return.
2070                         IF( FATAL )
2071      $                     GO TO 110
2072    60                CONTINUE
2073                   ELSE
2074 *                    Avoid repeating tests if N.le.0.
2075                      IF( N.LE.0 )
2076      $                  GO TO 100
2077                   END IF
2078 *
2079    70          CONTINUE
2080 *
2081    80       CONTINUE
2082 *
2083    90    CONTINUE
2084 *
2085   100 CONTINUE
2086 *
2087 *     Report result.
2088 *
2089       IF( ERRMAX.LT.THRESH )THEN
2090          WRITE( NOUT, FMT = 9999 )SNAME, NC
2091       ELSE
2092          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
2093       END IF
2094       GO TO 130
2095 *
2096   110 CONTINUE
2097       WRITE( NOUT, FMT = 9995 )J
2098 *
2099   120 CONTINUE
2100       WRITE( NOUT, FMT = 9996 )SNAME
2101       IF( FULL )THEN
2102          WRITE( NOUT, FMT = 9993 )NC, SNAME, CUPLO, N, RALPHA, INCX, LDA
2103       ELSE IF( PACKED )THEN
2104          WRITE( NOUT, FMT = 9994 )NC, SNAME, CUPLO, N, RALPHA, INCX
2105       END IF
2106 *
2107   130 CONTINUE
2108       RETURN
2109 *
2110  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
2111      $      'S)' )
2112  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
2113      $      'ANGED INCORRECTLY *******' )
2114  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
2115      $      'ALLS)'/' ******* BUT WITH MAXIMUM TEST RATIO'F8.2,
2116      $      ' - SUSPECT *******' )
2117  9996 FORMAT' ******* ',A12, ' FAILED ON CALL NUMBER:' )
2118  9995 FORMAT'      THESE ARE THE RESULTS FOR COLUMN ', I3 )
2119  9994 FORMAT(1X, I6, ': ',A12, '(', A14, ',', I3, ','F4.1', X,',
2120      $      I2, ', AP) .' )
2121  9993 FORMAT(1X, I6, ': ',A12, '(', A14, ',', I3, ','F4.1', X,',
2122      $     I2, ', A,', I3, ') .' )
2123  9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
2124      $      '******' )
2125 *
2126 *     End of CZHK5.
2127 *
2128       END
2129       SUBROUTINE ZCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
2130      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
2131      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
2132      $                  Z, IORDER )
2133 *
2134 *  Tests ZHER2 and ZHPR2.
2135 *
2136 *  Auxiliary routine for test program for Level 2 Blas.
2137 *
2138 *  -- Written on 10-August-1987.
2139 *     Richard Hanson, Sandia National Labs.
2140 *     Jeremy Du Croz, NAG Central Office.
2141 *
2142 *     .. Parameters ..
2143       COMPLEX*16         ZERO, HALF, ONE
2144       PARAMETER          ( ZERO = ( 0.0D00.0D0 ), 
2145      $                   HALF = ( 0.5D00.0D0 ),
2146      $                   ONE = ( 1.0D00.0D0 ) )
2147       DOUBLE PRECISION   RZERO
2148       PARAMETER          ( RZERO = 0.0D0 )
2149 *     .. Scalar Arguments ..
2150       DOUBLE PRECISION   EPS, THRESH
2151       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA,
2152      $                   IORDER
2153       LOGICAL            FATAL, REWI, TRACE
2154       CHARACTER*12       SNAME
2155 *     .. Array Arguments ..
2156       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
2157      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
2158      $                   XX( NMAX*INCMAX ), Y( NMAX ),
2159      $                   YS( NMAX*INCMAX ), YT( NMAX ),
2160      $                   YY( NMAX*INCMAX ), Z( NMAX, 2 )
2161       DOUBLE PRECISION               G( NMAX )
2162       INTEGER            IDIM( NIDIM ), INC( NINC )
2163 *     .. Local Scalars ..
2164       COMPLEX*16            ALPHA, ALS, TRANSL
2165       DOUBLE PRECISION               ERR, ERRMAX
2166       INTEGER            I, IA, IC, IN, INCX, INCXS, INCY, INCYS, IX,
2167      $                   IY, J, JA, JJ, LAA, LDA, LDAS, LJ, LX, LY, N,
2168      $                   NARGS, NC, NS
2169       LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER
2170       CHARACTER*1        UPLO, UPLOS
2171       CHARACTER*14       CUPLO
2172       CHARACTER*2        ICH
2173 *     .. Local Arrays ..
2174       COMPLEX*16         W( 2 )
2175       LOGICAL            ISAME( 13 )
2176 *     .. External Functions ..
2177       LOGICAL            LZE, LZERES
2178       EXTERNAL           LZE, LZERES
2179 *     .. External Subroutines ..
2180       EXTERNAL           CZHER2, CZHPR2, ZMAKE, ZMVCH
2181 *     .. Intrinsic Functions ..
2182       INTRINSIC          ABSDCONJGMAX
2183 *     .. Scalars in Common ..
2184       INTEGER            INFOT, NOUTC
2185       LOGICAL             OK
2186 *     .. Common blocks ..
2187       COMMON             /INFOC/INFOT, NOUTC, OK
2188 *     .. Data statements ..
2189       DATA               ICH/'UL'/
2190 *     .. Executable Statements ..
2191       FULL = SNAME( 99 ).EQ.'e'
2192       PACKED = SNAME( 99 ).EQ.'p'
2193 *     Define the number of arguments.
2194       IF( FULL )THEN
2195          NARGS = 9
2196       ELSE IF( PACKED )THEN
2197          NARGS = 8
2198       END IF
2199 *
2200       NC = 0
2201       RESET = .TRUE.
2202       ERRMAX = RZERO
2203 *
2204       DO 140 IN = 1, NIDIM
2205          N = IDIMIN )
2206 *        Set LDA to 1 more than minimum value if room.
2207          LDA = N
2208          IF( LDA.LT.NMAX )
2209      $      LDA = LDA + 1
2210 *        Skip tests if not enough room.
2211          IF( LDA.GT.NMAX )
2212      $      GO TO 140
2213          IF( PACKED )THEN
2214             LAA = ( N*( N + 1 ) )/2
2215          ELSE
2216             LAA = LDA*N
2217          END IF
2218 *
2219          DO 130 IC = 12
2220             UPLO = ICH( IC: IC )
2221             IF (UPLO.EQ.'U')THEN
2222                CUPLO = '    CblasUpper'
2223             ELSE
2224                CUPLO = '    CblasLower'
2225             END IF
2226             UPPER = UPLO.EQ.'U'
2227 *
2228             DO 120 IX = 1, NINC
2229                INCX = INC( IX )
2230                LX = ABS( INCX )*N
2231 *
2232 *              Generate the vector X.
2233 *
2234                TRANSL = HALF
2235                CALL ZMAKE( 'ge'' '' '1, N, X, 1, XX, ABS( INCX ),
2236      $                     0, N - 1, RESET, TRANSL )
2237                IF( N.GT.1 )THEN
2238                   X( N/2 ) = ZERO
2239                   XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
2240                END IF
2241 *
2242                DO 110 IY = 1, NINC
2243                   INCY = INC( IY )
2244                   LY = ABS( INCY )*N
2245 *
2246 *                 Generate the vector Y.
2247 *
2248                   TRANSL = ZERO
2249                   CALL ZMAKE( 'ge'' '' '1, N, Y, 1, YY,
2250      $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )
2251                   IF( N.GT.1 )THEN
2252                      Y( N/2 ) = ZERO
2253                      YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO
2254                   END IF
2255 *
2256                   DO 100 IA = 1, NALF
2257                      ALPHA = ALF( IA )
2258                      NULL = N.LE.0.OR.ALPHA.EQ.ZERO
2259 *
2260 *                    Generate the matrix A.
2261 *
2262                      TRANSL = ZERO
2263                      CALL ZMAKE( SNAME( 89 ), UPLO, ' ', N, N, A,
2264      $                           NMAX, AA, LDA, N - 1, N - 1, RESET,
2265      $                           TRANSL )
2266 *
2267                      NC = NC + 1
2268 *
2269 *                    Save every datum before calling the subroutine.
2270 *
2271                      UPLOS = UPLO
2272                      NS = N
2273                      ALS = ALPHA
2274                      DO 10 I = 1, LAA
2275                         AS( I ) = AA( I )
2276    10                CONTINUE
2277                      LDAS = LDA
2278                      DO 20 I = 1, LX
2279                         XS( I ) = XX( I )
2280    20                CONTINUE
2281                      INCXS = INCX
2282                      DO 30 I = 1, LY
2283                         YS( I ) = YY( I )
2284    30                CONTINUE
2285                      INCYS = INCY
2286 *
2287 *                    Call the subroutine.
2288 *
2289                      IF( FULL )THEN
2290                         IF( TRACE )
2291      $                     WRITE( NTRA, FMT = 9993 )NC, SNAME, CUPLO, N,
2292      $                     ALPHA, INCX, INCY, LDA
2293                         IF( REWI )
2294      $                     REWIND NTRA
2295                         CALL CZHER2( IORDER, UPLO, N, ALPHA, XX, INCX,
2296      $                              YY, INCY, AA, LDA )
2297                      ELSE IF( PACKED )THEN
2298                         IF( TRACE )
2299      $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, CUPLO, N,
2300      $                     ALPHA, INCX, INCY
2301                         IF( REWI )
2302      $                     REWIND NTRA
2303                         CALL CZHPR2( IORDER, UPLO, N, ALPHA, XX, INCX,
2304      $                              YY, INCY, AA )
2305                      END IF
2306 *
2307 *                    Check if error-exit was taken incorrectly.
2308 *
2309                      IF.NOT.OK )THEN
2310                         WRITE( NOUT, FMT = 9992 )
2311                         FATAL = .TRUE.
2312                         GO TO 160
2313                      END IF
2314 *
2315 *                    See what data changed inside subroutines.
2316 *
2317                      ISAME( 1 ) = UPLO.EQ.UPLOS
2318                      ISAME( 2 ) = NS.EQ.N
2319                      ISAME( 3 ) = ALS.EQ.ALPHA
2320                      ISAME( 4 ) = LZE( XS, XX, LX )
2321                      ISAME( 5 ) = INCXS.EQ.INCX
2322                      ISAME( 6 ) = LZE( YS, YY, LY )
2323                      ISAME( 7 ) = INCYS.EQ.INCY
2324                      IFNULL )THEN
2325                         ISAME( 8 ) = LZE( AS, AA, LAA )
2326                      ELSE
2327                         ISAME( 8 ) = LZERES( SNAME( 89 ), UPLO, N, N,
2328      $                               AS, AA, LDA )
2329                      END IF
2330                      IF.NOT.PACKED )THEN
2331                         ISAME( 9 ) = LDAS.EQ.LDA
2332                      END IF
2333 *
2334 *                   If data was incorrectly changed, report and return.
2335 *
2336                      SAME = .TRUE.
2337                      DO 40 I = 1, NARGS
2338                         SAME = SAME.AND.ISAME( I )
2339                         IF.NOT.ISAME( I ) )
2340      $                     WRITE( NOUT, FMT = 9998 )I
2341    40                CONTINUE
2342                      IF.NOT.SAME )THEN
2343                         FATAL = .TRUE.
2344                         GO TO 160
2345                      END IF
2346 *
2347                      IF.NOT.NULL )THEN
2348 *
2349 *                       Check the result column by column.
2350 *
2351                         IF( INCX.GT.0 )THEN
2352                            DO 50 I = 1, N
2353                               Z( I, 1 ) = X( I )
2354    50                      CONTINUE
2355                         ELSE
2356                            DO 60 I = 1, N
2357                               Z( I, 1 ) = X( N - I + 1 )
2358    60                      CONTINUE
2359                         END IF
2360                         IF( INCY.GT.0 )THEN
2361                            DO 70 I = 1, N
2362                               Z( I, 2 ) = Y( I )
2363    70                      CONTINUE
2364                         ELSE
2365                            DO 80 I = 1, N
2366                               Z( I, 2 ) = Y( N - I + 1 )
2367    80                      CONTINUE
2368                         END IF
2369                         JA = 1
2370                         DO 90 J = 1, N
2371                            W( 1 ) = ALPHA*DCONJG( Z( J, 2 ) )
2372                            W( 2 ) = DCONJG( ALPHA )*DCONJG( Z( J, 1 ) )
2373                            IF( UPPER )THEN
2374                               JJ = 1
2375                               LJ = J
2376                            ELSE
2377                               JJ = J
2378                               LJ = N - J + 1
2379                            END IF
2380                            CALL ZMVCH( 'N', LJ, 2, ONE, Z( JJ, 1 ),
2381      $                                 NMAX, W, 1, ONE, A( JJ, J ), 1,
2382      $                                YT, G, AA( JA ), EPS, ERR, FATAL,
2383      $                                 NOUT, .TRUE. )
2384                            IF( FULL )THEN
2385                               IF( UPPER )THEN
2386                                  JA = JA + LDA
2387                               ELSE
2388                                  JA = JA + LDA + 1
2389                               END IF
2390                            ELSE
2391                               JA = JA + LJ
2392                            END IF
2393                            ERRMAX = MAX( ERRMAX, ERR )
2394 *                          If got really bad answer, report and return.
2395                            IF( FATAL )
2396      $                        GO TO 150
2397    90                   CONTINUE
2398                      ELSE
2399 *                       Avoid repeating tests with N.le.0.
2400                         IF( N.LE.0 )
2401      $                     GO TO 140
2402                      END IF
2403 *
2404   100             CONTINUE
2405 *
2406   110          CONTINUE
2407 *
2408   120       CONTINUE
2409 *
2410   130    CONTINUE
2411 *
2412   140 CONTINUE
2413 *
2414 *     Report result.
2415 *
2416       IF( ERRMAX.LT.THRESH )THEN
2417          WRITE( NOUT, FMT = 9999 )SNAME, NC
2418       ELSE
2419          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
2420       END IF
2421       GO TO 170
2422 *
2423   150 CONTINUE
2424       WRITE( NOUT, FMT = 9995 )J
2425 *
2426   160 CONTINUE
2427       WRITE( NOUT, FMT = 9996 )SNAME
2428       IF( FULL )THEN
2429          WRITE( NOUT, FMT = 9993 )NC, SNAME, CUPLO, N, ALPHA, INCX,
2430      $      INCY, LDA
2431       ELSE IF( PACKED )THEN
2432          WRITE( NOUT, FMT = 9994 )NC, SNAME, CUPLO, N, ALPHA, INCX, INCY
2433       END IF
2434 *
2435   170 CONTINUE
2436       RETURN
2437 *
2438  9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
2439      $      'S)' )
2440  9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
2441      $      'ANGED INCORRECTLY *******' )
2442  9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
2443      $      'ALLS)'/' ******* BUT WITH MAXIMUM TEST RATIO'F8.2,
2444      $      ' - SUSPECT *******' )
2445  9996 FORMAT' ******* ',A12, ' FAILED ON CALL NUMBER:' )
2446  9995 FORMAT'      THESE ARE THE RESULTS FOR COLUMN ', I3 )
2447  9994 FORMAT(1X, I6, ': ',A12, '(', A14, ',', I3, ',('F4.1',',
2448      $     F4.1'), X,', I2, ', Y,', I2, ', AP) .' )
2449  9993 FORMAT(1X, I6, ': ',A12, '(', A14, ',', I3, ',('F4.1',',
2450      $     F4.1'), X,', I2, ', Y,', I2, ', A,', I3, ') .' )
2451  9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
2452      $      '******' )
2453 *
2454 *     End of ZCHK6.
2455 *
2456       END
2457       SUBROUTINE ZMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y,
2458      $                  INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV )
2459 *
2460 *  Checks the results of the computational tests.
2461 *
2462 *  Auxiliary routine for test program for Level 2 Blas.
2463 *
2464 *  -- Written on 10-August-1987.
2465 *     Richard Hanson, Sandia National Labs.
2466 *     Jeremy Du Croz, NAG Central Office.
2467 *
2468 *     .. Parameters ..
2469       COMPLEX*16         ZERO
2470       PARAMETER          ( ZERO = ( 0.0D00.0D0 ) )
2471       DOUBLE PRECISION   RZERO, RONE
2472       PARAMETER          ( RZERO = 0.0D0, RONE = 1.0D0 )
2473 *     .. Scalar Arguments ..
2474       COMPLEX*16         ALPHA, BETA
2475       DOUBLE PRECISION   EPS, ERR
2476       INTEGER            INCX, INCY, M, N, NMAX, NOUT
2477       LOGICAL            FATAL, MV
2478       CHARACTER*1        TRANS
2479 *     .. Array Arguments ..
2480       COMPLEX*16         A( NMAX, * ), X( * ), Y( * ), YT( * ), YY( * )
2481       DOUBLE PRECISION   G( * )
2482 *     .. Local Scalars ..
2483       COMPLEX*16         C
2484       DOUBLE PRECISION   ERRI
2485       INTEGER            I, INCXL, INCYL, IY, J, JX, KX, KY, ML, NL
2486       LOGICAL            CTRAN, TRAN
2487 *     .. Intrinsic Functions ..
2488       INTRINSIC          ABSDIMAGDCONJGMAXDBLESQRT
2489 *     .. Statement Functions ..
2490       DOUBLE PRECISION   ABS1
2491 *     .. Statement Function definitions ..
2492       ABS1( C ) = ABSDBLE( C ) ) + ABSDIMAG( C ) )
2493 *     .. Executable Statements ..
2494       TRAN = TRANS.EQ.'T'
2495       CTRAN = TRANS.EQ.'C'
2496       IF( TRAN.OR.CTRAN )THEN
2497          ML = N
2498          NL = M
2499       ELSE
2500          ML = M
2501          NL = N
2502       END IF
2503       IF( INCX.LT.0 )THEN
2504          KX = NL
2505          INCXL = -1
2506       ELSE
2507          KX = 1
2508          INCXL = 1
2509       END IF
2510       IF( INCY.LT.0 )THEN
2511          KY = ML
2512          INCYL = -1
2513       ELSE
2514          KY = 1
2515          INCYL = 1
2516       END IF
2517 *
2518 *     Compute expected result in YT using data in A, X and Y.
2519 *     Compute gauges in G.
2520 *
2521       IY = KY
2522       DO 40 I = 1, ML
2523          YT( IY ) = ZERO
2524          G( IY ) = RZERO
2525          JX = KX
2526          IF( TRAN )THEN
2527             DO 10 J = 1, NL
2528                YT( IY ) = YT( IY ) + A( J, I )*X( JX )
2529                G( IY ) = G( IY ) + ABS1( A( J, I ) )*ABS1( X( JX ) )
2530                JX = JX + INCXL
2531    10       CONTINUE
2532          ELSE IF( CTRAN )THEN
2533             DO 20 J = 1, NL
2534                YT( IY ) = YT( IY ) + DCONJG( A( J, I ) )*X( JX )
2535                G( IY ) = G( IY ) + ABS1( A( J, I ) )*ABS1( X( JX ) )
2536                JX = JX + INCXL
2537    20       CONTINUE
2538          ELSE
2539             DO 30 J = 1, NL
2540                YT( IY ) = YT( IY ) + A( I, J )*X( JX )
2541                G( IY ) = G( IY ) + ABS1( A( I, J ) )*ABS1( X( JX ) )
2542                JX = JX + INCXL
2543    30       CONTINUE
2544          END IF
2545          YT( IY ) = ALPHA*YT( IY ) + BETA*Y( IY )
2546          G( IY ) = ABS1( ALPHA )*G( IY ) + ABS1( BETA )*ABS1( Y( IY ) )
2547          IY = IY + INCYL
2548    40 CONTINUE
2549 *
2550 *     Compute the error ratio for this result.
2551 *
2552       ERR = ZERO
2553       DO 50 I = 1, ML
2554          ERRI = ABS( YT( I ) - YY( 1 + ( I - 1 )*ABS( INCY ) ) )/EPS
2555          IF( G( I ).NE.RZERO )
2556      $      ERRI = ERRI/G( I )
2557          ERR = MAX( ERR, ERRI )
2558          IF( ERR*SQRT( EPS ).GE.RONE )
2559      $      GO TO 60
2560    50 CONTINUE
2561 *     If the loop completes, all results are at least half accurate.
2562       GO TO 80
2563 *
2564 *     Report fatal error.
2565 *
2566    60 FATAL = .TRUE.
2567       WRITE( NOUT, FMT = 9999 )
2568       DO 70 I = 1, ML
2569          IF( MV )THEN
2570             WRITE( NOUT, FMT = 9998 )I, YT( I ),
2571      $         YY( 1 + ( I - 1 )*ABS( INCY ) )
2572          ELSE
2573             WRITE( NOUT, FMT = 9998 )I,
2574      $         YY( 1 + ( I - 1 )*ABS( INCY ) ), YT( I )
2575          END IF
2576    70 CONTINUE
2577 *
2578    80 CONTINUE
2579       RETURN
2580 *
2581  9999 FORMAT(' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
2582      $     'F ACCURATE *******'/'                       EXPECTED RE',
2583      $     'SULT                    COMPUTED RESULT' )
2584  9998 FORMAT1X, I7, 2'  ('G15.6','G15.6')' ) )
2585 *
2586 *     End of ZMVCH.
2587 *
2588       END
2589       LOGICAL FUNCTION LZE( RI, RJ, LR )
2590 *
2591 *  Tests if two arrays are identical.
2592 *
2593 *  Auxiliary routine for test program for Level 2 Blas.
2594 *
2595 *  -- Written on 10-August-1987.
2596 *     Richard Hanson, Sandia National Labs.
2597 *     Jeremy Du Croz, NAG Central Office.
2598 *
2599 *     .. Scalar Arguments ..
2600       INTEGER            LR
2601 *     .. Array Arguments ..
2602       COMPLEX*16         RI( * ), RJ( * )
2603 *     .. Local Scalars ..
2604       INTEGER            I
2605 *     .. Executable Statements ..
2606       DO 10 I = 1, LR
2607          IF( RI( I ).NE.RJ( I ) )
2608      $      GO TO 20
2609    10 CONTINUE
2610       LZE = .TRUE.
2611       GO TO 30
2612    20 CONTINUE
2613       LZE = .FALSE.
2614    30 RETURN
2615 *
2616 *     End of LZE.
2617 *
2618       END
2619       LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA )
2620 *
2621 *  Tests if selected elements in two arrays are equal.
2622 *
2623 *  TYPE is 'ge', 'he' or 'hp'.
2624 *
2625 *  Auxiliary routine for test program for Level 2 Blas.
2626 *
2627 *  -- Written on 10-August-1987.
2628 *     Richard Hanson, Sandia National Labs.
2629 *     Jeremy Du Croz, NAG Central Office.
2630 *
2631 *     .. Scalar Arguments ..
2632       INTEGER            LDA, M, N
2633       CHARACTER*1        UPLO
2634       CHARACTER*2        TYPE
2635 *     .. Array Arguments ..
2636       COMPLEX*16         AA( LDA, * ), AS( LDA, * )
2637 *     .. Local Scalars ..
2638       INTEGER            I, IBEG, IEND, J
2639       LOGICAL            UPPER
2640 *     .. Executable Statements ..
2641       UPPER = UPLO.EQ.'U'
2642       IFTYPE.EQ.'ge' )THEN
2643          DO 20 J = 1, N
2644             DO 10 I = M + 1, LDA
2645                IF( AA( I, J ).NE.AS( I, J ) )
2646      $            GO TO 70
2647    10       CONTINUE
2648    20    CONTINUE
2649       ELSE IFTYPE.EQ.'he' )THEN
2650          DO 50 J = 1, N
2651             IF( UPPER )THEN
2652                IBEG = 1
2653                IEND = J
2654             ELSE
2655                IBEG = J
2656                IEND = N
2657             END IF
2658             DO 30 I = 1, IBEG - 1
2659                IF( AA( I, J ).NE.AS( I, J ) )
2660      $            GO TO 70
2661    30       CONTINUE
2662             DO 40 I = IEND + 1, LDA
2663                IF( AA( I, J ).NE.AS( I, J ) )
2664      $            GO TO 70
2665    40       CONTINUE
2666    50    CONTINUE
2667       END IF
2668 *
2669    60 CONTINUE
2670       LZERES = .TRUE.
2671       GO TO 80
2672    70 CONTINUE
2673       LZERES = .FALSE.
2674    80 RETURN
2675 *
2676 *     End of LZERES.
2677 *
2678       END
2679       COMPLEX*16 FUNCTION ZBEG( RESET )
2680 *
2681 *  Generates complex numbers as pairs of random numbers uniformly
2682 *  distributed between -0.5 and 0.5.
2683 *
2684 *  Auxiliary routine for test program for Level 2 Blas.
2685 *
2686 *  -- Written on 10-August-1987.
2687 *     Richard Hanson, Sandia National Labs.
2688 *     Jeremy Du Croz, NAG Central Office.
2689 *
2690 *     .. Scalar Arguments ..
2691       LOGICAL            RESET
2692 *     .. Local Scalars ..
2693       INTEGER            I, IC, J, MI, MJ
2694 *     .. Save statement ..
2695       SAVE               I, IC, J, MI, MJ
2696 *     .. Intrinsic Functions ..
2697       INTRINSIC          DCMPLX
2698 *     .. Executable Statements ..
2699       IF( RESET )THEN
2700 *        Initialize local variables.
2701          MI = 891
2702          MJ = 457
2703          I = 7
2704          J = 7
2705          IC = 0
2706          RESET = .FALSE.
2707       END IF
2708 *
2709 *     The sequence of values of I or J is bounded between 1 and 999.
2710 *     If initial I or J = 1,2,3,6,7 or 9, the period will be 50.
2711 *     If initial I or J = 4 or 8, the period will be 25.
2712 *     If initial I or J = 5, the period will be 10.
2713 *     IC is used to break up the period by skipping 1 value of I or J
2714 *     in 6.
2715 *
2716       IC = IC + 1
2717    10 I = I*MI
2718       J = J*MJ
2719       I = I - 1000*( I/1000 )
2720       J = J - 1000*( J/1000 )
2721       IF( IC.GE.5 )THEN
2722          IC = 0
2723          GO TO 10
2724       END IF
2725       ZBEG = DCMPLX( ( I - 500 )/1001.0, ( J - 500 )/1001.0 )
2726       RETURN
2727 *
2728 *     End of ZBEG.
2729 *
2730       END
2731       DOUBLE PRECISION FUNCTION DDIFF( X, Y )
2732 *
2733 *  Auxiliary routine for test program for Level 2 Blas.
2734 *
2735 *  -- Written on 10-August-1987.
2736 *     Richard Hanson, Sandia National Labs.
2737 *
2738 *     .. Scalar Arguments ..
2739       DOUBLE PRECISION     X, Y
2740 *     .. Executable Statements ..
2741       DDIFF = X - Y
2742       RETURN
2743 *
2744 *     End of DDIFF.
2745 *
2746       END
2747       SUBROUTINE ZMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL,
2748      $                  KU, RESET, TRANSL )
2749 *
2750 *  Generates values for an M by N matrix A within the bandwidth
2751 *  defined by KL and KU.
2752 *  Stores the values in the array AA in the data structure required
2753 *  by the routine, with unwanted elements set to rogue value.
2754 *
2755 *  TYPE is 'ge', 'gb', 'he', 'hb', 'hp', 'tr', 'tb' OR 'tp'.
2756 *
2757 *  Auxiliary routine for test program for Level 2 Blas.
2758 *
2759 *  -- Written on 10-August-1987.
2760 *     Richard Hanson, Sandia National Labs.
2761 *     Jeremy Du Croz, NAG Central Office.
2762 *
2763 *     .. Parameters ..
2764       COMPLEX*16         ZERO, ONE
2765       PARAMETER          ( ZERO = ( 0.0D00.0D0 ), 
2766      $                   ONE = ( 1.0D00.0D0 ) )
2767       COMPLEX*16         ROGUE
2768       PARAMETER          ( ROGUE = ( -1.0D101.0D10 ) )
2769       DOUBLE PRECISION   RZERO
2770       PARAMETER          ( RZERO = 0.0D0 )
2771       DOUBLE PRECISION   RROGUE
2772       PARAMETER          ( RROGUE = -1.0D10 )
2773 *     .. Scalar Arguments ..
2774       COMPLEX*16         TRANSL
2775       INTEGER            KL, KU, LDA, M, N, NMAX
2776       LOGICAL            RESET
2777       CHARACTER*1        DIAG, UPLO
2778       CHARACTER*2        TYPE
2779 *     .. Array Arguments ..
2780       COMPLEX*16         A( NMAX, * ), AA( * )
2781 *     .. Local Scalars ..
2782       INTEGER            I, I1, I2, I3, IBEG, IEND, IOFF, J, JJ, KK
2783       LOGICAL            GEN, LOWER, SYM, TRI, UNIT, UPPER
2784 *     .. External Functions ..
2785       COMPLEX*16         ZBEG
2786       EXTERNAL           ZBEG
2787 *     .. Intrinsic Functions ..
2788       INTRINSIC          DCMPLXDCONJGMAXMINDBLE
2789 *     .. Executable Statements ..
2790       GEN = TYPE11 ).EQ.'g'
2791       SYM = TYPE11 ).EQ.'h'
2792       TRI = TYPE11 ).EQ.'t'
2793       UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'
2794       LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'
2795       UNIT = TRI.AND.DIAG.EQ.'U'
2796 *
2797 *     Generate data in array A.
2798 *
2799       DO 20 J = 1, N
2800          DO 10 I = 1, M
2801             IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )
2802      $          THEN
2803                IF( ( I.LE.J.AND.- I.LE.KU ).OR.
2804      $             ( I.GE.J.AND.- J.LE.KL ) )THEN
2805                   A( I, J ) = ZBEG( RESET ) + TRANSL
2806                ELSE
2807                   A( I, J ) = ZERO
2808                END IF
2809                IF( I.NE.J )THEN
2810                   IF( SYM )THEN
2811                      A( J, I ) = DCONJG( A( I, J ) )
2812                   ELSE IF( TRI )THEN
2813                      A( J, I ) = ZERO
2814                   END IF
2815                END IF
2816             END IF
2817    10    CONTINUE
2818          IF( SYM )
2819      $      A( J, J ) = DCMPLXDBLE( A( J, J ) ), RZERO )
2820          IF( TRI )
2821      $      A( J, J ) = A( J, J ) + ONE
2822          IFUNIT )
2823      $      A( J, J ) = ONE
2824    20 CONTINUE
2825 *
2826 *     Store elements in array AS in data structure required by routine.
2827 *
2828       IFTYPE.EQ.'ge' )THEN
2829          DO 50 J = 1, N
2830             DO 30 I = 1, M
2831                AA( I + ( J - 1 )*LDA ) = A( I, J )
2832    30       CONTINUE
2833             DO 40 I = M + 1, LDA
2834                AA( I + ( J - 1 )*LDA ) = ROGUE
2835    40       CONTINUE
2836    50    CONTINUE
2837       ELSE IFTYPE.EQ.'gb' )THEN
2838          DO 90 J = 1, N
2839             DO 60 I1 = 1, KU + 1 - J
2840                AA( I1 + ( J - 1 )*LDA ) = ROGUE
2841    60       CONTINUE
2842             DO 70 I2 = I1, MIN( KL + KU + 1, KU + 1 + M - J )
2843                AA( I2 + ( J - 1 )*LDA ) = A( I2 + J - KU - 1, J )
2844    70       CONTINUE
2845             DO 80 I3 = I2, LDA
2846                AA( I3 + ( J - 1 )*LDA ) = ROGUE
2847    80       CONTINUE
2848    90    CONTINUE
2849       ELSE IFTYPE.EQ.'he'.OR.TYPE.EQ.'tr' )THEN
2850          DO 130 J = 1, N
2851             IF( UPPER )THEN
2852                IBEG = 1
2853                IFUNIT )THEN
2854                   IEND = J - 1
2855                ELSE
2856                   IEND = J
2857                END IF
2858             ELSE
2859                IFUNIT )THEN
2860                   IBEG = J + 1
2861                ELSE
2862                   IBEG = J
2863                END IF
2864                IEND = N
2865             END IF
2866             DO 100 I = 1, IBEG - 1
2867                AA( I + ( J - 1 )*LDA ) = ROGUE
2868   100       CONTINUE
2869             DO 110 I = IBEG, IEND
2870                AA( I + ( J - 1 )*LDA ) = A( I, J )
2871   110       CONTINUE
2872             DO 120 I = IEND + 1, LDA
2873                AA( I + ( J - 1 )*LDA ) = ROGUE
2874   120       CONTINUE
2875             IF( SYM )THEN
2876                JJ = J + ( J - 1 )*LDA
2877                AA( JJ ) = DCMPLXDBLE( AA( JJ ) ), RROGUE )
2878             END IF
2879   130    CONTINUE
2880       ELSE IFTYPE.EQ.'hb'.OR.TYPE.EQ.'tb' )THEN
2881          DO 170 J = 1, N
2882             IF( UPPER )THEN
2883                KK = KL + 1
2884                IBEG = MAX1, KL + 2 - J )
2885                IFUNIT )THEN
2886                   IEND = KL
2887                ELSE
2888                   IEND = KL + 1
2889                END IF
2890             ELSE
2891                KK = 1
2892                IFUNIT )THEN
2893                   IBEG = 2
2894                ELSE
2895                   IBEG = 1
2896                END IF
2897                IEND = MIN( KL + 11 + M - J )
2898             END IF
2899             DO 140 I = 1, IBEG - 1
2900                AA( I + ( J - 1 )*LDA ) = ROGUE
2901   140       CONTINUE
2902             DO 150 I = IBEG, IEND
2903                AA( I + ( J - 1 )*LDA ) = A( I + J - KK, J )
2904   150       CONTINUE
2905             DO 160 I = IEND + 1, LDA
2906                AA( I + ( J - 1 )*LDA ) = ROGUE
2907   160       CONTINUE
2908             IF( SYM )THEN
2909                JJ = KK + ( J - 1 )*LDA
2910                AA( JJ ) = DCMPLXDBLE( AA( JJ ) ), RROGUE )
2911             END IF
2912   170    CONTINUE
2913       ELSE IFTYPE.EQ.'hp'.OR.TYPE.EQ.'tp' )THEN
2914          IOFF = 0
2915          DO 190 J = 1, N
2916             IF( UPPER )THEN
2917                IBEG = 1
2918                IEND = J
2919             ELSE
2920                IBEG = J
2921                IEND = N
2922             END IF
2923             DO 180 I = IBEG, IEND
2924                IOFF = IOFF + 1
2925                AA( IOFF ) = A( I, J )
2926                IF( I.EQ.J )THEN
2927                   IFUNIT )
2928      $               AA( IOFF ) = ROGUE
2929                   IF( SYM )
2930      $               AA( IOFF ) = DCMPLXDBLE( AA( IOFF ) ), RROGUE )
2931                END IF
2932   180       CONTINUE
2933   190    CONTINUE
2934       END IF
2935       RETURN
2936 *
2937 *     End of ZMAKE.
2938 *
2939       END