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