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