File:  [local] / rpl / lapack / lapack / ilaenv.f
Revision 1.19: download - view: text, annotated - select for diffs - revision graph
Thu May 21 21:46:03 2020 UTC (3 years, 11 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_33, rpl-4_1_32, HEAD
Mise à jour de Lapack.

    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 related 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 2019
  136: *
  137: *> \ingroup OTHERauxiliary
  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.9.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 2019
  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, TWOSTAGE
  180:       CHARACTER          C1*1, C2*2, C4*2, C3*3, SUBNAM*16
  181: *     ..
  182: *     .. Intrinsic Functions ..
  183:       INTRINSIC          CHAR, ICHAR, INT, MIN, REAL
  184: *     ..
  185: *     .. External Functions ..
  186:       INTEGER            IEEECK, IPARMQ, IPARAM2STAGE
  187:       EXTERNAL           IEEECK, IPARMQ, IPARAM2STAGE
  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:       TWOSTAGE = LEN( SUBNAM ).GE.11
  260:      $           .AND. SUBNAM( 11: 11 ).EQ.'2'
  261: *
  262:       GO TO ( 50, 60, 70 )ISPEC
  263: *
  264:    50 CONTINUE
  265: *
  266: *     ISPEC = 1:  block size
  267: *
  268: *     In these examples, separate code is provided for setting NB for
  269: *     real and complex.  We assume that NB will take the same value in
  270: *     single or double precision.
  271: *
  272:       NB = 1
  273: *
  274:       IF( SUBNAM(2:6).EQ.'LAORH' ) THEN
  275: *
  276: *        This is for *LAORHR_GETRFNP routine
  277: *
  278:          IF( SNAME ) THEN
  279:              NB = 32
  280:          ELSE
  281:              NB = 32
  282:          END IF
  283:       ELSE IF( C2.EQ.'GE' ) THEN
  284:          IF( C3.EQ.'TRF' ) THEN
  285:             IF( SNAME ) THEN
  286:                NB = 64
  287:             ELSE
  288:                NB = 64
  289:             END IF
  290:          ELSE IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
  291:      $            C3.EQ.'QLF' ) THEN
  292:             IF( SNAME ) THEN
  293:                NB = 32
  294:             ELSE
  295:                NB = 32
  296:             END IF
  297:          ELSE IF( C3.EQ.'QR ') THEN
  298:             IF( N3 .EQ. 1) THEN
  299:                IF( SNAME ) THEN
  300: *     M*N
  301:                   IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
  302:                      NB = N1
  303:                   ELSE
  304:                      NB = 32768/N2
  305:                   END IF
  306:                ELSE
  307:                   IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
  308:                      NB = N1
  309:                   ELSE
  310:                      NB = 32768/N2
  311:                   END IF
  312:                END IF
  313:             ELSE
  314:                IF( SNAME ) THEN
  315:                   NB = 1
  316:                ELSE
  317:                   NB = 1
  318:                END IF
  319:             END IF
  320:          ELSE IF( C3.EQ.'LQ ') THEN
  321:             IF( N3 .EQ. 2) THEN
  322:                IF( SNAME ) THEN
  323: *     M*N
  324:                   IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
  325:                      NB = N1
  326:                   ELSE
  327:                      NB = 32768/N2
  328:                   END IF
  329:                ELSE
  330:                   IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
  331:                      NB = N1
  332:                   ELSE
  333:                      NB = 32768/N2
  334:                   END IF
  335:                END IF
  336:             ELSE
  337:                IF( SNAME ) THEN
  338:                   NB = 1
  339:                ELSE
  340:                   NB = 1
  341:                END IF
  342:             END IF
  343:          ELSE IF( C3.EQ.'HRD' ) THEN
  344:             IF( SNAME ) THEN
  345:                NB = 32
  346:             ELSE
  347:                NB = 32
  348:             END IF
  349:          ELSE IF( C3.EQ.'BRD' ) THEN
  350:             IF( SNAME ) THEN
  351:                NB = 32
  352:             ELSE
  353:                NB = 32
  354:             END IF
  355:          ELSE IF( C3.EQ.'TRI' ) THEN
  356:             IF( SNAME ) THEN
  357:                NB = 64
  358:             ELSE
  359:                NB = 64
  360:             END IF
  361:          END IF
  362:       ELSE IF( C2.EQ.'PO' ) THEN
  363:          IF( C3.EQ.'TRF' ) THEN
  364:             IF( SNAME ) THEN
  365:                NB = 64
  366:             ELSE
  367:                NB = 64
  368:             END IF
  369:          END IF
  370:       ELSE IF( C2.EQ.'SY' ) THEN
  371:          IF( C3.EQ.'TRF' ) THEN
  372:             IF( SNAME ) THEN
  373:                IF( TWOSTAGE ) THEN
  374:                   NB = 192
  375:                ELSE
  376:                   NB = 64
  377:                END IF
  378:             ELSE
  379:                IF( TWOSTAGE ) THEN
  380:                   NB = 192
  381:                ELSE
  382:                   NB = 64
  383:                END IF
  384:             END IF
  385:          ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
  386:             NB = 32
  387:          ELSE IF( SNAME .AND. C3.EQ.'GST' ) THEN
  388:             NB = 64
  389:          END IF
  390:       ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
  391:          IF( C3.EQ.'TRF' ) THEN
  392:             IF( TWOSTAGE ) THEN
  393:                NB = 192
  394:             ELSE
  395:                NB = 64
  396:             END IF
  397:          ELSE IF( C3.EQ.'TRD' ) THEN
  398:             NB = 32
  399:          ELSE IF( C3.EQ.'GST' ) THEN
  400:             NB = 64
  401:          END IF
  402:       ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
  403:          IF( C3( 1: 1 ).EQ.'G' ) THEN
  404:             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
  405:      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
  406:      $           THEN
  407:                NB = 32
  408:             END IF
  409:          ELSE IF( C3( 1: 1 ).EQ.'M' ) 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:                NB = 32
  414:             END IF
  415:          END IF
  416:       ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
  417:          IF( C3( 1: 1 ).EQ.'G' ) THEN
  418:             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
  419:      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
  420:      $           THEN
  421:                NB = 32
  422:             END IF
  423:          ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
  424:             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
  425:      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
  426:      $           THEN
  427:                NB = 32
  428:             END IF
  429:          END IF
  430:       ELSE IF( C2.EQ.'GB' ) THEN
  431:          IF( C3.EQ.'TRF' ) THEN
  432:             IF( SNAME ) THEN
  433:                IF( N4.LE.64 ) THEN
  434:                   NB = 1
  435:                ELSE
  436:                   NB = 32
  437:                END IF
  438:             ELSE
  439:                IF( N4.LE.64 ) THEN
  440:                   NB = 1
  441:                ELSE
  442:                   NB = 32
  443:                END IF
  444:             END IF
  445:          END IF
  446:       ELSE IF( C2.EQ.'PB' ) THEN
  447:          IF( C3.EQ.'TRF' ) THEN
  448:             IF( SNAME ) THEN
  449:                IF( N2.LE.64 ) THEN
  450:                   NB = 1
  451:                ELSE
  452:                   NB = 32
  453:                END IF
  454:             ELSE
  455:                IF( N2.LE.64 ) THEN
  456:                   NB = 1
  457:                ELSE
  458:                   NB = 32
  459:                END IF
  460:             END IF
  461:          END IF
  462:       ELSE IF( C2.EQ.'TR' ) THEN
  463:          IF( C3.EQ.'TRI' ) THEN
  464:             IF( SNAME ) THEN
  465:                NB = 64
  466:             ELSE
  467:                NB = 64
  468:             END IF
  469:          ELSE IF ( C3.EQ.'EVC' ) THEN
  470:             IF( SNAME ) THEN
  471:                NB = 64
  472:             ELSE
  473:                NB = 64
  474:             END IF
  475:          END IF
  476:       ELSE IF( C2.EQ.'LA' ) THEN
  477:          IF( C3.EQ.'UUM' ) THEN
  478:             IF( SNAME ) THEN
  479:                NB = 64
  480:             ELSE
  481:                NB = 64
  482:             END IF
  483:          END IF
  484:       ELSE IF( SNAME .AND. C2.EQ.'ST' ) THEN
  485:          IF( C3.EQ.'EBZ' ) THEN
  486:             NB = 1
  487:          END IF
  488:       ELSE IF( C2.EQ.'GG' ) THEN
  489:          NB = 32
  490:          IF( C3.EQ.'HD3' ) THEN
  491:             IF( SNAME ) THEN
  492:                NB = 32
  493:             ELSE
  494:                NB = 32
  495:             END IF
  496:          END IF
  497:       END IF
  498:       ILAENV = NB
  499:       RETURN
  500: *
  501:    60 CONTINUE
  502: *
  503: *     ISPEC = 2:  minimum block size
  504: *
  505:       NBMIN = 2
  506:       IF( C2.EQ.'GE' ) THEN
  507:          IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
  508:      $       'QLF' ) THEN
  509:             IF( SNAME ) THEN
  510:                NBMIN = 2
  511:             ELSE
  512:                NBMIN = 2
  513:             END IF
  514:          ELSE IF( C3.EQ.'HRD' ) THEN
  515:             IF( SNAME ) THEN
  516:                NBMIN = 2
  517:             ELSE
  518:                NBMIN = 2
  519:             END IF
  520:          ELSE IF( C3.EQ.'BRD' ) THEN
  521:             IF( SNAME ) THEN
  522:                NBMIN = 2
  523:             ELSE
  524:                NBMIN = 2
  525:             END IF
  526:          ELSE IF( C3.EQ.'TRI' ) THEN
  527:             IF( SNAME ) THEN
  528:                NBMIN = 2
  529:             ELSE
  530:                NBMIN = 2
  531:             END IF
  532:          END IF
  533:       ELSE IF( C2.EQ.'SY' ) THEN
  534:          IF( C3.EQ.'TRF' ) THEN
  535:             IF( SNAME ) THEN
  536:                NBMIN = 8
  537:             ELSE
  538:                NBMIN = 8
  539:             END IF
  540:          ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
  541:             NBMIN = 2
  542:          END IF
  543:       ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
  544:          IF( C3.EQ.'TRD' ) THEN
  545:             NBMIN = 2
  546:          END IF
  547:       ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
  548:          IF( C3( 1: 1 ).EQ.'G' ) THEN
  549:             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
  550:      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
  551:      $           THEN
  552:                NBMIN = 2
  553:             END IF
  554:          ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
  555:             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
  556:      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
  557:      $           THEN
  558:                NBMIN = 2
  559:             END IF
  560:          END IF
  561:       ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
  562:          IF( C3( 1: 1 ).EQ.'G' ) THEN
  563:             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
  564:      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
  565:      $           THEN
  566:                NBMIN = 2
  567:             END IF
  568:          ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
  569:             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
  570:      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
  571:      $           THEN
  572:                NBMIN = 2
  573:             END IF
  574:          END IF
  575:       ELSE IF( C2.EQ.'GG' ) THEN
  576:          NBMIN = 2
  577:          IF( C3.EQ.'HD3' ) THEN
  578:             NBMIN = 2
  579:          END IF
  580:       END IF
  581:       ILAENV = NBMIN
  582:       RETURN
  583: *
  584:    70 CONTINUE
  585: *
  586: *     ISPEC = 3:  crossover point
  587: *
  588:       NX = 0
  589:       IF( C2.EQ.'GE' ) THEN
  590:          IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
  591:      $       'QLF' ) THEN
  592:             IF( SNAME ) THEN
  593:                NX = 128
  594:             ELSE
  595:                NX = 128
  596:             END IF
  597:          ELSE IF( C3.EQ.'HRD' ) THEN
  598:             IF( SNAME ) THEN
  599:                NX = 128
  600:             ELSE
  601:                NX = 128
  602:             END IF
  603:          ELSE IF( C3.EQ.'BRD' ) THEN
  604:             IF( SNAME ) THEN
  605:                NX = 128
  606:             ELSE
  607:                NX = 128
  608:             END IF
  609:          END IF
  610:       ELSE IF( C2.EQ.'SY' ) THEN
  611:          IF( SNAME .AND. C3.EQ.'TRD' ) THEN
  612:             NX = 32
  613:          END IF
  614:       ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
  615:          IF( C3.EQ.'TRD' ) THEN
  616:             NX = 32
  617:          END IF
  618:       ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
  619:          IF( C3( 1: 1 ).EQ.'G' ) THEN
  620:             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
  621:      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
  622:      $           THEN
  623:                NX = 128
  624:             END IF
  625:          END IF
  626:       ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
  627:          IF( C3( 1: 1 ).EQ.'G' ) THEN
  628:             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
  629:      $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
  630:      $           THEN
  631:                NX = 128
  632:             END IF
  633:          END IF
  634:       ELSE IF( C2.EQ.'GG' ) THEN
  635:          NX = 128
  636:          IF( C3.EQ.'HD3' ) THEN
  637:             NX = 128
  638:          END IF
  639:       END IF
  640:       ILAENV = NX
  641:       RETURN
  642: *
  643:    80 CONTINUE
  644: *
  645: *     ISPEC = 4:  number of shifts (used by xHSEQR)
  646: *
  647:       ILAENV = 6
  648:       RETURN
  649: *
  650:    90 CONTINUE
  651: *
  652: *     ISPEC = 5:  minimum column dimension (not used)
  653: *
  654:       ILAENV = 2
  655:       RETURN
  656: *
  657:   100 CONTINUE
  658: *
  659: *     ISPEC = 6:  crossover point for SVD (used by xGELSS and xGESVD)
  660: *
  661:       ILAENV = INT( REAL( MIN( N1, N2 ) )*1.6E0 )
  662:       RETURN
  663: *
  664:   110 CONTINUE
  665: *
  666: *     ISPEC = 7:  number of processors (not used)
  667: *
  668:       ILAENV = 1
  669:       RETURN
  670: *
  671:   120 CONTINUE
  672: *
  673: *     ISPEC = 8:  crossover point for multishift (used by xHSEQR)
  674: *
  675:       ILAENV = 50
  676:       RETURN
  677: *
  678:   130 CONTINUE
  679: *
  680: *     ISPEC = 9:  maximum size of the subproblems at the bottom of the
  681: *                 computation tree in the divide-and-conquer algorithm
  682: *                 (used by xGELSD and xGESDD)
  683: *
  684:       ILAENV = 25
  685:       RETURN
  686: *
  687:   140 CONTINUE
  688: *
  689: *     ISPEC = 10: ieee NaN arithmetic can be trusted not to trap
  690: *
  691: *     ILAENV = 0
  692:       ILAENV = 1
  693:       IF( ILAENV.EQ.1 ) THEN
  694:          ILAENV = IEEECK( 1, 0.0, 1.0 )
  695:       END IF
  696:       RETURN
  697: *
  698:   150 CONTINUE
  699: *
  700: *     ISPEC = 11: infinity arithmetic can be trusted not to trap
  701: *
  702: *     ILAENV = 0
  703:       ILAENV = 1
  704:       IF( ILAENV.EQ.1 ) THEN
  705:          ILAENV = IEEECK( 0, 0.0, 1.0 )
  706:       END IF
  707:       RETURN
  708: *
  709:   160 CONTINUE
  710: *
  711: *     12 <= ISPEC <= 16: xHSEQR or related subroutines.
  712: *
  713:       ILAENV = IPARMQ( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
  714:       RETURN
  715: *
  716: *     End of ILAENV
  717: *
  718:       END

CVSweb interface <joel.bertrand@systella.fr>