Statistiques
| Révision :

root / src / lapack / util / ilaenv.f @ 1

Historique | Voir | Annoter | Télécharger (16,36 ko)

1 1 equemene
      INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
2 1 equemene
*
3 1 equemene
*  -- LAPACK auxiliary routine (version 3.2.1)                        --
4 1 equemene
*
5 1 equemene
*  -- April 2009                                                      --
6 1 equemene
*
7 1 equemene
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
8 1 equemene
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
9 1 equemene
*
10 1 equemene
*     .. Scalar Arguments ..
11 1 equemene
      CHARACTER*( * )    NAME, OPTS
12 1 equemene
      INTEGER            ISPEC, N1, N2, N3, N4
13 1 equemene
*     ..
14 1 equemene
*
15 1 equemene
*  Purpose
16 1 equemene
*  =======
17 1 equemene
*
18 1 equemene
*  ILAENV is called from the LAPACK routines to choose problem-dependent
19 1 equemene
*  parameters for the local environment.  See ISPEC for a description of
20 1 equemene
*  the parameters.
21 1 equemene
*
22 1 equemene
*  ILAENV returns an INTEGER
23 1 equemene
*  if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC
24 1 equemene
*  if ILAENV < 0:  if ILAENV = -k, the k-th argument had an illegal value.
25 1 equemene
*
26 1 equemene
*  This version provides a set of parameters which should give good,
27 1 equemene
*  but not optimal, performance on many of the currently available
28 1 equemene
*  computers.  Users are encouraged to modify this subroutine to set
29 1 equemene
*  the tuning parameters for their particular machine using the option
30 1 equemene
*  and problem size information in the arguments.
31 1 equemene
*
32 1 equemene
*  This routine will not function correctly if it is converted to all
33 1 equemene
*  lower case.  Converting it to all upper case is allowed.
34 1 equemene
*
35 1 equemene
*  Arguments
36 1 equemene
*  =========
37 1 equemene
*
38 1 equemene
*  ISPEC   (input) INTEGER
39 1 equemene
*          Specifies the parameter to be returned as the value of
40 1 equemene
*          ILAENV.
41 1 equemene
*          = 1: the optimal blocksize; if this value is 1, an unblocked
42 1 equemene
*               algorithm will give the best performance.
43 1 equemene
*          = 2: the minimum block size for which the block routine
44 1 equemene
*               should be used; if the usable block size is less than
45 1 equemene
*               this value, an unblocked routine should be used.
46 1 equemene
*          = 3: the crossover point (in a block routine, for N less
47 1 equemene
*               than this value, an unblocked routine should be used)
48 1 equemene
*          = 4: the number of shifts, used in the nonsymmetric
49 1 equemene
*               eigenvalue routines (DEPRECATED)
50 1 equemene
*          = 5: the minimum column dimension for blocking to be used;
51 1 equemene
*               rectangular blocks must have dimension at least k by m,
52 1 equemene
*               where k is given by ILAENV(2,...) and m by ILAENV(5,...)
53 1 equemene
*          = 6: the crossover point for the SVD (when reducing an m by n
54 1 equemene
*               matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds
55 1 equemene
*               this value, a QR factorization is used first to reduce
56 1 equemene
*               the matrix to a triangular form.)
57 1 equemene
*          = 7: the number of processors
58 1 equemene
*          = 8: the crossover point for the multishift QR method
59 1 equemene
*               for nonsymmetric eigenvalue problems (DEPRECATED)
60 1 equemene
*          = 9: maximum size of the subproblems at the bottom of the
61 1 equemene
*               computation tree in the divide-and-conquer algorithm
62 1 equemene
*               (used by xGELSD and xGESDD)
63 1 equemene
*          =10: ieee NaN arithmetic can be trusted not to trap
64 1 equemene
*          =11: infinity arithmetic can be trusted not to trap
65 1 equemene
*          12 <= ISPEC <= 16:
66 1 equemene
*               xHSEQR or one of its subroutines,
67 1 equemene
*               see IPARMQ for detailed explanation
68 1 equemene
*
69 1 equemene
*  NAME    (input) CHARACTER*(*)
70 1 equemene
*          The name of the calling subroutine, in either upper case or
71 1 equemene
*          lower case.
72 1 equemene
*
73 1 equemene
*  OPTS    (input) CHARACTER*(*)
74 1 equemene
*          The character options to the subroutine NAME, concatenated
75 1 equemene
*          into a single character string.  For example, UPLO = 'U',
76 1 equemene
*          TRANS = 'T', and DIAG = 'N' for a triangular routine would
77 1 equemene
*          be specified as OPTS = 'UTN'.
78 1 equemene
*
79 1 equemene
*  N1      (input) INTEGER
80 1 equemene
*  N2      (input) INTEGER
81 1 equemene
*  N3      (input) INTEGER
82 1 equemene
*  N4      (input) INTEGER
83 1 equemene
*          Problem dimensions for the subroutine NAME; these may not all
84 1 equemene
*          be required.
85 1 equemene
*
86 1 equemene
*  Further Details
87 1 equemene
*  ===============
88 1 equemene
*
89 1 equemene
*  The following conventions have been used when calling ILAENV from the
90 1 equemene
*  LAPACK routines:
91 1 equemene
*  1)  OPTS is a concatenation of all of the character options to
92 1 equemene
*      subroutine NAME, in the same order that they appear in the
93 1 equemene
*      argument list for NAME, even if they are not used in determining
94 1 equemene
*      the value of the parameter specified by ISPEC.
95 1 equemene
*  2)  The problem dimensions N1, N2, N3, N4 are specified in the order
96 1 equemene
*      that they appear in the argument list for NAME.  N1 is used
97 1 equemene
*      first, N2 second, and so on, and unused problem dimensions are
98 1 equemene
*      passed a value of -1.
99 1 equemene
*  3)  The parameter value returned by ILAENV is checked for validity in
100 1 equemene
*      the calling subroutine.  For example, ILAENV is used to retrieve
101 1 equemene
*      the optimal blocksize for STRTRI as follows:
102 1 equemene
*
103 1 equemene
*      NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 )
104 1 equemene
*      IF( NB.LE.1 ) NB = MAX( 1, N )
105 1 equemene
*
106 1 equemene
*  =====================================================================
107 1 equemene
*
108 1 equemene
*     .. Local Scalars ..
109 1 equemene
      INTEGER            I, IC, IZ, NB, NBMIN, NX
