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