Statistiques
| Révision :

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

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

1
      INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
2
*
3
*  -- LAPACK auxiliary routine (version 3.2.1)                        --
4
*
5
*  -- April 2009                                                      --
6
*
7
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
8
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
9
*
10
*     .. Scalar Arguments ..
11
      CHARACTER*( * )    NAME, OPTS
12
      INTEGER            ISPEC, N1, N2, N3, N4
13
*     ..
14
*
15
*  Purpose
16
*  =======
17
*
18
*  ILAENV is called from the LAPACK routines to choose problem-dependent
19
*  parameters for the local environment.  See ISPEC for a description of
20
*  the parameters.
21
*
22
*  ILAENV returns an INTEGER
23
*  if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC
24
*  if ILAENV < 0:  if ILAENV = -k, the k-th argument had an illegal value.
25
*
26
*  This version provides a set of parameters which should give good,
27
*  but not optimal, performance on many of the currently available
28
*  computers.  Users are encouraged to modify this subroutine to set
29
*  the tuning parameters for their particular machine using the option
30
*  and problem size information in the arguments.
31
*
32
*  This routine will not function correctly if it is converted to all
33
*  lower case.  Converting it to all upper case is allowed.
34
*
35
*  Arguments
36
*  =========
37
*
38
*  ISPEC   (input) INTEGER
39
*          Specifies the parameter to be returned as the value of
40
*          ILAENV.
41
*          = 1: the optimal blocksize; if this value is 1, an unblocked
42
*               algorithm will give the best performance.
43
*          = 2: the minimum block size for which the block routine
44
*               should be used; if the usable block size is less than
45
*               this value, an unblocked routine should be used.
46
*          = 3: the crossover point (in a block routine, for N less
47
*               than this value, an unblocked routine should be used)
48
*          = 4: the number of shifts, used in the nonsymmetric
49
*               eigenvalue routines (DEPRECATED)
50
*          = 5: the minimum column dimension for blocking to be used;
51
*               rectangular blocks must have dimension at least k by m,
52
*               where k is given by ILAENV(2,...) and m by ILAENV(5,...)
53
*          = 6: the crossover point for the SVD (when reducing an m by n
54
*               matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds
55
*               this value, a QR factorization is used first to reduce
56
*               the matrix to a triangular form.)
57
*          = 7: the number of processors
58
*          = 8: the crossover point for the multishift QR method
59
*               for nonsymmetric eigenvalue problems (DEPRECATED)
60
*          = 9: maximum size of the subproblems at the bottom of the
61
*               computation tree in the divide-and-conquer algorithm
62
*               (used by xGELSD and xGESDD)
63
*          =10: ieee NaN arithmetic can be trusted not to trap
64
*          =11: infinity arithmetic can be trusted not to trap
65
*          12 <= ISPEC <= 16:
66
*               xHSEQR or one of its subroutines,
67
*               see IPARMQ for detailed explanation
68
*
69
*  NAME    (input) CHARACTER*(*)
70
*          The name of the calling subroutine, in either upper case or
71
*          lower case.
72
*
73
*  OPTS    (input) CHARACTER*(*)
74
*          The character options to the subroutine NAME, concatenated
75
*          into a single character string.  For example, UPLO = 'U',
76
*          TRANS = 'T', and DIAG = 'N' for a triangular routine would
77
*          be specified as OPTS = 'UTN'.
78
*
79
*  N1      (input) INTEGER
80
*  N2      (input) INTEGER
81
*  N3      (input) INTEGER
82
*  N4      (input) INTEGER
83
*          Problem dimensions for the subroutine NAME; these may not all
84
*          be required.
85
*
86
*  Further Details
87
*  ===============
88
*
89
*  The following conventions have been used when calling ILAENV from the
90
*  LAPACK routines:
91
*  1)  OPTS is a concatenation of all of the character options to
92
*      subroutine NAME, in the same order that they appear in the
93
*      argument list for NAME, even if they are not used in determining
94
*      the value of the parameter specified by ISPEC.
95
*  2)  The problem dimensions N1, N2, N3, N4 are specified in the order
96
*      that they appear in the argument list for NAME.  N1 is used
97
*      first, N2 second, and so on, and unused problem dimensions are
98
*      passed a value of -1.
99
*  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