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