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