b963ad7386deba19b0c98fb9d1810c7c1834827d
[platform/upstream/lapack.git] / SRC / ilaenv.f
1 *> \brief \b ILAENV
2 *
3 *  =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at 
6 *            http://www.netlib.org/lapack/explore-html/ 
7 *
8 *> \htmlonly
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"> 
15 *> [TXT]</a>
16 *> \endhtmlonly 
17 *
18 *  Definition:
19 *  ===========
20 *
21 *       INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
22
23 *       .. Scalar Arguments ..
24 *       CHARACTER*( * )    NAME, OPTS
25 *       INTEGER            ISPEC, N1, N2, N3, N4
26 *       ..
27 *  
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)
82 *>          =10: ieee NaN arithmetic can be trusted not to trap
83 *>          =11: infinity arithmetic can be trusted not to trap
84 *>          12 <= ISPEC <= 16:
85 *>               xHSEQR or related subroutines,
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 *
130 *> \author Univ. of Tennessee 
131 *> \author Univ. of California Berkeley 
132 *> \author Univ. of Colorado Denver 
133 *> \author NAG Ltd. 
134 *
135 *> \date June 2016
136 *
137 *> \ingroup auxOTHERauxiliary
138 *
139 *> \par Further Details:
140 *  =====================
141 *>
142 *> \verbatim
143 *>
144 *>  The following conventions have been used when calling ILAENV from the
145 *>  LAPACK routines:
146 *>  1)  OPTS is a concatenation of all of the character options to
147 *>      subroutine NAME, in the same order that they appear in the
148 *>      argument list for NAME, even if they are not used in determining
149 *>      the value of the parameter specified by ISPEC.
150 *>  2)  The problem dimensions N1, N2, N3, N4 are specified in the order
151 *>      that they appear in the argument list for NAME.  N1 is used
152 *>      first, N2 second, and so on, and unused problem dimensions are
153 *>      passed a value of -1.
154 *>  3)  The parameter value returned by ILAENV is checked for validity in
155 *>      the calling subroutine.  For example, ILAENV is used to retrieve
156 *>      the optimal blocksize for STRTRI as follows:
157 *>
158 *>      NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 )
159 *>      IF( NB.LE.1 ) NB = MAX( 1, N )
160 *> \endverbatim
161 *>
162 *  =====================================================================
163       INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
164 *
165 *  -- LAPACK auxiliary routine (version 3.6.1) --
166 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
167 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
168 *     June 2016
169 *
170 *     .. Scalar Arguments ..
171       CHARACTER*( * )    NAME, OPTS
172       INTEGER            ISPEC, N1, N2, N3, N4
173 *     ..
174 *
175 *  =====================================================================
176 *
177 *     .. Local Scalars ..
178       INTEGER            I, IC, IZ, NB, NBMIN, NX
179       LOGICAL            CNAME, SNAME
180       CHARACTER          C1*1, C2*2, C4*2, C3*3, SUBNAM*6
181 *     ..
182 *     .. Intrinsic Functions ..
183       INTRINSIC          CHAR, ICHAR, INT, MIN, REAL
184 *     ..
185 *     .. External Functions ..
186       INTEGER            IEEECK, IPARMQ
187       EXTERNAL           IEEECK, IPARMQ
188 *     ..
189 *     .. Executable Statements ..
190 *
191       GO TO ( 10, 10, 10, 80, 90, 100, 110, 120,
192      $        130, 140, 150, 160, 160, 160, 160, 160 )ISPEC
193 *
194 *     Invalid value for ISPEC
195 *
196       ILAENV = -1
197       RETURN
198 *
199    10 CONTINUE
200 *
201 *     Convert NAME to upper case if the first character is lower case.
202 *
203       ILAENV = 1
204       SUBNAM = NAME
205       IC = ICHAR( SUBNAM( 1: 1 ) )
206       IZ = ICHAR( 'Z' )
207       IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN
208 *
209 *        ASCII character set
210 *
211          IF( IC.GE.97 .AND. IC.LE.122 ) THEN
212             SUBNAM( 1: 1 ) = CHAR( IC-32 )
213             DO 20 I = 2, 6
214                IC = ICHAR( SUBNAM( I: I ) )
215                IF( IC.GE.97 .AND. IC.LE.122 )
216      $            SUBNAM( I: I ) = CHAR( IC-32 )
217    20       CONTINUE
218          END IF
219 *
220       ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN
221 *
222 *        EBCDIC character set
223 *
224          IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
225      $       ( IC.GE.145 .AND. IC.LE.153 ) .OR.
226      $       ( IC.GE.162 .AND. IC.LE.169 ) ) THEN
227             SUBNAM( 1: 1 ) = CHAR( IC+64 )
228             DO 30 I = 2, 6
229                IC = ICHAR( SUBNAM( I: I ) )
230                IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
231      $             ( IC.GE.145 .AND. IC.LE.153 ) .OR.
232      $             ( IC.GE.162 .AND. IC.LE.169 ) )SUBNAM( I:
233      $             I ) = CHAR( IC+64 )
234    30       CONTINUE
235          END IF
236 *
237       ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN
238 *
239 *        Prime machines:  ASCII+128
240 *
241          IF( IC.GE.225 .AND. IC.LE.250 ) THEN
242             SUBNAM( 1: 1 ) = CHAR( IC-32 )
243             DO 40 I = 2, 6
244                IC = ICHAR( SUBNAM( I: I ) )
245                IF( IC.GE.225 .AND. IC.LE.250 )
246      $            SUBNAM( I: I ) = CHAR( IC-32 )
247    40       CONTINUE
248          END IF
249       END IF
250 *
251       C1 = SUBNAM( 1: 1 )
252       SNAME = C1.EQ.'S' .OR. C1.EQ.'D'
253       CNAME = C1.EQ.'C' .OR. C1.EQ.'Z'
254       IF( .NOT.( CNAME .OR. SNAME ) )
255      $   RETURN
256       C2 = SUBNAM( 2: 3 )
257       C3 = SUBNAM( 4: 6 )
258       C4 = C3( 2: 3 )
259 *
260       GO TO ( 50, 60, 70 )ISPEC
261 *
262    50 CONTINUE
263 *
264 *     ISPEC = 1:  block size
265 *
266 *     In these examples, separate code is provided for setting NB for
267 *     real and complex.  We assume that NB will take the same value in
268 *     single or double precision.
269 *
270       NB = 1
271 *
272       IF( C2.EQ.'GE' ) THEN
273          IF( C3.EQ.'TRF' ) THEN
274             IF( SNAME ) THEN
275                NB = 64
276             ELSE
277                NB = 64
278             END IF
279          ELSE IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
280      $            C3.EQ.'QLF' ) THEN
281             IF( SNAME ) THEN
282                NB = 32
283             ELSE
284                NB = 32
285             END IF
286          ELSE IF( C3.EQ.'HRD' ) THEN
287             IF( SNAME ) THEN
288                NB = 32
289             ELSE
290                NB = 32
291             END IF
292          ELSE IF( C3.EQ.'BRD' ) THEN
293             IF( SNAME ) THEN
294                NB = 32
295             ELSE
296                NB = 32
297             END IF
298          ELSE IF( C3.EQ.'TRI' ) THEN
299             IF( SNAME ) THEN
300                NB = 64
301             ELSE
302                NB = 64
303             END IF
304          END IF
305       ELSE IF( C2.EQ.'PO' ) THEN
306          IF( C3.EQ.'TRF' ) THEN
307             IF( SNAME ) THEN
308                NB = 64
309             ELSE
310                NB = 64
311             END IF
312          END IF
313       ELSE IF( C2.EQ.'SY' ) THEN
314          IF( C3.EQ.'TRF' ) THEN
315             IF( SNAME ) THEN
316                NB = 64
317             ELSE
318                NB = 64
319             END IF
320          ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
321             NB = 32
322          ELSE IF( SNAME .AND. C3.EQ.'GST' ) THEN
323             NB = 64
324          END IF
325       ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
326          IF( C3.EQ.'TRF' ) THEN
327             NB = 64
328          ELSE IF( C3.EQ.'TRD' ) THEN
329             NB = 32
330          ELSE IF( C3.EQ.'GST' ) THEN
331             NB = 64
332          END IF
333       ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
334          IF( C3( 1: 1 ).EQ.'G' ) THEN
335             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
336      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
337      $           THEN
338                NB = 32
339             END IF
340          ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
341             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
342      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
343      $           THEN
344                NB = 32
345             END IF
346          END IF
347       ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
348          IF( C3( 1: 1 ).EQ.'G' ) THEN
349             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
350      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
351      $           THEN
352                NB = 32
353             END IF
354          ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
355             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
356      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
357      $           THEN
358                NB = 32
359             END IF
360          END IF
361       ELSE IF( C2.EQ.'GB' ) THEN
362          IF( C3.EQ.'TRF' ) THEN
363             IF( SNAME ) THEN
364                IF( N4.LE.64 ) THEN
365                   NB = 1
366                ELSE
367                   NB = 32
368                END IF
369             ELSE
370                IF( N4.LE.64 ) THEN
371                   NB = 1
372                ELSE
373                   NB = 32
374                END IF
375             END IF
376          END IF
377       ELSE IF( C2.EQ.'PB' ) THEN
378          IF( C3.EQ.'TRF' ) THEN
379             IF( SNAME ) THEN
380                IF( N2.LE.64 ) THEN
381                   NB = 1
382                ELSE
383                   NB = 32
384                END IF
385             ELSE
386                IF( N2.LE.64 ) THEN
387                   NB = 1
388                ELSE
389                   NB = 32
390                END IF
391             END IF
392          END IF
393       ELSE IF( C2.EQ.'TR' ) THEN
394          IF( C3.EQ.'TRI' ) THEN
395             IF( SNAME ) THEN
396                NB = 64
397             ELSE
398                NB = 64
399             END IF
400          ELSE IF ( C3.EQ.'EVC' ) THEN
401             IF( SNAME ) THEN
402                NB = 64
403             ELSE
404                NB = 64
405             END IF
406          END IF
407       ELSE IF( C2.EQ.'LA' ) THEN
408          IF( C3.EQ.'UUM' ) THEN
409             IF( SNAME ) THEN
410                NB = 64
411             ELSE
412                NB = 64
413             END IF
414          END IF
415       ELSE IF( SNAME .AND. C2.EQ.'ST' ) THEN
416          IF( C3.EQ.'EBZ' ) THEN
417             NB = 1
418          END IF
419       ELSE IF( C2.EQ.'GG' ) THEN
420          NB = 32
421          IF( C3.EQ.'HD3' ) THEN
422             IF( SNAME ) THEN
423                NB = 32
424             ELSE
425                NB = 32
426             END IF
427          END IF
428       END IF
429       ILAENV = NB
430       RETURN
431 *
432    60 CONTINUE
433 *
434 *     ISPEC = 2:  minimum block size
435 *
436       NBMIN = 2
437       IF( C2.EQ.'GE' ) THEN
438          IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
439      $       'QLF' ) THEN
440             IF( SNAME ) THEN
441                NBMIN = 2
442             ELSE
443                NBMIN = 2
444             END IF
445          ELSE IF( C3.EQ.'HRD' ) THEN
446             IF( SNAME ) THEN
447                NBMIN = 2
448             ELSE
449                NBMIN = 2
450             END IF
451          ELSE IF( C3.EQ.'BRD' ) THEN
452             IF( SNAME ) THEN
453                NBMIN = 2
454             ELSE
455                NBMIN = 2
456             END IF
457          ELSE IF( C3.EQ.'TRI' ) THEN
458             IF( SNAME ) THEN
459                NBMIN = 2
460             ELSE
461                NBMIN = 2
462             END IF
463          END IF
464       ELSE IF( C2.EQ.'SY' ) THEN
465          IF( C3.EQ.'TRF' ) THEN
466             IF( SNAME ) THEN
467                NBMIN = 8
468             ELSE
469                NBMIN = 8
470             END IF
471          ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
472             NBMIN = 2
473          END IF
474       ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
475          IF( C3.EQ.'TRD' ) THEN
476             NBMIN = 2
477          END IF
478       ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
479          IF( C3( 1: 1 ).EQ.'G' ) THEN
480             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
481      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
482      $           THEN
483                NBMIN = 2
484             END IF
485          ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
486             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
487      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
488      $           THEN
489                NBMIN = 2
490             END IF
491          END IF
492       ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
493          IF( C3( 1: 1 ).EQ.'G' ) THEN
494             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
495      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
496      $           THEN
497                NBMIN = 2
498             END IF
499          ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
500             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
501      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
502      $           THEN
503                NBMIN = 2
504             END IF
505          END IF
506       ELSE IF( C2.EQ.'GG' ) THEN
507          NBMIN = 2
508          IF( C3.EQ.'HD3' ) THEN
509             NBMIN = 2
510          END IF
511       END IF
512       ILAENV = NBMIN
513       RETURN
514 *
515    70 CONTINUE
516 *
517 *     ISPEC = 3:  crossover point
518 *
519       NX = 0
520       IF( C2.EQ.'GE' ) THEN
521          IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
522      $       'QLF' ) THEN
523             IF( SNAME ) THEN
524                NX = 128
525             ELSE
526                NX = 128
527             END IF
528          ELSE IF( C3.EQ.'HRD' ) THEN
529             IF( SNAME ) THEN
530                NX = 128
531             ELSE
532                NX = 128
533             END IF
534          ELSE IF( C3.EQ.'BRD' ) THEN
535             IF( SNAME ) THEN
536                NX = 128
537             ELSE
538                NX = 128
539             END IF
540          END IF
541       ELSE IF( C2.EQ.'SY' ) THEN
542          IF( SNAME .AND. C3.EQ.'TRD' ) THEN
543             NX = 32
544          END IF
545       ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
546          IF( C3.EQ.'TRD' ) THEN
547             NX = 32
548          END IF
549       ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
550          IF( C3( 1: 1 ).EQ.'G' ) THEN
551             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
552      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
553      $           THEN
554                NX = 128
555             END IF
556          END IF
557       ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
558          IF( C3( 1: 1 ).EQ.'G' ) THEN
559             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
560      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
561      $           THEN
562                NX = 128
563             END IF
564          END IF
565       ELSE IF( C2.EQ.'GG' ) THEN
566          NX = 128
567          IF( C3.EQ.'HD3' ) THEN
568             NX = 128
569          END IF
570       END IF
571       ILAENV = NX
572       RETURN
573 *
574    80 CONTINUE
575 *
576 *     ISPEC = 4:  number of shifts (used by xHSEQR)
577 *
578       ILAENV = 6
579       RETURN
580 *
581    90 CONTINUE
582 *
583 *     ISPEC = 5:  minimum column dimension (not used)
584 *
585       ILAENV = 2
586       RETURN
587 *
588   100 CONTINUE
589 *
590 *     ISPEC = 6:  crossover point for SVD (used by xGELSS and xGESVD)
591 *
592       ILAENV = INT( REAL( MIN( N1, N2 ) )*1.6E0 )
593       RETURN
594 *
595   110 CONTINUE
596 *
597 *     ISPEC = 7:  number of processors (not used)
598 *
599       ILAENV = 1
600       RETURN
601 *
602   120 CONTINUE
603 *
604 *     ISPEC = 8:  crossover point for multishift (used by xHSEQR)
605 *
606       ILAENV = 50
607       RETURN
608 *
609   130 CONTINUE
610 *
611 *     ISPEC = 9:  maximum size of the subproblems at the bottom of the
612 *                 computation tree in the divide-and-conquer algorithm
613 *                 (used by xGELSD and xGESDD)
614 *
615       ILAENV = 25
616       RETURN
617 *
618   140 CONTINUE
619 *
620 *     ISPEC = 10: ieee NaN arithmetic can be trusted not to trap
621 *
622 *     ILAENV = 0
623       ILAENV = 1
624       IF( ILAENV.EQ.1 ) THEN
625          ILAENV = IEEECK( 1, 0.0, 1.0 )
626       END IF
627       RETURN
628 *
629   150 CONTINUE
630 *
631 *     ISPEC = 11: infinity arithmetic can be trusted not to trap
632 *
633 *     ILAENV = 0
634       ILAENV = 1
635       IF( ILAENV.EQ.1 ) THEN
636          ILAENV = IEEECK( 0, 0.0, 1.0 )
637       END IF
638       RETURN
639 *
640   160 CONTINUE
641 *
642 *     12 <= ISPEC <= 16: xHSEQR or related subroutines.
643 *
644       ILAENV = IPARMQ( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
645       RETURN
646 *
647 *     End of ILAENV
648 *
649       END