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 MAX, MIN 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 IF( IDIM( 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.2) THEN 166 RORDER = .TRUE. 167 CORDER = .TRUE. 168 WRITE( *, FMT = 10002 ) 169 ELSE IF (LAYOUT.EQ.1) THEN 170 RORDER = .TRUE. 171 WRITE( *, FMT = 10001 ) 172 ELSE IF (LAYOUT.EQ.0) THEN 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 = 9988, END = 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 = MIN( 32, NMAX ) 213 DO 100 J = 1, N 214 DO 90 I = 1, N 215 AB( I, J ) = MAX( I - J + 1, 0 ) 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 ( 140, 150, 160, 160, 170, 180 )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 FORMAT( 1X, 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 = IDIM( IN ) 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 = 1, 3 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 = 1, 3 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 IF( NULL )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.0) WRITE( NOUT, FMT = 10000 )SNAME, NC 669 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC 670 ELSE 671 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX 672 IF ( IORDER.EQ.1) WRITE( 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 FORMAT( 1X, 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 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') 740 9994 FORMAT( 20X, 3( 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 = IDIM( IN ) 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 = 1, 2 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 = 1, 2 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 IF( NULL )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.0) WRITE( NOUT, FMT = 10000 )SNAME, NC 986 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC 987 ELSE 988 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX 989 IF ( IORDER.EQ.1) WRITE( 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 FORMAT( 1X, 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 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') 1051 9994 FORMAT( 20X, 2( 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 = IDIM( IN ) 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 = 1, 2 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 = 1, 2 1155 UPLO = ICHU( ICU: ICU ) 1156 * 1157 DO 100 ICT = 1, 3 1158 TRANSA = ICHT( ICT: ICT ) 1159 * 1160 DO 90 ICD = 1, 2 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( 10: 11 ).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( 10: 11 ).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 IF( NULL )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( 10: 11 ).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( 10: 11 ).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.0) WRITE( NOUT, FMT = 10000 )SNAME, NC 1333 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC 1334 ELSE 1335 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX 1336 IF ( IORDER.EQ.1) WRITE( 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 FORMAT( 1X, 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 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') 1409 9994 FORMAT( 22X, 2( 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 = IDIM( IN ) 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 = 1, 3 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 = 1, 2 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 IF( NULL )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.0) WRITE( NOUT, FMT = 10000 )SNAME, NC 1655 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC 1656 ELSE 1657 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX 1658 IF ( IORDER.EQ.1) WRITE( 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 FORMAT( 1X, 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 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) 1726 9994 FORMAT( 20X, 2( 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 = IDIM( IN ) 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 = 1, 3 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 = 1, 2 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 IF( NULL )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, 1, 2*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, 1, 2*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.0) WRITE( NOUT, FMT = 10000 )SNAME, NC 2010 IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC 2011 ELSE 2012 IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX 2013 IF ( IORDER.EQ.1) WRITE( 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 FORMAT( 1X, 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 FORMAT( 1X, I6, ': ', A12,'(', 3( A14, ',') ) 2082 9994 FORMAT( 20X, 2( 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 IF( UNIT ) 2152 $ A( J, J ) = ONE 2153 20 CONTINUE 2154 * 2155 * Store elements in array AS in data structure required by routine. 2156 * 2157 IF( TYPE.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 IF( TYPE.EQ.'SY'.OR.TYPE.EQ.'TR' )THEN 2167 DO 90 J = 1, N 2168 IF( UPPER )THEN 2169 IBEG = 1 2170 IF( UNIT )THEN 2171 IEND = J - 1 2172 ELSE 2173 IEND = J 2174 END IF 2175 ELSE 2176 IF( UNIT )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 ABS, MAX, SQRT 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 FORMAT( 1X, 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 IF( TYPE.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 IF( TYPE.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 2480