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