OSDN Git Service

new repo
[bytom/vapor.git] / vendor / gonum.org / v1 / gonum / lapack / internal / testdata / dlasqtest / 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 one of its 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 November 2011
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.4.0) --
166 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
167 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
168 *     November 2011
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          END IF
401       ELSE IF( C2.EQ.'LA' ) THEN
402          IF( C3.EQ.'UUM' ) THEN
403             IF( SNAME ) THEN
404                NB = 64
405             ELSE
406                NB = 64
407             END IF
408          END IF
409       ELSE IF( SNAME .AND. C2.EQ.'ST' ) THEN
410          IF( C3.EQ.'EBZ' ) THEN
411             NB = 1
412          END IF
413       END IF
414       ILAENV = NB
415       RETURN
416 *
417    60 CONTINUE
418 *
419 *     ISPEC = 2:  minimum block size
420 *
421       NBMIN = 2
422       IF( C2.EQ.'GE' ) THEN
423          IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
424      $       'QLF' ) THEN
425             IF( SNAME ) THEN
426                NBMIN = 2
427             ELSE
428                NBMIN = 2
429             END IF
430          ELSE IF( C3.EQ.'HRD' ) THEN
431             IF( SNAME ) THEN
432                NBMIN = 2
433             ELSE
434                NBMIN = 2
435             END IF
436          ELSE IF( C3.EQ.'BRD' ) THEN
437             IF( SNAME ) THEN
438                NBMIN = 2
439             ELSE
440                NBMIN = 2
441             END IF
442          ELSE IF( C3.EQ.'TRI' ) THEN
443             IF( SNAME ) THEN
444                NBMIN = 2
445             ELSE
446                NBMIN = 2
447             END IF
448          END IF
449       ELSE IF( C2.EQ.'SY' ) THEN
450          IF( C3.EQ.'TRF' ) THEN
451             IF( SNAME ) THEN
452                NBMIN = 8
453             ELSE
454                NBMIN = 8
455             END IF
456          ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
457             NBMIN = 2
458          END IF
459       ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
460          IF( C3.EQ.'TRD' ) THEN
461             NBMIN = 2
462          END IF
463       ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
464          IF( C3( 1: 1 ).EQ.'G' ) THEN
465             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
466      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
467      $           THEN
468                NBMIN = 2
469             END IF
470          ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
471             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
472      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
473      $           THEN
474                NBMIN = 2
475             END IF
476          END IF
477       ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
478          IF( C3( 1: 1 ).EQ.'G' ) THEN
479             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
480      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
481      $           THEN
482                NBMIN = 2
483             END IF
484          ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
485             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
486      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
487      $           THEN
488                NBMIN = 2
489             END IF
490          END IF
491       END IF
492       ILAENV = NBMIN
493       RETURN
494 *
495    70 CONTINUE
496 *
497 *     ISPEC = 3:  crossover point
498 *
499       NX = 0
500       IF( C2.EQ.'GE' ) THEN
501          IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
502      $       'QLF' ) THEN
503             IF( SNAME ) THEN
504                NX = 128
505             ELSE
506                NX = 128
507             END IF
508          ELSE IF( C3.EQ.'HRD' ) THEN
509             IF( SNAME ) THEN
510                NX = 128
511             ELSE
512                NX = 128
513             END IF
514          ELSE IF( C3.EQ.'BRD' ) THEN
515             IF( SNAME ) THEN
516                NX = 128
517             ELSE
518                NX = 128
519             END IF
520          END IF
521       ELSE IF( C2.EQ.'SY' ) THEN
522          IF( SNAME .AND. C3.EQ.'TRD' ) THEN
523             NX = 32
524          END IF
525       ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
526          IF( C3.EQ.'TRD' ) THEN
527             NX = 32
528          END IF
529       ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
530          IF( C3( 1: 1 ).EQ.'G' ) THEN
531             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
532      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
533      $           THEN
534                NX = 128
535             END IF
536          END IF
537       ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
538          IF( C3( 1: 1 ).EQ.'G' ) THEN
539             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
540      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
541      $           THEN
542                NX = 128
543             END IF
544          END IF
545       END IF
546       ILAENV = NX
547       RETURN
548 *
549    80 CONTINUE
550 *
551 *     ISPEC = 4:  number of shifts (used by xHSEQR)
552 *
553       ILAENV = 6
554       RETURN
555 *
556    90 CONTINUE
557 *
558 *     ISPEC = 5:  minimum column dimension (not used)
559 *
560       ILAENV = 2
561       RETURN
562 *
563   100 CONTINUE
564 *
565 *     ISPEC = 6:  crossover point for SVD (used by xGELSS and xGESVD)
566 *
567       ILAENV = INT( REAL( MIN( N1, N2 ) )*1.6E0 )
568       RETURN
569 *
570   110 CONTINUE
571 *
572 *     ISPEC = 7:  number of processors (not used)
573 *
574       ILAENV = 1
575       RETURN
576 *
577   120 CONTINUE
578 *
579 *     ISPEC = 8:  crossover point for multishift (used by xHSEQR)
580 *
581       ILAENV = 50
582       RETURN
583 *
584   130 CONTINUE
585 *
586 *     ISPEC = 9:  maximum size of the subproblems at the bottom of the
587 *                 computation tree in the divide-and-conquer algorithm
588 *                 (used by xGELSD and xGESDD)
589 *
590       ILAENV = 25
591       RETURN
592 *
593   140 CONTINUE
594 *
595 *     ISPEC = 10: ieee NaN arithmetic can be trusted not to trap
596 *
597 *     ILAENV = 0
598       ILAENV = 1
599       IF( ILAENV.EQ.1 ) THEN
600          ILAENV = IEEECK( 1, 0.0, 1.0 )
601       END IF
602       RETURN
603 *
604   150 CONTINUE
605 *
606 *     ISPEC = 11: infinity arithmetic can be trusted not to trap
607 *
608 *     ILAENV = 0
609       ILAENV = 1
610       IF( ILAENV.EQ.1 ) THEN
611          ILAENV = IEEECK( 0, 0.0, 1.0 )
612       END IF
613       RETURN
614 *
615   160 CONTINUE
616 *
617 *     12 <= ISPEC <= 16: xHSEQR or one of its subroutines. 
618 *
619       ILAENV = IPARMQ( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
620       RETURN
621 *
622 *     End of ILAENV
623 *
624       END