110 1 equemene
      LOGICAL            CNAME, SNAME
111 1 equemene
      CHARACTER          C1*1, C2*2, C4*2, C3*3, SUBNAM*6
112 1 equemene
*     ..
113 1 equemene
*     .. Intrinsic Functions ..
114 1 equemene
      INTRINSIC          CHAR, ICHAR, INT, MIN, REAL
115 1 equemene
*     ..
116 1 equemene
*     .. External Functions ..
117 1 equemene
      INTEGER            IEEECK, IPARMQ
118 1 equemene
      EXTERNAL           IEEECK, IPARMQ
119 1 equemene
*     ..
120 1 equemene
*     .. Executable Statements ..
121 1 equemene
*
122 1 equemene
      GO TO ( 10, 10, 10, 80, 90, 100, 110, 120,
123 1 equemene
     $        130, 140, 150, 160, 160, 160, 160, 160 )ISPEC
124 1 equemene
*
125 1 equemene
*     Invalid value for ISPEC
126 1 equemene
*
127 1 equemene
      ILAENV = -1
128 1 equemene
      RETURN
129 1 equemene
*
130 1 equemene
   10 CONTINUE
131 1 equemene
*
132 1 equemene
*     Convert NAME to upper case if the first character is lower case.
133 1 equemene
*
134 1 equemene
      ILAENV = 1
135 1 equemene
      SUBNAM = NAME
