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