1*> \brief \b DBLAT2 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 DBLAT2 12* 13* 14*> \par Purpose: 15* ============= 16*> 17*> \verbatim 18*> 19*> Test program for the DOUBLE PRECISION 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*> 'dblat2.out' NAME OF SUMMARY OUTPUT FILE 27*> 6 UNIT NUMBER OF SUMMARY FILE 28*> 'DBLAT2.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 BETAC 44*> DGEMV T PUT F FOR NO TEST. SAME COLUMNS. 45*> DGBMV T PUT F FOR NO TEST. SAME COLUMNS. 46*> DSYMV T PUT F FOR NO TEST. SAME COLUMNS. 47*> DSBMV T PUT F FOR NO TEST. SAME COLUMNS. 48*> DSPMV T PUT F FOR NO TEST. SAME COLUMNS. 49*> DTRMV T PUT F FOR NO TEST. SAME COLUMNS. 50*> DTBMV T PUT F FOR NO TEST. SAME COLUMNS. 51*> DTPMV T PUT F FOR NO TEST. SAME COLUMNS. 52*> DTRSV T PUT F FOR NO TEST. SAME COLUMNS. 53*> DTBSV T PUT F FOR NO TEST. SAME COLUMNS. 54*> DTPSV T PUT F FOR NO TEST. SAME COLUMNS. 55*> DGER T PUT F FOR NO TEST. SAME COLUMNS. 56*> DSYR T PUT F FOR NO TEST. SAME COLUMNS. 57*> DSPR T PUT F FOR NO TEST. SAME COLUMNS. 58*> DSYR2 T PUT F FOR NO TEST. SAME COLUMNS. 59*> DSPR2 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 double_blas_testing 101* 102* ===================================================================== 103 PROGRAM DBLAT2 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 DOUBLE PRECISION ZERO, ONE 118 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) 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 DOUBLE PRECISION 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 DOUBLE PRECISION 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 DOUBLE PRECISION DDIFF 145 LOGICAL LDE 146 EXTERNAL DDIFF, LDE 147* .. External Subroutines .. 148 EXTERNAL DCHK1, DCHK2, DCHK3, DCHK4, DCHK5, DCHK6, 149 $ DCHKE, DMVCH 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/'DGEMV ', 'DGBMV ', 'DSYMV ', 'DSBMV ', 161 $ 'DSPMV ', 'DTRMV ', 'DTBMV ', 'DTPMV ', 162 $ 'DTRSV ', 'DTBSV ', 'DTPSV ', 'DGER ', 163 $ 'DSYR ', 'DSPR ', 'DSYR2 ', 'DSPR2 '/ 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 DMVCH 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 DMVCH YT holds 301* the result computed by DMVCH. 302 TRANS = 'N' 303 CALL DMVCH( TRANS, N, N, ONE, A, NMAX, X, 1, ZERO, Y, 1, YT, G, 304 $ YY, EPS, ERR, FATAL, NOUT, .TRUE. ) 305 SAME = LDE( 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 DMVCH( TRANS, N, N, ONE, A, NMAX, X, -1, ZERO, Y, -1, YT, G, 312 $ YY, EPS, ERR, FATAL, NOUT, .TRUE. ) 313 SAME = LDE( 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 DCHKE( 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 DGEMV, 01, and DGBMV, 02. 341 140 CALL DCHK1( 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 DSYMV, 03, DSBMV, 04, and DSPMV, 05. 347 150 CALL DCHK2( 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 DTRMV, 06, DTBMV, 07, DTPMV, 08, 353* DTRSV, 09, DTBSV, 10, and DTPSV, 11. 354 160 CALL DCHK3( 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 DGER, 12. 359 170 CALL DCHK4( 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 DSYR, 13, and DSPR, 14. 365 180 CALL DCHK5( 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 DSYR2, 15, and DSPR2, 16. 371 190 CALL DCHK6( 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, D9.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 DOUBLE PRECISION 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 DMVCH - IN-LINE DOT PRODUCTS ARE BEING EVALU', 417 $ 'ATED WRONGLY.', /' DMVCH 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 DBLAT2. 428* 429 END 430 SUBROUTINE DCHK1( 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 DGEMV and DGBMV. 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 DOUBLE PRECISION ZERO, HALF 445 PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0 ) 446* .. Scalar Arguments .. 447 DOUBLE PRECISION 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 DOUBLE PRECISION 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 DOUBLE PRECISION 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 LDE, LDERES 473 EXTERNAL LDE, LDERES 474* .. External Subroutines .. 475 EXTERNAL DGBMV, DGEMV, DMAKE, DMVCH 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 DMAKE( 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 DMAKE( '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 DMAKE( '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 DGEMV( 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 DGBMV( 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 ) = LDE( AS, AA, LAA ) 650 ISAME( 6 ) = LDAS.EQ.LDA 651 ISAME( 7 ) = LDE( XS, XX, LX ) 652 ISAME( 8 ) = INCXS.EQ.INCX 653 ISAME( 9 ) = BLS.EQ.BETA 654 IF( NULL )THEN 655 ISAME( 10 ) = LDE( YS, YY, LY ) 656 ELSE 657 ISAME( 10 ) = LDERES( '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 ) = LDE( AS, AA, LAA ) 667 ISAME( 8 ) = LDAS.EQ.LDA 668 ISAME( 9 ) = LDE( XS, XX, LX ) 669 ISAME( 10 ) = INCXS.EQ.INCX 670 ISAME( 11 ) = BLS.EQ.BETA 671 IF( NULL )THEN 672 ISAME( 12 ) = LDE( YS, YY, LY ) 673 ELSE 674 ISAME( 12 ) = LDERES( '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 DMVCH( 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 DCHK1. 769* 770 END 771 SUBROUTINE DCHK2( 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 DSYMV, DSBMV and DSPMV. 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 DOUBLE PRECISION ZERO, HALF 786 PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0 ) 787* .. Scalar Arguments .. 788 DOUBLE PRECISION 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 DOUBLE PRECISION 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 DOUBLE PRECISION 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 LDE, LDERES 813 EXTERNAL LDE, LDERES 814* .. External Subroutines .. 815 EXTERNAL DMAKE, DMVCH, DSBMV, DSPMV, DSYMV 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 DMAKE( 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 DMAKE( '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 DMAKE( '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 DSYMV( 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 DSBMV( 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 DSPMV( 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 ) = LDE( AS, AA, LAA ) 981 ISAME( 5 ) = LDAS.EQ.LDA 982 ISAME( 6 ) = LDE( XS, XX, LX ) 983 ISAME( 7 ) = INCXS.EQ.INCX 984 ISAME( 8 ) = BLS.EQ.BETA 985 IF( NULL )THEN 986 ISAME( 9 ) = LDE( YS, YY, LY ) 987 ELSE 988 ISAME( 9 ) = LDERES( '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 ) = LDE( AS, AA, LAA ) 996 ISAME( 6 ) = LDAS.EQ.LDA 997 ISAME( 7 ) = LDE( XS, XX, LX ) 998 ISAME( 8 ) = INCXS.EQ.INCX 999 ISAME( 9 ) = BLS.EQ.BETA 1000 IF( NULL )THEN 1001 ISAME( 10 ) = LDE( YS, YY, LY ) 1002 ELSE 1003 ISAME( 10 ) = LDERES( '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 ) = LDE( AS, AA, LAA ) 1010 ISAME( 5 ) = LDE( XS, XX, LX ) 1011 ISAME( 6 ) = INCXS.EQ.INCX 1012 ISAME( 7 ) = BLS.EQ.BETA 1013 IF( NULL )THEN 1014 ISAME( 8 ) = LDE( YS, YY, LY ) 1015 ELSE 1016 ISAME( 8 ) = LDERES( '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 DMVCH( '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 DCHK2. 1112* 1113 END 1114 SUBROUTINE DCHK3( 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 DTRMV, DTBMV, DTPMV, DTRSV, DTBSV and DTPSV. 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 DOUBLE PRECISION ZERO, HALF, ONE 1128 PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 ) 1129* .. Scalar Arguments .. 1130 DOUBLE PRECISION EPS, THRESH 1131 INTEGER INCMAX, NIDIM, NINC, NKB, NMAX, NOUT, NTRA 1132 LOGICAL FATAL, REWI, TRACE 1133 CHARACTER*6 SNAME 1134* .. Array Arguments .. 1135 DOUBLE PRECISION 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 DOUBLE PRECISION 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 LDE, LDERES 1152 EXTERNAL LDE, LDERES 1153* .. External Subroutines .. 1154 EXTERNAL DMAKE, DMVCH, DTBMV, DTBSV, DTPMV, DTPSV, 1155 $ DTRMV, DTRSV 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 DMVCH. 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 DMAKE( 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 DMAKE( '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 DTRMV( 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 DTBMV( 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 DTPMV( 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 DTRSV( 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 DTBSV( 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 DTPSV( 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 ) = LDE( AS, AA, LAA ) 1338 ISAME( 6 ) = LDAS.EQ.LDA 1339 IF( NULL )THEN 1340 ISAME( 7 ) = LDE( XS, XX, LX ) 1341 ELSE 1342 ISAME( 7 ) = LDERES( '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 ) = LDE( AS, AA, LAA ) 1349 ISAME( 7 ) = LDAS.EQ.LDA 1350 IF( NULL )THEN 1351 ISAME( 8 ) = LDE( XS, XX, LX ) 1352 ELSE 1353 ISAME( 8 ) = LDERES( '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 ) = LDE( AS, AA, LAA ) 1359 IF( NULL )THEN 1360 ISAME( 6 ) = LDE( XS, XX, LX ) 1361 ELSE 1362 ISAME( 6 ) = LDERES( '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 DMVCH( 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 DMVCH( 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 DCHK3. 1469* 1470 END 1471 SUBROUTINE DCHK4( 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 DGER. 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 DOUBLE PRECISION ZERO, HALF, ONE 1486 PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 ) 1487* .. Scalar Arguments .. 1488 DOUBLE PRECISION EPS, THRESH 1489 INTEGER INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA 1490 LOGICAL FATAL, REWI, TRACE 1491 CHARACTER*6 SNAME 1492* .. Array Arguments .. 1493 DOUBLE PRECISION 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 DOUBLE PRECISION 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 DOUBLE PRECISION W( 1 ) 1507 LOGICAL ISAME( 13 ) 1508* .. External Functions .. 1509 LOGICAL LDE, LDERES 1510 EXTERNAL LDE, LDERES 1511* .. External Subroutines .. 1512 EXTERNAL DGER, DMAKE, DMVCH 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 DMAKE( '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 DMAKE( '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 DMAKE( 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 DGER( 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 ) = LDE( XS, XX, LX ) 1629 ISAME( 5 ) = INCXS.EQ.INCX 1630 ISAME( 6 ) = LDE( YS, YY, LY ) 1631 ISAME( 7 ) = INCYS.EQ.INCY 1632 IF( NULL )THEN 1633 ISAME( 8 ) = LDE( AS, AA, LAA ) 1634 ELSE 1635 ISAME( 8 ) = LDERES( '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 DMVCH( '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 DCHK4. 1730* 1731 END 1732 SUBROUTINE DCHK5( 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 DSYR and DSPR. 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 DOUBLE PRECISION ZERO, HALF, ONE 1747 PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 ) 1748* .. Scalar Arguments .. 1749 DOUBLE PRECISION EPS, THRESH 1750 INTEGER INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA 1751 LOGICAL FATAL, REWI, TRACE 1752 CHARACTER*6 SNAME 1753* .. Array Arguments .. 1754 DOUBLE PRECISION 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 DOUBLE PRECISION 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 DOUBLE PRECISION W( 1 ) 1769 LOGICAL ISAME( 13 ) 1770* .. External Functions .. 1771 LOGICAL LDE, LDERES 1772 EXTERNAL LDE, LDERES 1773* .. External Subroutines .. 1774 EXTERNAL DMAKE, DMVCH, DSPR, DSYR 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 DMAKE( '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 DMAKE( 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 DSYR( 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 DSPR( 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 ) = LDE( XS, XX, LX ) 1889 ISAME( 5 ) = INCXS.EQ.INCX 1890 IF( NULL )THEN 1891 ISAME( 6 ) = LDE( AS, AA, LAA ) 1892 ELSE 1893 ISAME( 6 ) = LDERES( 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 DMVCH( '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 DCHK5. 2008* 2009 END 2010 SUBROUTINE DCHK6( 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 DSYR2 and DSPR2. 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 DOUBLE PRECISION ZERO, HALF, ONE 2025 PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 ) 2026* .. Scalar Arguments .. 2027 DOUBLE PRECISION EPS, THRESH 2028 INTEGER INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA 2029 LOGICAL FATAL, REWI, TRACE 2030 CHARACTER*6 SNAME 2031* .. Array Arguments .. 2032 DOUBLE PRECISION 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 DOUBLE PRECISION 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 DOUBLE PRECISION W( 2 ) 2048 LOGICAL ISAME( 13 ) 2049* .. External Functions .. 2050 LOGICAL LDE, LDERES 2051 EXTERNAL LDE, LDERES 2052* .. External Subroutines .. 2053 EXTERNAL DMAKE, DMVCH, DSPR2, DSYR2 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 DMAKE( '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 DMAKE( '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 DMAKE( 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 DSYR2( 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 DSPR2( 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 ) = LDE( XS, XX, LX ) 2189 ISAME( 5 ) = INCXS.EQ.INCX 2190 ISAME( 6 ) = LDE( YS, YY, LY ) 2191 ISAME( 7 ) = INCYS.EQ.INCY 2192 IF( NULL )THEN 2193 ISAME( 8 ) = LDE( AS, AA, LAA ) 2194 ELSE 2195 ISAME( 8 ) = LDERES( 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 DMVCH( '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 DCHK6. 2323* 2324 END 2325 SUBROUTINE DCHKE( 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 DOUBLE PRECISION ALPHA, BETA 2345* .. Local Arrays .. 2346 DOUBLE PRECISION A( 1, 1 ), X( 1 ), Y( 1 ) 2347* .. External Subroutines .. 2348 EXTERNAL CHKXER, DGBMV, DGEMV, DGER, DSBMV, DSPMV, DSPR, 2349 $ DSPR2, DSYMV, DSYR, DSYR2, DTBMV, DTBSV, DTPMV, 2350 $ DTPSV, DTRMV, DTRSV 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 DGEMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 ) 2365 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2366 INFOT = 2 2367 CALL DGEMV( 'N', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 ) 2368 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2369 INFOT = 3 2370 CALL DGEMV( 'N', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 ) 2371 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2372 INFOT = 6 2373 CALL DGEMV( 'N', 2, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 ) 2374 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2375 INFOT = 8 2376 CALL DGEMV( 'N', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 ) 2377 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2378 INFOT = 11 2379 CALL DGEMV( '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 DGBMV( '/', 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 DGBMV( '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 DGBMV( '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 DGBMV( '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 DGBMV( '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 DGBMV( '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 DGBMV( '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 DGBMV( '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 DSYMV( '/', 0, ALPHA, A, 1, X, 1, BETA, Y, 1 ) 2409 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2410 INFOT = 2 2411 CALL DSYMV( 'U', -1, ALPHA, A, 1, X, 1, BETA, Y, 1 ) 2412 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2413 INFOT = 5 2414 CALL DSYMV( 'U', 2, ALPHA, A, 1, X, 1, BETA, Y, 1 ) 2415 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2416 INFOT = 7 2417 CALL DSYMV( 'U', 0, ALPHA, A, 1, X, 0, BETA, Y, 1 ) 2418 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2419 INFOT = 10 2420 CALL DSYMV( '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 DSBMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 ) 2425 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2426 INFOT = 2 2427 CALL DSBMV( 'U', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 ) 2428 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2429 INFOT = 3 2430 CALL DSBMV( 'U', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 ) 2431 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2432 INFOT = 6 2433 CALL DSBMV( 'U', 0, 1, ALPHA, A, 1, X, 1, BETA, Y, 1 ) 2434 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2435 INFOT = 8 2436 CALL DSBMV( 'U', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 ) 2437 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2438 INFOT = 11 2439 CALL DSBMV( '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 DSPMV( '/', 0, ALPHA, A, X, 1, BETA, Y, 1 ) 2444 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2445 INFOT = 2 2446 CALL DSPMV( 'U', -1, ALPHA, A, X, 1, BETA, Y, 1 ) 2447 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2448 INFOT = 6 2449 CALL DSPMV( 'U', 0, ALPHA, A, X, 0, BETA, Y, 1 ) 2450 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2451 INFOT = 9 2452 CALL DSPMV( '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 DTRMV( '/', 'N', 'N', 0, A, 1, X, 1 ) 2457 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2458 INFOT = 2 2459 CALL DTRMV( 'U', '/', 'N', 0, A, 1, X, 1 ) 2460 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2461 INFOT = 3 2462 CALL DTRMV( 'U', 'N', '/', 0, A, 1, X, 1 ) 2463 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2464 INFOT = 4 2465 CALL DTRMV( 'U', 'N', 'N', -1, A, 1, X, 1 ) 2466 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2467 INFOT = 6 2468 CALL DTRMV( 'U', 'N', 'N', 2, A, 1, X, 1 ) 2469 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2470 INFOT = 8 2471 CALL DTRMV( '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 DTBMV( '/', 'N', 'N', 0, 0, A, 1, X, 1 ) 2476 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2477 INFOT = 2 2478 CALL DTBMV( 'U', '/', 'N', 0, 0, A, 1, X, 1 ) 2479 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2480 INFOT = 3 2481 CALL DTBMV( 'U', 'N', '/', 0, 0, A, 1, X, 1 ) 2482 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2483 INFOT = 4 2484 CALL DTBMV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 ) 2485 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2486 INFOT = 5 2487 CALL DTBMV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 ) 2488 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2489 INFOT = 7 2490 CALL DTBMV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 ) 2491 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2492 INFOT = 9 2493 CALL DTBMV( '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 DTPMV( '/', 'N', 'N', 0, A, X, 1 ) 2498 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2499 INFOT = 2 2500 CALL DTPMV( 'U', '/', 'N', 0, A, X, 1 ) 2501 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2502 INFOT = 3 2503 CALL DTPMV( 'U', 'N', '/', 0, A, X, 1 ) 2504 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2505 INFOT = 4 2506 CALL DTPMV( 'U', 'N', 'N', -1, A, X, 1 ) 2507 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2508 INFOT = 7 2509 CALL DTPMV( '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 DTRSV( '/', 'N', 'N', 0, A, 1, X, 1 ) 2514 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2515 INFOT = 2 2516 CALL DTRSV( 'U', '/', 'N', 0, A, 1, X, 1 ) 2517 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2518 INFOT = 3 2519 CALL DTRSV( 'U', 'N', '/', 0, A, 1, X, 1 ) 2520 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2521 INFOT = 4 2522 CALL DTRSV( 'U', 'N', 'N', -1, A, 1, X, 1 ) 2523 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2524 INFOT = 6 2525 CALL DTRSV( 'U', 'N', 'N', 2, A, 1, X, 1 ) 2526 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2527 INFOT = 8 2528 CALL DTRSV( '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 DTBSV( '/', 'N', 'N', 0, 0, A, 1, X, 1 ) 2533 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2534 INFOT = 2 2535 CALL DTBSV( 'U', '/', 'N', 0, 0, A, 1, X, 1 ) 2536 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2537 INFOT = 3 2538 CALL DTBSV( 'U', 'N', '/', 0, 0, A, 1, X, 1 ) 2539 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2540 INFOT = 4 2541 CALL DTBSV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 ) 2542 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2543 INFOT = 5 2544 CALL DTBSV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 ) 2545 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2546 INFOT = 7 2547 CALL DTBSV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 ) 2548 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2549 INFOT = 9 2550 CALL DTBSV( '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 DTPSV( '/', 'N', 'N', 0, A, X, 1 ) 2555 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2556 INFOT = 2 2557 CALL DTPSV( 'U', '/', 'N', 0, A, X, 1 ) 2558 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2559 INFOT = 3 2560 CALL DTPSV( 'U', 'N', '/', 0, A, X, 1 ) 2561 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2562 INFOT = 4 2563 CALL DTPSV( 'U', 'N', 'N', -1, A, X, 1 ) 2564 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2565 INFOT = 7 2566 CALL DTPSV( '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 DGER( -1, 0, ALPHA, X, 1, Y, 1, A, 1 ) 2571 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2572 INFOT = 2 2573 CALL DGER( 0, -1, ALPHA, X, 1, Y, 1, A, 1 ) 2574 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2575 INFOT = 5 2576 CALL DGER( 0, 0, ALPHA, X, 0, Y, 1, A, 1 ) 2577 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2578 INFOT = 7 2579 CALL DGER( 0, 0, ALPHA, X, 1, Y, 0, A, 1 ) 2580 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2581 INFOT = 9 2582 CALL DGER( 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 DSYR( '/', 0, ALPHA, X, 1, A, 1 ) 2587 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2588 INFOT = 2 2589 CALL DSYR( 'U', -1, ALPHA, X, 1, A, 1 ) 2590 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2591 INFOT = 5 2592 CALL DSYR( 'U', 0, ALPHA, X, 0, A, 1 ) 2593 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2594 INFOT = 7 2595 CALL DSYR( '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 DSPR( '/', 0, ALPHA, X, 1, A ) 2600 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2601 INFOT = 2 2602 CALL DSPR( 'U', -1, ALPHA, X, 1, A ) 2603 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2604 INFOT = 5 2605 CALL DSPR( 'U', 0, ALPHA, X, 0, A ) 2606 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2607 GO TO 170 2608 150 INFOT = 1 2609 CALL DSYR2( '/', 0, ALPHA, X, 1, Y, 1, A, 1 ) 2610 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2611 INFOT = 2 2612 CALL DSYR2( 'U', -1, ALPHA, X, 1, Y, 1, A, 1 ) 2613 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2614 INFOT = 5 2615 CALL DSYR2( 'U', 0, ALPHA, X, 0, Y, 1, A, 1 ) 2616 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2617 INFOT = 7 2618 CALL DSYR2( 'U', 0, ALPHA, X, 1, Y, 0, A, 1 ) 2619 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2620 INFOT = 9 2621 CALL DSYR2( '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 DSPR2( '/', 0, ALPHA, X, 1, Y, 1, A ) 2626 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2627 INFOT = 2 2628 CALL DSPR2( 'U', -1, ALPHA, X, 1, Y, 1, A ) 2629 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2630 INFOT = 5 2631 CALL DSPR2( 'U', 0, ALPHA, X, 0, Y, 1, A ) 2632 CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK ) 2633 INFOT = 7 2634 CALL DSPR2( '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 DCHKE. 2649* 2650 END 2651 SUBROUTINE DMAKE( 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 DOUBLE PRECISION ZERO, ONE 2669 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) 2670 DOUBLE PRECISION ROGUE 2671 PARAMETER ( ROGUE = -1.0D10 ) 2672* .. Scalar Arguments .. 2673 DOUBLE PRECISION 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 DOUBLE PRECISION 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 DOUBLE PRECISION DBEG 2685 EXTERNAL DBEG 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 ) = DBEG( 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 DMAKE. 2825* 2826 END 2827 SUBROUTINE DMVCH( 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 DOUBLE PRECISION ZERO, ONE 2840 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) 2841* .. Scalar Arguments .. 2842 DOUBLE PRECISION ALPHA, BETA, EPS, ERR 2843 INTEGER INCX, INCY, M, N, NMAX, NOUT 2844 LOGICAL FATAL, MV 2845 CHARACTER*1 TRANS 2846* .. Array Arguments .. 2847 DOUBLE PRECISION A( NMAX, * ), G( * ), X( * ), Y( * ), YT( * ), 2848 $ YY( * ) 2849* .. Local Scalars .. 2850 DOUBLE PRECISION 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 DMVCH. 2942* 2943 END 2944 LOGICAL FUNCTION LDE( 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 DOUBLE PRECISION 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 LDE = .TRUE. 2966 GO TO 30 2967 20 CONTINUE 2968 LDE = .FALSE. 2969 30 RETURN 2970* 2971* End of LDE. 2972* 2973 END 2974 LOGICAL FUNCTION LDERES( 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 DOUBLE PRECISION 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 LDERES = .TRUE. 3025 GO TO 80 3026 70 CONTINUE 3027 LDERES = .FALSE. 3028 80 RETURN 3029* 3030* End of LDERES. 3031* 3032 END 3033 DOUBLE PRECISION FUNCTION DBEG( 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 DBLE 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 DBEG = DBLE( I - 500 )/1001.0D0 3074 RETURN 3075* 3076* End of DBEG. 3077* 3078 END 3079 DOUBLE PRECISION FUNCTION DDIFF( 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 DOUBLE PRECISION X, Y 3088* .. Executable Statements .. 3089 DDIFF = X - Y 3090 RETURN 3091* 3092* End of DDIFF. 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