136 1 equemene
      IC = ICHAR( SUBNAM( 1: 1 ) )
137 1 equemene
      IZ = ICHAR( 'Z' )
138 1 equemene
      IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN
139 1 equemene
*
140 1 equemene
*        ASCII character set
141 1 equemene
*
142 1 equemene
         IF( IC.GE.97 .AND. IC.LE.122 ) THEN
143 1 equemene
            SUBNAM( 1: 1 ) = CHAR( IC-32 )
144 1 equemene
            DO 20 I = 2, 6
145 1 equemene
               IC = ICHAR( SUBNAM( I: I ) )
146 1 equemene
               IF( IC.GE.97 .AND. IC.LE.122 )
147 1 equemene
     $            SUBNAM( I: I ) = CHAR( IC-32 )
148 1 equemene
   20       CONTINUE
149 1 equemene
         END IF
150 1 equemene
*
151 1 equemene
      ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN
152 1 equemene
*
153 1 equemene
*        EBCDIC character set
154 1 equemene
*
155 1 equemene
         IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
156 1 equemene
     $       ( IC.GE.145 .AND. IC.LE.153 ) .OR.
157 1 equemene
     $       ( IC.GE.162 .AND. IC.LE.169 ) ) THEN
158 1 equemene
            SUBNAM( 1: 1 ) = CHAR( IC+64 )
159 1 equemene
            DO 30 I = 2, 6
160 1 equemene
               IC = ICHAR( SUBNAM( I: I ) )
161 1 equemene
               IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
162 1 equemene
     $             ( IC.GE.145 .AND. IC.LE.153 ) .OR.
163 1 equemene
     $             ( IC.GE.162 .AND. IC.LE.169 ) )SUBNAM( I:
164 1 equemene
     $             I ) = CHAR( IC+64 )
165 1 equemene
   30       CONTINUE
166 1 equemene
         END IF
167 1 equemene
*
168 1 equemene
      ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN
169 1 equemene
*
170 1 equemene
*        Prime machines:  ASCII+128
171 1 equemene
*
172 1 equemene
         IF( IC.GE.225 .AND. IC.LE.250 ) THEN
173 1 equemene
            SUBNAM( 1: 1 ) = CHAR( IC-32 )
174 1 equemene
            DO 40 I = 2, 6
175 1 equemene
               IC = ICHAR( SUBNAM( I: I ) )
176 1 equemene
               IF( IC.GE.225 .AND. IC.LE.250 )
177 1 equemene
     $            SUBNAM( I: I ) = CHAR( IC-32 )
178 1 equemene
   40       CONTINUE
179 1 equemene
         END IF
180 1 equemene
      END IF
181 1 equemene
*
182 1 equemene
      C1 = SUBNAM( 1: 1 )
183 1 equemene
      SNAME = C1.EQ.'S' .OR. C1.EQ.'D'
184 1 equemene
      CNAME = C1.EQ.'C' .OR. C1.EQ.'Z'
185 1 equemene
      IF( .NOT.( CNAME .OR. SNAME ) )
186 1 equemene
     $   RETURN
187 1 equemene
      C2 = SUBNAM( 2: 3 )
188 1 equemene
      C3 = SUBNAM( 4: 6 )
189 1 equemene
      C4 = C3( 2: 3 )
190 1 equemene
*
191 1 equemene
      GO TO ( 50, 60, 70 )ISPEC
192 1 equemene
*
193 1 equemene
   50 CONTINUE
194 1 equemene
*
195 1 equemene
*     ISPEC = 1:  block size
196 1 equemene
*
197 1 equemene
*     In these examples, separate code is provided for setting NB for
198 1 equemene
*     real and complex.  We assume that NB will take the same value in
199 1 equemene
*     single or double precision.
200 1 equemene
*
201 1 equemene
      NB = 1
202 1 equemene
*
203 1 equemene
      IF( C2.EQ.'GE' ) THEN
