001:       INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
002: *
003: *  -- LAPACK auxiliary routine (version 3.2.1)                        --
004: *
005: *  -- April 2009                                                      --
006: *
007: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
008: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
009: *
010: *     .. Scalar Arguments ..
011:       CHARACTER*( * )    NAME, OPTS
012:       INTEGER            ISPEC, N1, N2, N3, N4
013: *     ..
014: *
015: *  Purpose
016: *  =======
017: *
018: *  ILAENV is called from the LAPACK routines to choose problem-dependent
019: *  parameters for the local environment.  See ISPEC for a description of
020: *  the parameters.
021: *
022: *  ILAENV returns an INTEGER
023: *  if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC
024: *  if ILAENV < 0:  if ILAENV = -k, the k-th argument had an illegal value.
025: *
026: *  This version provides a set of parameters which should give good,
027: *  but not optimal, performance on many of the currently available
028: *  computers.  Users are encouraged to modify this subroutine to set
029: *  the tuning parameters for their particular machine using the option
030: *  and problem size information in the arguments.
031: *
032: *  This routine will not function correctly if it is converted to all
033: *  lower case.  Converting it to all upper case is allowed.
034: *
035: *  Arguments
036: *  =========
037: *
038: *  ISPEC   (input) INTEGER
039: *          Specifies the parameter to be returned as the value of
040: *          ILAENV.
041: *          = 1: the optimal blocksize; if this value is 1, an unblocked
042: *               algorithm will give the best performance.
043: *          = 2: the minimum block size for which the block routine
044: *               should be used; if the usable block size is less than
045: *               this value, an unblocked routine should be used.
046: *          = 3: the crossover point (in a block routine, for N less
047: *               than this value, an unblocked routine should be used)
048: *          = 4: the number of shifts, used in the nonsymmetric
049: *               eigenvalue routines (DEPRECATED)
050: *          = 5: the minimum column dimension for blocking to be used;
051: *               rectangular blocks must have dimension at least k by m,
052: *               where k is given by ILAENV(2,...) and m by ILAENV(5,...)
053: *          = 6: the crossover point for the SVD (when reducing an m by n
054: *               matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds
055: *               this value, a QR factorization is used first to reduce
056: *               the matrix to a triangular form.)
057: *          = 7: the number of processors
058: *          = 8: the crossover point for the multishift QR method
059: *               for nonsymmetric eigenvalue problems (DEPRECATED)
060: *          = 9: maximum size of the subproblems at the bottom of the
061: *               computation tree in the divide-and-conquer algorithm
062: *               (used by xGELSD and xGESDD)
063: *          =10: ieee NaN arithmetic can be trusted not to trap
064: *          =11: infinity arithmetic can be trusted not to trap
065: *          12 <= ISPEC <= 16:
066: *               xHSEQR or one of its subroutines,
067: *               see IPARMQ for detailed explanation
068: *
069: *  NAME    (input) CHARACTER*(*)
070: *          The name of the calling subroutine, in either upper case or
071: *          lower case.
072: *
073: *  OPTS    (input) CHARACTER*(*)
074: *          The character options to the subroutine NAME, concatenated
075: *          into a single character string.  For example, UPLO = 'U',
076: *          TRANS = 'T', and DIAG = 'N' for a triangular routine would
077: *          be specified as OPTS = 'UTN'.
078: *
079: *  N1      (input) INTEGER
080: *  N2      (input) INTEGER
081: *  N3      (input) INTEGER
082: *  N4      (input) INTEGER
083: *          Problem dimensions for the subroutine NAME; these may not all
084: *          be required.
085: *
086: *  Further Details
087: *  ===============
088: *
089: *  The following conventions have been used when calling ILAENV from the
090: *  LAPACK routines:
091: *  1)  OPTS is a concatenation of all of the character options to
092: *      subroutine NAME, in the same order that they appear in the
093: *      argument list for NAME, even if they are not used in determining
094: *      the value of the parameter specified by ISPEC.
095: *  2)  The problem dimensions N1, N2, N3, N4 are specified in the order
096: *      that they appear in the argument list for NAME.  N1 is used
097: *      first, N2 second, and so on, and unused problem dimensions are
098: *      passed a value of -1.
099: *  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
556: