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
CVSweb interface <joel.bertrand@systella.fr>