204 1 equemene
         IF( C3.EQ.'TRF' ) THEN
205 1 equemene
            IF( SNAME ) THEN
206 1 equemene
               NB = 64
207 1 equemene
            ELSE
208 1 equemene
               NB = 64
209 1 equemene
            END IF
210 1 equemene
         ELSE IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
211 1 equemene
     $            C3.EQ.'QLF' ) THEN
212 1 equemene
            IF( SNAME ) THEN
213 1 equemene
               NB = 32
214 1 equemene
            ELSE
215 1 equemene
               NB = 32
216 1 equemene
            END IF
217 1 equemene
         ELSE IF( C3.EQ.'HRD' ) THEN
218 1 equemene
            IF( SNAME ) THEN
219 1 equemene
               NB = 32
220 1 equemene
            ELSE
221 1 equemene
               NB = 32
222 1 equemene
            END IF
223 1 equemene
         ELSE IF( C3.EQ.'BRD' ) THEN
224 1 equemene
            IF( SNAME ) THEN
225 1 equemene
               NB = 32
226 1 equemene
            ELSE
227 1 equemene
               NB = 32
228 1 equemene
            END IF
229 1 equemene
         ELSE IF( C3.EQ.'TRI' ) THEN
230 1 equemene
            IF( SNAME ) THEN
231 1 equemene
               NB = 64
232 1 equemene
            ELSE
233 1 equemene
               NB = 64
234 1 equemene
            END IF
235 1 equemene
         END IF
236 1 equemene
      ELSE IF( C2.EQ.'PO' ) THEN
237 1 equemene
         IF( C3.EQ.'TRF' ) THEN
238 1 equemene
            IF( SNAME ) THEN
239 1 equemene
               NB = 64
240 1 equemene
            ELSE
241 1 equemene
               NB = 64
242 1 equemene
            END IF
243 1 equemene
         END IF
244 1 equemene
      ELSE IF( C2.EQ.'SY' ) THEN
245 1 equemene
         IF( C3.EQ.'TRF' ) THEN
246 1 equemene
            IF( SNAME ) THEN
247 1 equemene
               NB = 64
248 1 equemene
            ELSE
249 1 equemene
               NB = 64
250 1 equemene
            END IF
251 1 equemene
         ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
252 1 equemene
            NB = 32
253 1 equemene
         ELSE IF( SNAME .AND. C3.EQ.'GST' ) THEN
254 1 equemene
            NB = 64
255 1 equemene
         END IF
256 1 equemene
      ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
257 1 equemene
         IF( C3.EQ.'TRF' ) THEN
258 1 equemene
            NB = 64
259 1 equemene
         ELSE IF( C3.EQ.'TRD' ) THEN
260 1 equemene
            NB = 32
261 1 equemene
         ELSE IF( C3.EQ.'GST' ) THEN
262 1 equemene
            NB = 64
263 1 equemene
         END IF
264 1 equemene
      ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
265 1 equemene
         IF( C3( 1: 1 ).EQ.'G' ) THEN
266 1 equemene
            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
267 1 equemene
     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
268 1 equemene
     $           THEN
269 1 equemene
               NB = 32
270 1 equemene
            END IF
271 1 equemene
         ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
272 1 equemene
            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
273 1 equemene
     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
274 1 equemene
     $           THEN
275 1 equemene
               NB = 32
276 1 equemene
            END IF
277 1 equemene
         END IF
278 1 equemene
      ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
279 1 equemene
         IF( C3( 1: 1 ).EQ.'G' ) THEN
280 1 equemene
            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
281 1 equemene
     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
282 1 equemene
     $           THEN
283 1 equemene
               NB = 32
284 1 equemene
            END IF
285 1 equemene
         ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
286 1 equemene
            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
287 1 equemene
     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
288 1 equemene
     $           THEN
289 1 equemene
               NB = 32
290 1 equemene
            END IF
291 1 equemene
         END IF
292 1 equemene
      ELSE IF( C2.EQ.'GB' ) THEN
