1 INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, 2 $ N4 ) 3* 4* -- LAPACK auxiliary routine (version 3.0) -- 5* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., 6* Courant Institute, Argonne National Lab, and Rice University 7* June 30, 1999 8* 9* .. Scalar Arguments .. 10 CHARACTER*( * ) NAME, OPTS 11 INTEGER ISPEC, N1, N2, N3, N4 12* .. 13* 14* Purpose 15* ======= 16* 17* ILAENV is called from the LAPACK routines to choose problem-dependent 18* parameters for the local environment. See ISPEC for a description of 19* the parameters. 20* 21* This version provides a set of parameters which should give good, 22* but not optimal, performance on many of the currently available 23* computers. Users are encouraged to modify this subroutine to set 24* the tuning parameters for their particular machine using the option 25* and problem size information in the arguments. 26* 27* This routine will not function correctly if it is converted to all 28* lower case. Converting it to all upper case is allowed. 29* 30* Arguments 31* ========= 32* 33* ISPEC (input) INTEGER 34* Specifies the parameter to be returned as the value of 35* ILAENV. 36* = 1: the optimal blocksize; if this value is 1, an unblocked 37* algorithm will give the best performance. 38* = 2: the minimum block size for which the block routine 39* should be used; if the usable block size is less than 40* this value, an unblocked routine should be used. 41* = 3: the crossover point (in a block routine, for N less 42* than this value, an unblocked routine should be used) 43* = 4: the number of shifts, used in the nonsymmetric 44* eigenvalue routines 45* = 5: the minimum column dimension for blocking to be used; 46* rectangular blocks must have dimension at least k by m, 47* where k is given by ILAENV(2,...) and m by ILAENV(5,...) 48* = 6: the crossover point for the SVD (when reducing an m by n 49* matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds 50* this value, a QR factorization is used first to reduce 51* the matrix to a triangular form.) 52* = 7: the number of processors 53* = 8: the crossover point for the multishift QR and QZ methods 54* for nonsymmetric eigenvalue problems. 55* = 9: maximum size of the subproblems at the bottom of the 56* computation tree in the divide-and-conquer algorithm 57* (used by xGELSD and xGESDD) 58* =10: ieee NaN arithmetic can be trusted not to trap 59* =11: infinity arithmetic can be trusted not to trap 60* 61* NAME (input) CHARACTER*(*) 62* The name of the calling subroutine, in either upper case or 63* lower case. 64* 65* OPTS (input) CHARACTER*(*) 66* The character options to the subroutine NAME, concatenated 67* into a single character string. For example, UPLO = 'U', 68* TRANS = 'T', and DIAG = 'N' for a triangular routine would 69* be specified as OPTS = 'UTN'. 70* 71* N1 (input) INTEGER 72* N2 (input) INTEGER 73* N3 (input) INTEGER 74* N4 (input) INTEGER 75* Problem dimensions for the subroutine NAME; these may not all 76* be required. 77* 78* (ILAENV) (output) INTEGER 79* >= 0: the value of the parameter specified by ISPEC 80* < 0: if ILAENV = -k, the k-th argument had an illegal value. 81* 82* Further Details 83* =============== 84* 85* The following conventions have been used when calling ILAENV from the 86* LAPACK routines: 87* 1) OPTS is a concatenation of all of the character options to 88* subroutine NAME, in the same order that they appear in the 89* argument list for NAME, even if they are not used in determining 90* the value of the parameter specified by ISPEC. 91* 2) The problem dimensions N1, N2, N3, N4 are specified in the order 92* that they appear in the argument list for NAME. N1 is used 93* first, N2 second, and so on, and unused problem dimensions are 94* passed a value of -1. 95* 3) The parameter value returned by ILAENV is checked for validity in 96* the calling subroutine. For example, ILAENV is used to retrieve 97* the optimal blocksize for STRTRI as follows: 98* 99* NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) 100* IF( NB.LE.1 ) NB = MAX( 1, N ) 101* 102* ===================================================================== 103* 104* .. Local Scalars .. 105 LOGICAL CNAME, SNAME 106 CHARACTER*1 C1 107 CHARACTER*2 C2, C4 108 CHARACTER*3 C3 109 CHARACTER*6 SUBNAM 110 INTEGER I, IC, IZ, NB, NBMIN, NX 111* .. 112* .. Intrinsic Functions .. 113 INTRINSIC CHAR, ICHAR, INT, MIN, REAL 114* .. 115* .. External Functions .. 116 INTEGER IEEECK 117 EXTERNAL IEEECK 118* .. 119* .. Executable Statements .. 120* 121 GO TO ( 100, 100, 100, 400, 500, 600, 700, 800, 900, 1000, 122 $ 1100 ) ISPEC 123* 124* Invalid value for ISPEC 125* 126 ILAENV = -1 127 RETURN 128* 129 100 CONTINUE 130* 131* Convert NAME to upper case if the first character is lower case. 132* 133 ILAENV = 1 134 SUBNAM = NAME 135 IC = ICHAR( SUBNAM( 1:1 ) ) 136 IZ = ICHAR( 'Z' ) 137 IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN 138* 139* ASCII character set 140* 141 IF( IC.GE.97 .AND. IC.LE.122 ) THEN 142 SUBNAM( 1:1 ) = CHAR( IC-32 ) 143 DO 10 I = 2, 6 144 IC = ICHAR( SUBNAM( I:I ) ) 145 IF( IC.GE.97 .AND. IC.LE.122 ) 146 $ SUBNAM( I:I ) = CHAR( IC-32 ) 147 10 CONTINUE 148 END IF 149* 150 ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN 151* 152* EBCDIC character set 153* 154 IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR. 155 $ ( IC.GE.145 .AND. IC.LE.153 ) .OR. 156 $ ( IC.GE.162 .AND. IC.LE.169 ) ) THEN 157 SUBNAM( 1:1 ) = CHAR( IC+64 ) 158 DO 20 I = 2, 6 159 IC = ICHAR( SUBNAM( I:I ) ) 160 IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR. 161 $ ( IC.GE.145 .AND. IC.LE.153 ) .OR. 162 $ ( IC.GE.162 .AND. IC.LE.169 ) ) 163 $ SUBNAM( I:I ) = CHAR( IC+64 ) 164 20 CONTINUE 165 END IF 166* 167 ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN 168* 169* Prime machines: ASCII+128 170* 171 IF( IC.GE.225 .AND. IC.LE.250 ) THEN 172 SUBNAM( 1:1 ) = CHAR( IC-32 ) 173 DO 30 I = 2, 6 174 IC = ICHAR( SUBNAM( I:I ) ) 175 IF( IC.GE.225 .AND. IC.LE.250 ) 176 $ SUBNAM( I:I ) = CHAR( IC-32 ) 177 30 CONTINUE 178 END IF 179 END IF 180* 181 C1 = SUBNAM( 1:1 ) 182 SNAME = C1.EQ.'S' .OR. C1.EQ.'D' 183 CNAME = C1.EQ.'C' .OR. C1.EQ.'Z' 184 IF( .NOT.( CNAME .OR. SNAME ) ) 185 $ RETURN 186 C2 = SUBNAM( 2:3 ) 187 C3 = SUBNAM( 4:6 ) 188 C4 = C3( 2:3 ) 189* 190 GO TO ( 110, 200, 300 ) ISPEC 191* 192 110 CONTINUE 193* 194* ISPEC = 1: block size 195* 196* In these examples, separate code is provided for setting NB for 197* real and complex. We assume that NB will take the same value in 198* single or double precision. 199* 200 NB = 1 201* 202 IF( C2.EQ.'GE' ) THEN 203 IF( C3.EQ.'TRF' ) THEN 204 IF( SNAME ) THEN 205 NB = 64 206 ELSE 207 NB = 64 208 END IF 209 ELSE IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. 210 $ C3.EQ.'QLF' ) THEN 211 IF( SNAME ) THEN 212 NB = 32 213 ELSE 214 NB = 32 215 END IF 216 ELSE IF( C3.EQ.'HRD' ) THEN 217 IF( SNAME ) THEN 218 NB = 32 219 ELSE 220 NB = 32 221 END IF 222 ELSE IF( C3.EQ.'BRD' ) THEN 223 IF( SNAME ) THEN 224 NB = 32 225 ELSE 226 NB = 32 227 END IF 228 ELSE IF( C3.EQ.'TRI' ) THEN 229 IF( SNAME ) THEN 230 NB = 64 231 ELSE 232 NB = 64 233 END IF 234 END IF 235 ELSE IF( C2.EQ.'PO' ) THEN 236 IF( C3.EQ.'TRF' ) THEN 237 IF( SNAME ) THEN 238 NB = 64 239 ELSE 240 NB = 64 241 END IF 242 END IF 243 ELSE IF( C2.EQ.'SY' ) THEN 244 IF( C3.EQ.'TRF' ) THEN 245 IF( SNAME ) THEN 246 NB = 64 247 ELSE 248 NB = 64 249 END IF 250 ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN 251 NB = 32 252 ELSE IF( SNAME .AND. C3.EQ.'GST' ) THEN 253 NB = 64 254 END IF 255 ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN 256 IF( C3.EQ.'TRF' ) THEN 257 NB = 64 258 ELSE IF( C3.EQ.'TRD' ) THEN 259 NB = 32 260 ELSE IF( C3.EQ.'GST' ) THEN 261 NB = 64 262 END IF 263 ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN 264 IF( C3( 1:1 ).EQ.'G' ) THEN 265 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. 266 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. 267 $ C4.EQ.'BR' ) THEN 268 NB = 32 269 END IF 270 ELSE IF( C3( 1:1 ).EQ.'M' ) THEN 271 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. 272 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. 273 $ C4.EQ.'BR' ) THEN 274 NB = 32 275 END IF 276 END IF 277 ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN 278 IF( C3( 1:1 ).EQ.'G' ) THEN 279 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. 280 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. 281 $ C4.EQ.'BR' ) THEN 282 NB = 32 283 END IF 284 ELSE IF( C3( 1:1 ).EQ.'M' ) THEN 285 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. 286 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. 287 $ C4.EQ.'BR' ) THEN 288 NB = 32 289 END IF 290 END IF 291 ELSE IF( C2.EQ.'GB' ) THEN 292 IF( C3.EQ.'TRF' ) THEN 293 IF( SNAME ) THEN 294 IF( N4.LE.64 ) THEN 295 NB = 1 296 ELSE 297 NB = 32 298 END IF 299 ELSE 300 IF( N4.LE.64 ) THEN 301 NB = 1 302 ELSE 303 NB = 32 304 END IF 305 END IF 306 END IF 307 ELSE IF( C2.EQ.'PB' ) THEN 308 IF( C3.EQ.'TRF' ) THEN 309 IF( SNAME ) THEN 310 IF( N2.LE.64 ) THEN 311 NB = 1 312 ELSE 313 NB = 32 314 END IF 315 ELSE 316 IF( N2.LE.64 ) THEN 317 NB = 1 318 ELSE 319 NB = 32 320 END IF 321 END IF 322 END IF 323 ELSE IF( C2.EQ.'TR' ) THEN 324 IF( C3.EQ.'TRI' ) THEN 325 IF( SNAME ) THEN 326 NB = 64 327 ELSE 328 NB = 64 329 END IF 330 END IF 331 ELSE IF( C2.EQ.'LA' ) THEN 332 IF( C3.EQ.'UUM' ) THEN 333 IF( SNAME ) THEN 334 NB = 64 335 ELSE 336 NB = 64 337 END IF 338 END IF 339 ELSE IF( SNAME .AND. C2.EQ.'ST' ) THEN 340 IF( C3.EQ.'EBZ' ) THEN 341 NB = 1 342 END IF 343 END IF 344 ILAENV = NB 345 RETURN 346* 347 200 CONTINUE 348* 349* ISPEC = 2: minimum block size 350* 351 NBMIN = 2 352 IF( C2.EQ.'GE' ) THEN 353 IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. 354 $ C3.EQ.'QLF' ) THEN 355 IF( SNAME ) THEN 356 NBMIN = 2 357 ELSE 358 NBMIN = 2 359 END IF 360 ELSE IF( C3.EQ.'HRD' ) THEN 361 IF( SNAME ) THEN 362 NBMIN = 2 363 ELSE 364 NBMIN = 2 365 END IF 366 ELSE IF( C3.EQ.'BRD' ) THEN 367 IF( SNAME ) THEN 368 NBMIN = 2 369 ELSE 370 NBMIN = 2 371 END IF 372 ELSE IF( C3.EQ.'TRI' ) THEN 373 IF( SNAME ) THEN 374 NBMIN = 2 375 ELSE 376 NBMIN = 2 377 END IF 378 END IF 379 ELSE IF( C2.EQ.'SY' ) THEN 380 IF( C3.EQ.'TRF' ) THEN 381 IF( SNAME ) THEN 382 NBMIN = 8 383 ELSE 384 NBMIN = 8 385 END IF 386 ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN 387 NBMIN = 2 388 END IF 389 ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN 390 IF( C3.EQ.'TRD' ) THEN 391 NBMIN = 2 392 END IF 393 ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN 394 IF( C3( 1:1 ).EQ.'G' ) THEN 395 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. 396 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. 397 $ C4.EQ.'BR' ) THEN 398 NBMIN = 2 399 END IF 400 ELSE IF( C3( 1:1 ).EQ.'M' ) THEN 401 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. 402 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. 403 $ C4.EQ.'BR' ) THEN 404 NBMIN = 2 405 END IF 406 END IF 407 ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN 408 IF( C3( 1:1 ).EQ.'G' ) THEN 409 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. 410 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. 411 $ C4.EQ.'BR' ) THEN 412 NBMIN = 2 413 END IF 414 ELSE IF( C3( 1:1 ).EQ.'M' ) THEN 415 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. 416 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. 417 $ C4.EQ.'BR' ) THEN 418 NBMIN = 2 419 END IF 420 END IF 421 END IF 422 ILAENV = NBMIN 423 RETURN 424* 425 300 CONTINUE 426* 427* ISPEC = 3: crossover point 428* 429 NX = 0 430 IF( C2.EQ.'GE' ) THEN 431 IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. 432 $ C3.EQ.'QLF' ) THEN 433 IF( SNAME ) THEN 434 NX = 128 435 ELSE 436 NX = 128 437 END IF 438 ELSE IF( C3.EQ.'HRD' ) THEN 439 IF( SNAME ) THEN 440 NX = 128 441 ELSE 442 NX = 128 443 END IF 444 ELSE IF( C3.EQ.'BRD' ) THEN 445 IF( SNAME ) THEN 446 NX = 128 447 ELSE 448 NX = 128 449 END IF 450 END IF 451 ELSE IF( C2.EQ.'SY' ) THEN 452 IF( SNAME .AND. C3.EQ.'TRD' ) THEN 453 NX = 32 454 END IF 455 ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN 456 IF( C3.EQ.'TRD' ) THEN 457 NX = 32 458 END IF 459 ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN 460 IF( C3( 1:1 ).EQ.'G' ) THEN 461 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. 462 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. 463 $ C4.EQ.'BR' ) THEN 464 NX = 128 465 END IF 466 END IF 467 ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN 468 IF( C3( 1:1 ).EQ.'G' ) THEN 469 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. 470 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. 471 $ C4.EQ.'BR' ) THEN 472 NX = 128 473 END IF 474 END IF 475 END IF 476 ILAENV = NX 477 RETURN 478* 479 400 CONTINUE 480* 481* ISPEC = 4: number of shifts (used by xHSEQR) 482* 483 ILAENV = 6 484 RETURN 485* 486 500 CONTINUE 487* 488* ISPEC = 5: minimum column dimension (not used) 489* 490 ILAENV = 2 491 RETURN 492* 493 600 CONTINUE 494* 495* ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD) 496* 497 ILAENV = INT( REAL( MIN( N1, N2 ) )*1.6E0 ) 498 RETURN 499* 500 700 CONTINUE 501* 502* ISPEC = 7: number of processors (not used) 503* 504 ILAENV = 1 505 RETURN 506* 507 800 CONTINUE 508* 509* ISPEC = 8: crossover point for multishift (used by xHSEQR) 510* 511 ILAENV = 50 512 RETURN 513* 514 900 CONTINUE 515* 516* ISPEC = 9: maximum size of the subproblems at the bottom of the 517* computation tree in the divide-and-conquer algorithm 518* (used by xGELSD and xGESDD) 519* 520 ILAENV = 25 521 RETURN 522* 523 1000 CONTINUE 524* 525* ISPEC = 10: ieee NaN arithmetic can be trusted not to trap 526* 527C ILAENV = 0 528 ILAENV = 1 529 IF( ILAENV.EQ.1 ) THEN 530 ILAENV = IEEECK( 0, 0.0, 1.0 ) 531 END IF 532 RETURN 533* 534 1100 CONTINUE 535* 536* ISPEC = 11: infinity arithmetic can be trusted not to trap 537* 538C ILAENV = 0 539 ILAENV = 1 540 IF( ILAENV.EQ.1 ) THEN 541 ILAENV = IEEECK( 1, 0.0, 1.0 ) 542 END IF 543 RETURN 544* 545* End of ILAENV 546* 547 END 548