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