          INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
    *
    *  -- LAPACK auxiliary routine (version 3.1.1) --
    *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
    *     January 2007
    *
    *     .. Scalar Arguments ..
          CHARACTER*( * )    NAME, OPTS
          INTEGER            ISPEC, N1, N2, N3, N4
    *     ..
    *
    *  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.
    *
    *  Arguments
    *  =========
    *
    *  ISPEC   (input) 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 one of its subroutines,
    *               see IPARMQ for detailed explanation
    *
    *  NAME    (input) CHARACTER*(*)
    *          The name of the calling subroutine, in either upper case or
    *          lower case.
    *
    *  OPTS    (input) 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'.
    *
    *  N1      (input) INTEGER
    *  N2      (input) INTEGER
    *  N3      (input) INTEGER
    *  N4      (input) INTEGER
    *          Problem dimensions for the subroutine NAME; these may not all
    *          be required.
    *
    *  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 )
    *
    *  =====================================================================
    *
    *     .. Local Scalars ..
          INTEGER            I, IC, IZ, NB, NBMIN, NX
          LOGICAL            CNAME, SNAME
          CHARACTER          C1*1, C2*2, C4*2, C3*3, SUBNAM*6
    *     ..
    *     .. Intrinsic Functions ..
          INTRINSIC          CHAR, ICHAR, INT, MIN, REAL
    *     ..
    *     .. External Functions ..
          INTEGER            IEEECK, IPARMQ
          EXTERNAL           IEEECK, IPARMQ
    *     ..
    *     .. Executable Statements ..
    *
          GO TO ( 10, 10, 10, 80, 90, 100, 110, 120,
         $        130, 140, 150, 160, 160, 160, 160, 160 )ISPEC
    *
    *     Invalid value for ISPEC
    *
          ILAENV = -1
          RETURN
    *
       10 CONTINUE
    *
    *     Convert NAME to upper case if the first character is lower case.
    *
          ILAENV = 1
          SUBNAM = NAME
          IC = ICHAR( SUBNAM( 1: 1 ) )
          IZ = ICHAR( 'Z' )
          IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN
    *
    *        ASCII character set
    *
             IF( IC.GE.97 .AND. IC.LE.122 ) THEN
                SUBNAM( 1: 1 ) = CHAR( IC-32 )
                DO 20 I = 2, 6
                   IC = ICHAR( SUBNAM( I: I ) )
                   IF( IC.GE.97 .AND. IC.LE.122 )
         $            SUBNAM( I: I ) = CHAR( IC-32 )
       20       CONTINUE
             END IF
    *
          ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN
    *
    *        EBCDIC character set
    *
             IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
         $       ( IC.GE.145 .AND. IC.LE.153 ) .OR.
         $       ( IC.GE.162 .AND. IC.LE.169 ) ) THEN
                SUBNAM( 1: 1 ) = CHAR( IC+64 )
                DO 30 I = 2, 6
                   IC = ICHAR( SUBNAM( I: I ) )
                   IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
         $             ( IC.GE.145 .AND. IC.LE.153 ) .OR.
         $             ( IC.GE.162 .AND. IC.LE.169 ) )SUBNAM( I:
         $             I ) = CHAR( IC+64 )
       30       CONTINUE
             END IF
    *
          ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN
    *
    *        Prime machines:  ASCII+128
    *
             IF( IC.GE.225 .AND. IC.LE.250 ) THEN
                SUBNAM( 1: 1 ) = CHAR( IC-32 )
                DO 40 I = 2, 6
                   IC = ICHAR( SUBNAM( I: I ) )
                   IF( IC.GE.225 .AND. IC.LE.250 )
         $            SUBNAM( I: I ) = CHAR( IC-32 )
       40       CONTINUE
             END IF
          END IF
    *
          C1 = SUBNAM( 1: 1 )
          SNAME = C1.EQ.'S' .OR. C1.EQ.'D'
          CNAME = C1.EQ.'C' .OR. C1.EQ.'Z'
          IF( .NOT.( CNAME .OR. SNAME ) )
         $   RETURN
          C2 = SUBNAM( 2: 3 )
          C3 = SUBNAM( 4: 6 )
          C4 = C3( 2: 3 )
    *
          GO TO ( 50, 60, 70 )ISPEC
    *
       50 CONTINUE
    *
    *     ISPEC = 1:  block size
    *
    *     In these examples, separate code is provided for setting NB for
    *     real and complex.  We assume that NB will take the same value in
    *     single or double precision.
    *
          NB = 1
    *
          IF( C2.EQ.'GE' ) THEN
             IF( C3.EQ.'TRF' ) THEN
                IF( SNAME ) THEN
                   NB = 64
                ELSE
                   NB = 64
                END IF
             ELSE IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
         $            C3.EQ.'QLF' ) THEN
                IF( SNAME ) THEN
                   NB = 32
                ELSE
                   NB = 32
                END IF
             ELSE IF( C3.EQ.'HRD' ) THEN
                IF( SNAME ) THEN
                   NB = 32
                ELSE
                   NB = 32
                END IF
             ELSE IF( C3.EQ.'BRD' ) THEN
                IF( SNAME ) THEN
                   NB = 32
                ELSE
                   NB = 32
                END IF
             ELSE IF( C3.EQ.'TRI' ) THEN
                IF( SNAME ) THEN
                   NB = 64
                ELSE
                   NB = 64
                END IF
             END IF
          ELSE IF( C2.EQ.'PO' ) THEN
             IF( C3.EQ.'TRF' ) THEN
                IF( SNAME ) THEN
                   NB = 64
                ELSE
                   NB = 64
                END IF
             END IF
          ELSE IF( C2.EQ.'SY' ) THEN
             IF( C3.EQ.'TRF' ) THEN
                IF( SNAME ) THEN
                   NB = 64
                ELSE
                   NB = 64
                END IF
             ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
                NB = 32
             ELSE IF( SNAME .AND. C3.EQ.'GST' ) THEN
                NB = 64
             END IF
          ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
             IF( C3.EQ.'TRF' ) THEN
                NB = 64
             ELSE IF( C3.EQ.'TRD' ) THEN
                NB = 32
             ELSE IF( C3.EQ.'GST' ) THEN
                NB = 64
             END IF
          ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
             IF( C3( 1: 1 ).EQ.'G' ) THEN
                IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
         $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
         $           THEN
                   NB = 32
                END IF
             ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
                IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
         $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
         $           THEN
                   NB = 32
                END IF
             END IF
          ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
             IF( C3( 1: 1 ).EQ.'G' ) THEN
                IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
         $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
         $           THEN
                   NB = 32
                END IF
             ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
                IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
         $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
         $           THEN
                   NB = 32
                END IF
             END IF
          ELSE IF( C2.EQ.'GB' ) THEN
             IF( C3.EQ.'TRF' ) THEN
                IF( SNAME ) THEN
                   IF( N4.LE.64 ) THEN
                      NB = 1
                   ELSE
                      NB = 32
                   END IF
                ELSE
                   IF( N4.LE.64 ) THEN
                      NB = 1
                   ELSE
                      NB = 32
                   END IF
                END IF
             END IF
          ELSE IF( C2.EQ.'PB' ) THEN
             IF( C3.EQ.'TRF' ) THEN
                IF( SNAME ) THEN
                   IF( N2.LE.64 ) THEN
                      NB = 1
                   ELSE
                      NB = 32
                   END IF
                ELSE
                   IF( N2.LE.64 ) THEN
                      NB = 1
                   ELSE
                      NB = 32
                   END IF
                END IF
             END IF
          ELSE IF( C2.EQ.'TR' ) THEN
             IF( C3.EQ.'TRI' ) THEN
                IF( SNAME ) THEN
                   NB = 64
                ELSE
                   NB = 64
                END IF
             END IF
          ELSE IF( C2.EQ.'LA' ) THEN
             IF( C3.EQ.'UUM' ) THEN
                IF( SNAME ) THEN
                   NB = 64
                ELSE
                   NB = 64
                END IF
             END IF
          ELSE IF( SNAME .AND. C2.EQ.'ST' ) THEN
             IF( C3.EQ.'EBZ' ) THEN
                NB = 1
             END IF
          END IF
          ILAENV = NB
          RETURN
    *
       60 CONTINUE
    *
    *     ISPEC = 2:  minimum block size
    *
          NBMIN = 2
          IF( C2.EQ.'GE' ) THEN
             IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
         $       'QLF' ) THEN
                IF( SNAME ) THEN
                   NBMIN = 2
                ELSE
                   NBMIN = 2
                END IF
             ELSE IF( C3.EQ.'HRD' ) THEN
                IF( SNAME ) THEN
                   NBMIN = 2
                ELSE
                   NBMIN = 2
                END IF
             ELSE IF( C3.EQ.'BRD' ) THEN
                IF( SNAME ) THEN
                   NBMIN = 2
                ELSE
                   NBMIN = 2
                END IF
             ELSE IF( C3.EQ.'TRI' ) THEN
                IF( SNAME ) THEN
                   NBMIN = 2
                ELSE
                   NBMIN = 2
                END IF
             END IF
          ELSE IF( C2.EQ.'SY' ) THEN
             IF( C3.EQ.'TRF' ) THEN
                IF( SNAME ) THEN
                   NBMIN = 8
                ELSE
                   NBMIN = 8
                END IF
             ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
                NBMIN = 2
             END IF
          ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
             IF( C3.EQ.'TRD' ) THEN
                NBMIN = 2
             END IF
          ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
             IF( C3( 1: 1 ).EQ.'G' ) THEN
                IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
         $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
         $           THEN
                   NBMIN = 2
                END IF
             ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
                IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
         $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
         $           THEN
                   NBMIN = 2
                END IF
             END IF
          ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
             IF( C3( 1: 1 ).EQ.'G' ) THEN
                IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
         $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
         $           THEN
                   NBMIN = 2
                END IF
             ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN
                IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
         $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
         $           THEN
                   NBMIN = 2
                END IF
             END IF
          END IF
          ILAENV = NBMIN
          RETURN
    *
       70 CONTINUE
    *
    *     ISPEC = 3:  crossover point
    *
          NX = 0
          IF( C2.EQ.'GE' ) THEN
             IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ.
         $       'QLF' ) THEN
                IF( SNAME ) THEN
                   NX = 128
                ELSE
                   NX = 128
                END IF
             ELSE IF( C3.EQ.'HRD' ) THEN
                IF( SNAME ) THEN
                   NX = 128
                ELSE
                   NX = 128
                END IF
             ELSE IF( C3.EQ.'BRD' ) THEN
                IF( SNAME ) THEN
                   NX = 128
                ELSE
                   NX = 128
                END IF
             END IF
          ELSE IF( C2.EQ.'SY' ) THEN
             IF( SNAME .AND. C3.EQ.'TRD' ) THEN
                NX = 32
             END IF
          ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
             IF( C3.EQ.'TRD' ) THEN
                NX = 32
             END IF
          ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
             IF( C3( 1: 1 ).EQ.'G' ) THEN
                IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
         $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
         $           THEN
                   NX = 128
                END IF
             END IF
          ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
             IF( C3( 1: 1 ).EQ.'G' ) THEN
                IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ.
         $          'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' )
         $           THEN
                   NX = 128
                END IF
             END IF
          END IF
          ILAENV = NX
          RETURN
    *
       80 CONTINUE
    *
    *     ISPEC = 4:  number of shifts (used by xHSEQR)
    *
          ILAENV = 6
          RETURN
    *
       90 CONTINUE
    *
    *     ISPEC = 5:  minimum column dimension (not used)
    *
          ILAENV = 2
          RETURN
    *
      100 CONTINUE
    *
    *     ISPEC = 6:  crossover point for SVD (used by xGELSS and xGESVD)
    *
          ILAENV = INT( REAL( MIN( N1, N2 ) )*1.6E0 )
          RETURN
    *
      110 CONTINUE
    *
    *     ISPEC = 7:  number of processors (not used)
    *
          ILAENV = 1
          RETURN
    *
      120 CONTINUE
    *
    *     ISPEC = 8:  crossover point for multishift (used by xHSEQR)
    *
          ILAENV = 50
          RETURN
    *
      130 CONTINUE
    *
    *     ISPEC = 9:  maximum size of the subproblems at the bottom of the
    *                 computation tree in the divide-and-conquer algorithm
    *                 (used by xGELSD and xGESDD)
    *
          ILAENV = 25
          RETURN
    *
      140 CONTINUE
    *
    *     ISPEC = 10: ieee NaN arithmetic can be trusted not to trap
    *
    *     ILAENV = 0
          ILAENV = 1
          IF( ILAENV.EQ.1 ) THEN
             ILAENV = IEEECK( 0, 0.0, 1.0 )
          END IF
          RETURN
    *
      150 CONTINUE
    *
    *     ISPEC = 11: infinity arithmetic can be trusted not to trap
    *
    *     ILAENV = 0
          ILAENV = 1
          IF( ILAENV.EQ.1 ) THEN
             ILAENV = IEEECK( 1, 0.0, 1.0 )
          END IF
          RETURN
    *
      160 CONTINUE
    *
    *     12 <= ISPEC <= 16: xHSEQR or one of its subroutines.
    *
          ILAENV = IPARMQ( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
          RETURN
    *
    *     End of ILAENV
    *
          END