293 1 equemene
         IF( C3.EQ.'TRF' ) THEN
294 1 equemene
            IF( SNAME ) THEN
295 1 equemene
               IF( N4.LE.64 ) THEN
296 1 equemene
                  NB = 1
297 1 equemene
               ELSE
298 1 equemene
                  NB = 32
299 1 equemene
               END IF
300 1 equemene
            ELSE
301 1 equemene
               IF( N4.LE.64 ) THEN
302 1 equemene
                  NB = 1
303 1 equemene
               ELSE
304 1 equemene
                  NB = 32
305 1 equemene
               END IF
306 1 equemene
            END IF
307 1 equemene
         END IF
308 1 equemene
      ELSE IF( C2.EQ.'PB' ) THEN
309 1 equemene
         IF( C3.EQ.'TRF' ) THEN
310 1 equemene
            IF( SNAME ) THEN
311 1 equemene
               IF( N2.LE.64 ) THEN
312 1 equemene
                  NB = 1
313 1 equemene
               ELSE
314 1 equemene
                  NB = 32
315 1 equemene
               END IF
316 1 equemene
            ELSE
317 1 equemene
               IF( N2.LE.64 ) THEN
318 1 equemene
                  NB = 1
319 1 equemene
               ELSE
320 1 equemene
                  NB = 32
321 1 equemene
               END IF
322 1 equemene
            END IF
323 1 equemene
         END IF
324 1 equemene
      ELSE IF( C2.EQ.'TR' ) THEN
325 1 equemene
         IF( C3.EQ.'TRI' ) THEN
326 1 equemene
            IF( SNAME ) THEN
327 1 equemene
               NB = 64
328 1 equemene
            ELSE
329 1 equemene
               NB = 64
330 1 equemene
            END IF
331 1 equemene
         END IF
332 1 equemene
      ELSE IF( C2.EQ.'LA' ) THEN
333 1 equemene
         IF( C3.EQ.'UUM' ) THEN
334 1 equemene
            IF( SNAME ) THEN
335 1 equemene
               NB = 64
336 1 equemene
            ELSE
337 1 equemene
               NB = 64
338 1 equemene
            END IF
339 1 equemene
         END IF
340 1 equemene
      ELSE IF( SNAME .AND. C2.EQ.'ST' ) THEN
341 1 equemene
         IF( C3.EQ.'EBZ' ) THEN
342 1 equemene
            NB = 1
343 1 equemene
         END IF
344 1 equemene
      END IF
345 1 equemene
      ILAENV = NB
346 1 equemene
      RETURN
347 1 equemene
*
348 1 equemene
   60 CONTINUE
349 1 equemene
*
350 1 equemene
*     ISPEC = 2:  minimum block size
351 1 equemene
*
352 1 equemene
      NBMIN = 2
353 1 equemene
      IF( C2.EQ.'GE' ) THEN
354 1 equemene
         IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
355 1 equemene
     $       'QLF' ) THEN
356 1 equemene
            IF( SNAME ) THEN
357 1 equemene
               NBMIN = 2
358 1 equemene
            ELSE
359 1 equemene
               NBMIN = 2
360 1 equemene
            END IF
361 1 equemene
         ELSE IF( C3.EQ.'HRD' ) THEN
362 1 equemene
            IF( SNAME ) THEN
363 1 equemene
               NBMIN = 2
364 1 equemene
            ELSE
365 1 equemene
               NBMIN = 2
366 1 equemene
            END IF
367 1 equemene
         ELSE IF( C3.EQ.'BRD' ) THEN
368 1 equemene
            IF( SNAME ) THEN
369 1 equemene
               NBMIN = 2
370 1 equemene
            ELSE
371 1 equemene
               NBMIN = 2
372 1 equemene
            END IF
373 1 equemene
         ELSE IF( C3.EQ.'TRI' ) THEN
374 1 equemene
            IF( SNAME ) THEN
