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