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