375 1 equemene
               NBMIN = 2
376 1 equemene
            ELSE
377 1 equemene
               NBMIN = 2
378 1 equemene
            END IF
379 1 equemene
         END IF
380 1 equemene
      ELSE IF( C2.EQ.'SY' ) THEN
381 1 equemene
         IF( C3.EQ.'TRF' ) THEN
382 1 equemene
            IF( SNAME ) THEN
383 1 equemene
               NBMIN = 8
384 1 equemene
            ELSE
385 1 equemene
               NBMIN = 8
386 1 equemene
            END IF
387 1 equemene
         ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
388 1 equemene
            NBMIN = 2
389 1 equemene
         END IF
390 1 equemene
      ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
391 1 equemene
         IF( C3.EQ.'TRD' ) THEN
392 1 equemene
            NBMIN = 2
393 1 equemene
         END IF
394 1 equemene
      ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
395 1 equemene
         IF( C3( 1: 1 ).EQ.'G' ) THEN
396 1 equemene
            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
397 1 equemene
     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
398 1 equemene
     $           THEN
399 1 equemene
               NBMIN = 2
400 1 equemene
            END IF
401 1 equemene
         ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
402 1 equemene
            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
403 1 equemene
     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
404 1 equemene
     $           THEN
405 1 equemene
               NBMIN = 2
406 1 equemene
            END IF
407 1 equemene
         END IF
408 1 equemene
      ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
409 1 equemene
         IF( C3( 1: 1 ).EQ.'G' ) THEN
410 1 equemene
            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
411 1 equemene
     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
412 1 equemene
     $           THEN
413 1 equemene
               NBMIN = 2
414 1 equemene
            END IF
415 1 equemene
         ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
416 1 equemene
            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
417 1 equemene
     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
418 1 equemene
     $           THEN
419 1 equemene
               NBMIN = 2
420 1 equemene
            END IF
421 1 equemene
         END IF
422 1 equemene
      END IF
423 1 equemene
      ILAENV = NBMIN
424 1 equemene
      RETURN
425 1 equemene
*
426 1 equemene
   70 CONTINUE
427 1 equemene
*
428 1 equemene
*     ISPEC = 3:  crossover point
429 1 equemene
*
430 1 equemene
      NX = 0
431 1 equemene
      IF( C2.EQ.'GE' ) THEN
432 1 equemene
         IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
433 1 equemene
     $       'QLF' ) THEN
434 1 equemene
            IF( SNAME ) THEN
435 1 equemene
               NX = 128
436 1 equemene
            ELSE
437 1 equemene
               NX = 128
438 1 equemene
            END IF
439 1 equemene
         ELSE IF( C3.EQ.'HRD' ) THEN
440 1 equemene
            IF( SNAME ) THEN
441 1 equemene
               NX = 128
442 1 equemene
            ELSE
443 1 equemene
               NX = 128
444 1 equemene
            END IF
445 1 equemene
         ELSE IF( C3.EQ.'BRD' ) THEN
446 1 equemene
            IF( SNAME ) THEN
447 1 equemene
               NX = 128
448 1 equemene
            ELSE
449 1 equemene
               NX = 128
450 1 equemene
            END IF
451 1 equemene
         END IF
452 1 equemene
      ELSE IF( C2.EQ.'SY' ) THEN
453 1 equemene
         IF( SNAME .AND. C3.EQ.'TRD' ) THEN
454 1 equemene
            NX = 32
455 1 equemene
         END IF
456 1 equemene
      ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
457 1 equemene
         IF( C3.EQ.'TRD' ) THEN
458 1 equemene
            NX = 32
459 1 equemene
         END IF
460 1 equemene
      ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
461 1 equemene
         IF( C3( 1: 1 ).EQ.'G' ) THEN
462 1 equemene
            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
463 1 equemene
     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
464 1 equemene
     $           THEN
465 1 equemene
               NX = 128
466 1 equemene
            END IF
467 1 equemene
         END IF
