Annotation of rpl/lapack/lapack/ilaenv.f, revision 1.20
1.9 bertrand 1: *> \brief \b ILAENV
2: *
3: * =========== DOCUMENTATION ===========
1.1 bertrand 4: *
1.16 bertrand 5: * Online html documentation available at
6: * http://www.netlib.org/lapack/explore-html/
1.1 bertrand 7: *
1.9 bertrand 8: *> \htmlonly
1.16 bertrand 9: *> Download ILAENV + dependencies
10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilaenv.f">
11: *> [TGZ]</a>
12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilaenv.f">
13: *> [ZIP]</a>
14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilaenv.f">
1.9 bertrand 15: *> [TXT]</a>
1.16 bertrand 16: *> \endhtmlonly
1.9 bertrand 17: *
18: * Definition:
19: * ===========
20: *
21: * INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
1.16 bertrand 22: *
1.9 bertrand 23: * .. Scalar Arguments ..
24: * CHARACTER*( * ) NAME, OPTS
25: * INTEGER ISPEC, N1, N2, N3, N4
26: * ..
1.16 bertrand 27: *
1.9 bertrand 28: *
29: *> \par Purpose:
30: * =============
31: *>
32: *> \verbatim
33: *>
34: *> ILAENV is called from the LAPACK routines to choose problem-dependent
35: *> parameters for the local environment. See ISPEC for a description of
36: *> the parameters.
37: *>
38: *> ILAENV returns an INTEGER
39: *> if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC
40: *> if ILAENV < 0: if ILAENV = -k, the k-th argument had an illegal value.
41: *>
42: *> This version provides a set of parameters which should give good,
43: *> but not optimal, performance on many of the currently available
44: *> computers. Users are encouraged to modify this subroutine to set
45: *> the tuning parameters for their particular machine using the option
46: *> and problem size information in the arguments.
47: *>
48: *> This routine will not function correctly if it is converted to all
49: *> lower case. Converting it to all upper case is allowed.
50: *> \endverbatim
51: *
52: * Arguments:
53: * ==========
54: *
55: *> \param[in] ISPEC
56: *> \verbatim
57: *> ISPEC is INTEGER
58: *> Specifies the parameter to be returned as the value of
59: *> ILAENV.
60: *> = 1: the optimal blocksize; if this value is 1, an unblocked
61: *> algorithm will give the best performance.
62: *> = 2: the minimum block size for which the block routine
63: *> should be used; if the usable block size is less than
64: *> this value, an unblocked routine should be used.
65: *> = 3: the crossover point (in a block routine, for N less
66: *> than this value, an unblocked routine should be used)
67: *> = 4: the number of shifts, used in the nonsymmetric
68: *> eigenvalue routines (DEPRECATED)
69: *> = 5: the minimum column dimension for blocking to be used;
70: *> rectangular blocks must have dimension at least k by m,
71: *> where k is given by ILAENV(2,...) and m by ILAENV(5,...)
72: *> = 6: the crossover point for the SVD (when reducing an m by n
73: *> matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds
74: *> this value, a QR factorization is used first to reduce
75: *> the matrix to a triangular form.)
76: *> = 7: the number of processors
77: *> = 8: the crossover point for the multishift QR method
78: *> for nonsymmetric eigenvalue problems (DEPRECATED)
79: *> = 9: maximum size of the subproblems at the bottom of the
80: *> computation tree in the divide-and-conquer algorithm
81: *> (used by xGELSD and xGESDD)
1.20 ! bertrand 82: *> =10: ieee infinity and NaN arithmetic can be trusted not to trap
1.9 bertrand 83: *> =11: infinity arithmetic can be trusted not to trap
1.20 ! bertrand 84: *> 12 <= ISPEC <= 17:
1.14 bertrand 85: *> xHSEQR or related subroutines,
1.9 bertrand 86: *> see IPARMQ for detailed explanation
87: *> \endverbatim
88: *>
89: *> \param[in] NAME
90: *> \verbatim
91: *> NAME is CHARACTER*(*)
92: *> The name of the calling subroutine, in either upper case or
93: *> lower case.
94: *> \endverbatim
95: *>
96: *> \param[in] OPTS
97: *> \verbatim
98: *> OPTS is CHARACTER*(*)
99: *> The character options to the subroutine NAME, concatenated
100: *> into a single character string. For example, UPLO = 'U',
101: *> TRANS = 'T', and DIAG = 'N' for a triangular routine would
102: *> be specified as OPTS = 'UTN'.
103: *> \endverbatim
104: *>
105: *> \param[in] N1
106: *> \verbatim
107: *> N1 is INTEGER
108: *> \endverbatim
109: *>
110: *> \param[in] N2
111: *> \verbatim
112: *> N2 is INTEGER
113: *> \endverbatim
114: *>
115: *> \param[in] N3
116: *> \verbatim
117: *> N3 is INTEGER
118: *> \endverbatim
119: *>
120: *> \param[in] N4
121: *> \verbatim
122: *> N4 is INTEGER
123: *> Problem dimensions for the subroutine NAME; these may not all
124: *> be required.
125: *> \endverbatim
126: *
127: * Authors:
128: * ========
129: *
1.16 bertrand 130: *> \author Univ. of Tennessee
131: *> \author Univ. of California Berkeley
132: *> \author Univ. of Colorado Denver
133: *> \author NAG Ltd.
1.9 bertrand 134: *
1.16 bertrand 135: *> \ingroup OTHERauxiliary
1.9 bertrand 136: *
137: *> \par Further Details:
138: * =====================
139: *>
140: *> \verbatim
141: *>
142: *> The following conventions have been used when calling ILAENV from the
143: *> LAPACK routines:
144: *> 1) OPTS is a concatenation of all of the character options to
145: *> subroutine NAME, in the same order that they appear in the
146: *> argument list for NAME, even if they are not used in determining
147: *> the value of the parameter specified by ISPEC.
148: *> 2) The problem dimensions N1, N2, N3, N4 are specified in the order
149: *> that they appear in the argument list for NAME. N1 is used
150: *> first, N2 second, and so on, and unused problem dimensions are
151: *> passed a value of -1.
152: *> 3) The parameter value returned by ILAENV is checked for validity in
153: *> the calling subroutine. For example, ILAENV is used to retrieve
154: *> the optimal blocksize for STRTRI as follows:
155: *>
156: *> NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 )
157: *> IF( NB.LE.1 ) NB = MAX( 1, N )
158: *> \endverbatim
159: *>
160: * =====================================================================
161: INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
1.1 bertrand 162: *
1.20 ! bertrand 163: * -- LAPACK auxiliary routine --
1.1 bertrand 164: * -- LAPACK is a software package provided by Univ. of Tennessee, --
165: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
166: *
167: * .. Scalar Arguments ..
168: CHARACTER*( * ) NAME, OPTS
169: INTEGER ISPEC, N1, N2, N3, N4
170: * ..
171: *
172: * =====================================================================
173: *
174: * .. Local Scalars ..
175: INTEGER I, IC, IZ, NB, NBMIN, NX
1.19 bertrand 176: LOGICAL CNAME, SNAME, TWOSTAGE
177: CHARACTER C1*1, C2*2, C4*2, C3*3, SUBNAM*16
1.1 bertrand 178: * ..
179: * .. Intrinsic Functions ..
180: INTRINSIC CHAR, ICHAR, INT, MIN, REAL
181: * ..
182: * .. External Functions ..
1.16 bertrand 183: INTEGER IEEECK, IPARMQ, IPARAM2STAGE
184: EXTERNAL IEEECK, IPARMQ, IPARAM2STAGE
1.1 bertrand 185: * ..
186: * .. Executable Statements ..
187: *
188: GO TO ( 10, 10, 10, 80, 90, 100, 110, 120,
1.20 ! bertrand 189: $ 130, 140, 150, 160, 160, 160, 160, 160, 160)ISPEC
1.1 bertrand 190: *
191: * Invalid value for ISPEC
192: *
193: ILAENV = -1
194: RETURN
195: *
196: 10 CONTINUE
197: *
198: * Convert NAME to upper case if the first character is lower case.
199: *
200: ILAENV = 1
201: SUBNAM = NAME
202: IC = ICHAR( SUBNAM( 1: 1 ) )
203: IZ = ICHAR( 'Z' )
204: IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN
205: *
206: * ASCII character set
207: *
208: IF( IC.GE.97 .AND. IC.LE.122 ) THEN
209: SUBNAM( 1: 1 ) = CHAR( IC-32 )
210: DO 20 I = 2, 6
211: IC = ICHAR( SUBNAM( I: I ) )
212: IF( IC.GE.97 .AND. IC.LE.122 )
213: $ SUBNAM( I: I ) = CHAR( IC-32 )
214: 20 CONTINUE
215: END IF
216: *
217: ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN
218: *
219: * EBCDIC character set
220: *
221: IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
222: $ ( IC.GE.145 .AND. IC.LE.153 ) .OR.
223: $ ( IC.GE.162 .AND. IC.LE.169 ) ) THEN
224: SUBNAM( 1: 1 ) = CHAR( IC+64 )
225: DO 30 I = 2, 6
226: IC = ICHAR( SUBNAM( I: I ) )
227: IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
228: $ ( IC.GE.145 .AND. IC.LE.153 ) .OR.
229: $ ( IC.GE.162 .AND. IC.LE.169 ) )SUBNAM( I:
230: $ I ) = CHAR( IC+64 )
231: 30 CONTINUE
232: END IF
233: *
234: ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN
235: *
236: * Prime machines: ASCII+128
237: *
238: IF( IC.GE.225 .AND. IC.LE.250 ) THEN
239: SUBNAM( 1: 1 ) = CHAR( IC-32 )
240: DO 40 I = 2, 6
241: IC = ICHAR( SUBNAM( I: I ) )
242: IF( IC.GE.225 .AND. IC.LE.250 )
243: $ SUBNAM( I: I ) = CHAR( IC-32 )
244: 40 CONTINUE
245: END IF
246: END IF
247: *
248: C1 = SUBNAM( 1: 1 )
249: SNAME = C1.EQ.'S' .OR. C1.EQ.'D'
250: CNAME = C1.EQ.'C' .OR. C1.EQ.'Z'
251: IF( .NOT.( CNAME .OR. SNAME ) )
252: $ RETURN
253: C2 = SUBNAM( 2: 3 )
254: C3 = SUBNAM( 4: 6 )
255: C4 = C3( 2: 3 )
1.19 bertrand 256: TWOSTAGE = LEN( SUBNAM ).GE.11
257: $ .AND. SUBNAM( 11: 11 ).EQ.'2'
1.1 bertrand 258: *
259: GO TO ( 50, 60, 70 )ISPEC
260: *
261: 50 CONTINUE
262: *
263: * ISPEC = 1: block size
264: *
265: * In these examples, separate code is provided for setting NB for
266: * real and complex. We assume that NB will take the same value in
267: * single or double precision.
268: *
269: NB = 1
270: *
1.19 bertrand 271: IF( SUBNAM(2:6).EQ.'LAORH' ) THEN
272: *
273: * This is for *LAORHR_GETRFNP routine
274: *
275: IF( SNAME ) THEN
276: NB = 32
277: ELSE
278: NB = 32
279: END IF
280: ELSE IF( C2.EQ.'GE' ) THEN
1.1 bertrand 281: IF( C3.EQ.'TRF' ) THEN
282: IF( SNAME ) THEN
283: NB = 64
284: ELSE
285: NB = 64
286: END IF
287: ELSE IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
288: $ C3.EQ.'QLF' ) THEN
289: IF( SNAME ) THEN
290: NB = 32
291: ELSE
292: NB = 32
293: END IF
1.16 bertrand 294: ELSE IF( C3.EQ.'QR ') THEN
295: IF( N3 .EQ. 1) THEN
296: IF( SNAME ) THEN
297: * M*N
298: IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
299: NB = N1
300: ELSE
301: NB = 32768/N2
302: END IF
303: ELSE
304: IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
305: NB = N1
306: ELSE
307: NB = 32768/N2
308: END IF
309: END IF
310: ELSE
311: IF( SNAME ) THEN
312: NB = 1
313: ELSE
314: NB = 1
315: END IF
316: END IF
317: ELSE IF( C3.EQ.'LQ ') THEN
318: IF( N3 .EQ. 2) THEN
319: IF( SNAME ) THEN
320: * M*N
321: IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
322: NB = N1
323: ELSE
324: NB = 32768/N2
325: END IF
326: ELSE
327: IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
328: NB = N1
329: ELSE
330: NB = 32768/N2
331: END IF
332: END IF
333: ELSE
334: IF( SNAME ) THEN
335: NB = 1
336: ELSE
337: NB = 1
338: END IF
339: END IF
1.1 bertrand 340: ELSE IF( C3.EQ.'HRD' ) THEN
341: IF( SNAME ) THEN
342: NB = 32
343: ELSE
344: NB = 32
345: END IF
346: ELSE IF( C3.EQ.'BRD' ) THEN
347: IF( SNAME ) THEN
348: NB = 32
349: ELSE
350: NB = 32
351: END IF
352: ELSE IF( C3.EQ.'TRI' ) THEN
353: IF( SNAME ) THEN
354: NB = 64
355: ELSE
356: NB = 64
357: END IF
358: END IF
359: ELSE IF( C2.EQ.'PO' ) THEN
360: IF( C3.EQ.'TRF' ) THEN
361: IF( SNAME ) THEN
362: NB = 64
363: ELSE
364: NB = 64
365: END IF
366: END IF
367: ELSE IF( C2.EQ.'SY' ) THEN
368: IF( C3.EQ.'TRF' ) THEN
369: IF( SNAME ) THEN
1.19 bertrand 370: IF( TWOSTAGE ) THEN
371: NB = 192
372: ELSE
373: NB = 64
374: END IF
1.1 bertrand 375: ELSE
1.19 bertrand 376: IF( TWOSTAGE ) THEN
377: NB = 192
378: ELSE
379: NB = 64
380: END IF
1.1 bertrand 381: END IF
382: ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
383: NB = 32
384: ELSE IF( SNAME .AND. C3.EQ.'GST' ) THEN
385: NB = 64
386: END IF
387: ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
388: IF( C3.EQ.'TRF' ) THEN
1.19 bertrand 389: IF( TWOSTAGE ) THEN
390: NB = 192
391: ELSE
392: NB = 64
393: END IF
1.1 bertrand 394: ELSE IF( C3.EQ.'TRD' ) THEN
395: NB = 32
396: ELSE IF( C3.EQ.'GST' ) THEN
397: NB = 64
398: END IF
399: ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
400: IF( C3( 1: 1 ).EQ.'G' ) THEN
401: IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
402: $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
403: $ THEN
404: NB = 32
405: END IF
406: ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
407: IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
408: $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
409: $ THEN
410: NB = 32
411: END IF
412: END IF
413: ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
414: IF( C3( 1: 1 ).EQ.'G' ) THEN
415: IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
416: $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
417: $ THEN
418: NB = 32
419: END IF
420: ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
421: IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
422: $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
423: $ THEN
424: NB = 32
425: END IF
426: END IF
427: ELSE IF( C2.EQ.'GB' ) THEN
428: IF( C3.EQ.'TRF' ) THEN
429: IF( SNAME ) THEN
430: IF( N4.LE.64 ) THEN
431: NB = 1
432: ELSE
433: NB = 32
434: END IF
435: ELSE
436: IF( N4.LE.64 ) THEN
437: NB = 1
438: ELSE
439: NB = 32
440: END IF
441: END IF
442: END IF
443: ELSE IF( C2.EQ.'PB' ) THEN
444: IF( C3.EQ.'TRF' ) THEN
445: IF( SNAME ) THEN
446: IF( N2.LE.64 ) THEN
447: NB = 1
448: ELSE
449: NB = 32
450: END IF
451: ELSE
452: IF( N2.LE.64 ) THEN
453: NB = 1
454: ELSE
455: NB = 32
456: END IF
457: END IF
458: END IF
459: ELSE IF( C2.EQ.'TR' ) THEN
460: IF( C3.EQ.'TRI' ) THEN
461: IF( SNAME ) THEN
462: NB = 64
463: ELSE
464: NB = 64
465: END IF
1.16 bertrand 466: ELSE IF ( C3.EQ.'EVC' ) THEN
467: IF( SNAME ) THEN
468: NB = 64
469: ELSE
470: NB = 64
471: END IF
1.20 ! bertrand 472: ELSE IF( C3.EQ.'SYL' ) THEN
! 473: * The upper bound is to prevent overly aggressive scaling.
! 474: IF( SNAME ) THEN
! 475: NB = MIN( MAX( 48, INT( ( MIN( N1, N2 ) * 16 ) / 100) ),
! 476: $ 240 )
! 477: ELSE
! 478: NB = MIN( MAX( 24, INT( ( MIN( N1, N2 ) * 8 ) / 100) ),
! 479: $ 80 )
! 480: END IF
1.1 bertrand 481: END IF
482: ELSE IF( C2.EQ.'LA' ) THEN
483: IF( C3.EQ.'UUM' ) THEN
484: IF( SNAME ) THEN
485: NB = 64
486: ELSE
487: NB = 64
488: END IF
1.20 ! bertrand 489: ELSE IF( C3.EQ.'TRS' ) THEN
! 490: IF( SNAME ) THEN
! 491: NB = 32
! 492: ELSE
! 493: NB = 32
! 494: END IF
1.1 bertrand 495: END IF
496: ELSE IF( SNAME .AND. C2.EQ.'ST' ) THEN
497: IF( C3.EQ.'EBZ' ) THEN
498: NB = 1
499: END IF
1.14 bertrand 500: ELSE IF( C2.EQ.'GG' ) THEN
501: NB = 32
502: IF( C3.EQ.'HD3' ) THEN
503: IF( SNAME ) THEN
504: NB = 32
505: ELSE
506: NB = 32
507: END IF
508: END IF
1.1 bertrand 509: END IF
510: ILAENV = NB
511: RETURN
512: *
513: 60 CONTINUE
514: *
515: * ISPEC = 2: minimum block size
516: *
517: NBMIN = 2
518: IF( C2.EQ.'GE' ) THEN
519: IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
520: $ 'QLF' ) THEN
521: IF( SNAME ) THEN
522: NBMIN = 2
523: ELSE
524: NBMIN = 2
525: END IF
526: ELSE IF( C3.EQ.'HRD' ) THEN
527: IF( SNAME ) THEN
528: NBMIN = 2
529: ELSE
530: NBMIN = 2
531: END IF
532: ELSE IF( C3.EQ.'BRD' ) THEN
533: IF( SNAME ) THEN
534: NBMIN = 2
535: ELSE
536: NBMIN = 2
537: END IF
538: ELSE IF( C3.EQ.'TRI' ) THEN
539: IF( SNAME ) THEN
540: NBMIN = 2
541: ELSE
542: NBMIN = 2
543: END IF
544: END IF
545: ELSE IF( C2.EQ.'SY' ) THEN
546: IF( C3.EQ.'TRF' ) THEN
547: IF( SNAME ) THEN
548: NBMIN = 8
549: ELSE
550: NBMIN = 8
551: END IF
552: ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
553: NBMIN = 2
554: END IF
555: ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
556: IF( C3.EQ.'TRD' ) THEN
557: NBMIN = 2
558: END IF
559: ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
560: IF( C3( 1: 1 ).EQ.'G' ) THEN
561: IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
562: $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
563: $ THEN
564: NBMIN = 2
565: END IF
566: ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
567: IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
568: $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
569: $ THEN
570: NBMIN = 2
571: END IF
572: END IF
573: ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
574: IF( C3( 1: 1 ).EQ.'G' ) THEN
575: IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
576: $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
577: $ THEN
578: NBMIN = 2
579: END IF
580: ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
581: IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
582: $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
583: $ THEN
584: NBMIN = 2
585: END IF
586: END IF
1.14 bertrand 587: ELSE IF( C2.EQ.'GG' ) THEN
588: NBMIN = 2
589: IF( C3.EQ.'HD3' ) THEN
590: NBMIN = 2
591: END IF
1.1 bertrand 592: END IF
593: ILAENV = NBMIN
594: RETURN
595: *
596: 70 CONTINUE
597: *
598: * ISPEC = 3: crossover point
599: *
600: NX = 0
601: IF( C2.EQ.'GE' ) THEN
602: IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
603: $ 'QLF' ) THEN
604: IF( SNAME ) THEN
605: NX = 128
606: ELSE
607: NX = 128
608: END IF
609: ELSE IF( C3.EQ.'HRD' ) THEN
610: IF( SNAME ) THEN
611: NX = 128
612: ELSE
613: NX = 128
614: END IF
615: ELSE IF( C3.EQ.'BRD' ) THEN
616: IF( SNAME ) THEN
617: NX = 128
618: ELSE
619: NX = 128
620: END IF
621: END IF
622: ELSE IF( C2.EQ.'SY' ) THEN
623: IF( SNAME .AND. C3.EQ.'TRD' ) THEN
624: NX = 32
625: END IF
626: ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
627: IF( C3.EQ.'TRD' ) THEN
628: NX = 32
629: END IF
630: ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
631: IF( C3( 1: 1 ).EQ.'G' ) THEN
632: IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
633: $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
634: $ THEN
635: NX = 128
636: END IF
637: END IF
638: ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
639: IF( C3( 1: 1 ).EQ.'G' ) THEN
640: IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
641: $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
642: $ THEN
643: NX = 128
644: END IF
645: END IF
1.14 bertrand 646: ELSE IF( C2.EQ.'GG' ) THEN
647: NX = 128
648: IF( C3.EQ.'HD3' ) THEN
649: NX = 128
650: END IF
1.1 bertrand 651: END IF
652: ILAENV = NX
653: RETURN
654: *
655: 80 CONTINUE
656: *
657: * ISPEC = 4: number of shifts (used by xHSEQR)
658: *
659: ILAENV = 6
660: RETURN
661: *
662: 90 CONTINUE
663: *
664: * ISPEC = 5: minimum column dimension (not used)
665: *
666: ILAENV = 2
667: RETURN
668: *
669: 100 CONTINUE
670: *
671: * ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD)
672: *
673: ILAENV = INT( REAL( MIN( N1, N2 ) )*1.6E0 )
674: RETURN
675: *
676: 110 CONTINUE
677: *
678: * ISPEC = 7: number of processors (not used)
679: *
680: ILAENV = 1
681: RETURN
682: *
683: 120 CONTINUE
684: *
685: * ISPEC = 8: crossover point for multishift (used by xHSEQR)
686: *
687: ILAENV = 50
688: RETURN
689: *
690: 130 CONTINUE
691: *
692: * ISPEC = 9: maximum size of the subproblems at the bottom of the
693: * computation tree in the divide-and-conquer algorithm
694: * (used by xGELSD and xGESDD)
695: *
696: ILAENV = 25
697: RETURN
698: *
699: 140 CONTINUE
700: *
1.20 ! bertrand 701: * ISPEC = 10: ieee and infinity NaN arithmetic can be trusted not to trap
1.1 bertrand 702: *
703: * ILAENV = 0
704: ILAENV = 1
705: IF( ILAENV.EQ.1 ) THEN
706: ILAENV = IEEECK( 1, 0.0, 1.0 )
707: END IF
708: RETURN
709: *
710: 150 CONTINUE
711: *
1.20 ! bertrand 712: * ISPEC = 11: ieee infinity arithmetic can be trusted not to trap
1.1 bertrand 713: *
714: * ILAENV = 0
715: ILAENV = 1
716: IF( ILAENV.EQ.1 ) THEN
717: ILAENV = IEEECK( 0, 0.0, 1.0 )
718: END IF
719: RETURN
720: *
721: 160 CONTINUE
722: *
1.20 ! bertrand 723: * 12 <= ISPEC <= 17: xHSEQR or related subroutines.
1.1 bertrand 724: *
725: ILAENV = IPARMQ( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
726: RETURN
727: *
728: * End of ILAENV
729: *
730: END
CVSweb interface <joel.bertrand@systella.fr>