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