468 1 equemene
      ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
469 1 equemene
         IF( C3( 1: 1 ).EQ.'G' ) THEN
470 1 equemene
            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
471 1 equemene
     $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
472 1 equemene
     $           THEN
473 1 equemene
               NX = 128
474 1 equemene
            END IF
475 1 equemene
         END IF
476 1 equemene
      END IF
477 1 equemene
      ILAENV = NX
478 1 equemene
      RETURN
479 1 equemene
*
480 1 equemene
   80 CONTINUE
481 1 equemene
*
482 1 equemene
*     ISPEC = 4:  number of shifts (used by xHSEQR)
483 1 equemene
*
484 1 equemene
      ILAENV = 6
485 1 equemene
      RETURN
486 1 equemene
*
487 1 equemene
   90 CONTINUE
488 1 equemene
*
489 1 equemene
*     ISPEC = 5:  minimum column dimension (not used)
490 1 equemene
*
491 1 equemene
      ILAENV = 2
492 1 equemene
      RETURN
493 1 equemene
*
494 1 equemene
  100 CONTINUE
495 1 equemene
*
496 1 equemene
*     ISPEC = 6:  crossover point for SVD (used by xGELSS and xGESVD)
497 1 equemene
*
498 1 equemene
      ILAENV = INT( REAL( MIN( N1, N2 ) )*1.6E0 )
499 1 equemene
      RETURN
500 1 equemene
*
501 1 equemene
  110 CONTINUE
502 1 equemene
*
503 1 equemene
*     ISPEC = 7:  number of processors (not used)
504 1 equemene
*
505 1 equemene
      ILAENV = 1
506 1 equemene
      RETURN
507 1 equemene
*
508 1 equemene
  120 CONTINUE
509 1 equemene
*
510 1 equemene
*     ISPEC = 8:  crossover point for multishift (used by xHSEQR)
511 1 equemene
*
512 1 equemene
      ILAENV = 50
513 1 equemene
      RETURN
514 1 equemene
*
515 1 equemene
  130 CONTINUE
516 1 equemene
*
517 1 equemene
*     ISPEC = 9:  maximum size of the subproblems at the bottom of the
518 1 equemene
*                 computation tree in the divide-and-conquer algorithm
519 1 equemene
*                 (used by xGELSD and xGESDD)
520 1 equemene
*
521 1 equemene
      ILAENV = 25
522 1 equemene
      RETURN
523 1 equemene
*
524 1 equemene
  140 CONTINUE
525 1 equemene
*
526 1 equemene
*     ISPEC = 10: ieee NaN arithmetic can be trusted not to trap
527 1 equemene
*
528 1 equemene
*     ILAENV = 0
529 1 equemene
      ILAENV = 1
530 1 equemene
      IF( ILAENV.EQ.1 ) THEN
531 1 equemene
         ILAENV = IEEECK( 1, 0.0, 1.0 )
532 1 equemene
      END IF
533 1 equemene
      RETURN
534 1 equemene
*
535 1 equemene
  150 CONTINUE
536 1 equemene
*
537 1 equemene
*     ISPEC = 11: infinity arithmetic can be trusted not to trap
538 1 equemene
*
539 1 equemene
*     ILAENV = 0
540 1 equemene
      ILAENV = 1
541 1 equemene
      IF( ILAENV.EQ.1 ) THEN
542 1 equemene
         ILAENV = IEEECK( 0, 0.0, 1.0 )
543 1 equemene
      END IF
544 1 equemene
      RETURN
545 1 equemene
*
546 1 equemene
  160 CONTINUE
547 1 equemene
*
548 1 equemene
*     12 <= ISPEC <= 16: xHSEQR or one of its subroutines.
549 1 equemene
*
550 1 equemene
      ILAENV = IPARMQ( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
551 1 equemene
      RETURN
552 1 equemene
*
553 1 equemene
*     End of ILAENV
554 1 equemene
*
555 1 equemene
      END