LAPACK  3.6.1
LAPACK: Linear Algebra PACKage
integer function ilaenv ( integer  ISPEC,
character*( * )  NAME,
character*( * )  OPTS,
integer  N1,
integer  N2,
integer  N3,
integer  N4 
)

ILAENV

Download ILAENV + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 ILAENV is called from the LAPACK routines to choose problem-dependent
 parameters for the local environment.  See ISPEC for a description of
 the parameters.

 ILAENV returns an INTEGER
 if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC
 if ILAENV < 0:  if ILAENV = -k, the k-th argument had an illegal value.

 This version provides a set of parameters which should give good,
 but not optimal, performance on many of the currently available
 computers.  Users are encouraged to modify this subroutine to set
 the tuning parameters for their particular machine using the option
 and problem size information in the arguments.

 This routine will not function correctly if it is converted to all
 lower case.  Converting it to all upper case is allowed.
Parameters
[in]ISPEC
          ISPEC is INTEGER
          Specifies the parameter to be returned as the value of
          ILAENV.
          = 1: the optimal blocksize; if this value is 1, an unblocked
               algorithm will give the best performance.
          = 2: the minimum block size for which the block routine
               should be used; if the usable block size is less than
               this value, an unblocked routine should be used.
          = 3: the crossover point (in a block routine, for N less
               than this value, an unblocked routine should be used)
          = 4: the number of shifts, used in the nonsymmetric
               eigenvalue routines (DEPRECATED)
          = 5: the minimum column dimension for blocking to be used;
               rectangular blocks must have dimension at least k by m,
               where k is given by ILAENV(2,...) and m by ILAENV(5,...)
          = 6: the crossover point for the SVD (when reducing an m by n
               matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds
               this value, a QR factorization is used first to reduce
               the matrix to a triangular form.)
          = 7: the number of processors
          = 8: the crossover point for the multishift QR method
               for nonsymmetric eigenvalue problems (DEPRECATED)
          = 9: maximum size of the subproblems at the bottom of the
               computation tree in the divide-and-conquer algorithm
               (used by xGELSD and xGESDD)
          =10: ieee NaN arithmetic can be trusted not to trap
          =11: infinity arithmetic can be trusted not to trap
          12 <= ISPEC <= 16:
               xHSEQR or related subroutines,
               see IPARMQ for detailed explanation
[in]NAME
          NAME is CHARACTER*(*)
          The name of the calling subroutine, in either upper case or
          lower case.
[in]OPTS
          OPTS is CHARACTER*(*)
          The character options to the subroutine NAME, concatenated
          into a single character string.  For example, UPLO = 'U',
          TRANS = 'T', and DIAG = 'N' for a triangular routine would
          be specified as OPTS = 'UTN'.
[in]N1
          N1 is INTEGER
[in]N2
          N2 is INTEGER
[in]N3
          N3 is INTEGER
[in]N4
          N4 is INTEGER
          Problem dimensions for the subroutine NAME; these may not all
          be required.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Date
June 2016
Further Details:
  The following conventions have been used when calling ILAENV from the
  LAPACK routines:
  1)  OPTS is a concatenation of all of the character options to
      subroutine NAME, in the same order that they appear in the
      argument list for NAME, even if they are not used in determining
      the value of the parameter specified by ISPEC.
  2)  The problem dimensions N1, N2, N3, N4 are specified in the order
      that they appear in the argument list for NAME.  N1 is used
      first, N2 second, and so on, and unused problem dimensions are
      passed a value of -1.
  3)  The parameter value returned by ILAENV is checked for validity in
      the calling subroutine.  For example, ILAENV is used to retrieve
      the optimal blocksize for STRTRI as follows:

      NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 )
      IF( NB.LE.1 ) NB = MAX( 1, N )

Definition at line 164 of file ilaenv.f.

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 *
integer function ieeeck(ISPEC, ZERO, ONE)
Definition: tstiee.f:626
integer function iparmq(ISPEC, NAME, OPTS, N, ILO, IHI, LWORK)
IPARMQ
Definition: iparmq.f:224
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
Definition: tstiee.f:83

Here is the call graph for this function: