*> \brief \b ILAENV
*
*  =========== DOCUMENTATION ===========
*
* Online html documentation available at 
*            http://www.netlib.org/lapack/explore-html/ 
*
*> \htmlonly
*> Download ILAENV + dependencies 
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ilaenv.f"> 
*> [TGZ]</a> 
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ilaenv.f"> 
*> [ZIP]</a> 
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ilaenv.f"> 
*> [TXT]</a>
*> \endhtmlonly 
*
*  Definition:
*  ===========
*
*       INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
* 
*       .. Scalar Arguments ..
*       CHARACTER*( * )    NAME, OPTS
*       INTEGER            ISPEC, N1, N2, N3, N4
*       ..
*  
*
*> \par Purpose:
*  =============
*>
*> \verbatim
*>
*> 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.
*> \endverbatim
*
*  Arguments:
*  ==========
*
*> \param[in] ISPEC
*> \verbatim
*>          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 one of its subroutines,
*>               see IPARMQ for detailed explanation
*> \endverbatim
*>
*> \param[in] NAME
*> \verbatim
*>          NAME is CHARACTER*(*)
*>          The name of the calling subroutine, in either upper case or
*>          lower case.
*> \endverbatim
*>
*> \param[in] OPTS
*> \verbatim
*>          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'.
*> \endverbatim
*>
*> \param[in] N1
*> \verbatim
*>          N1 is INTEGER
*> \endverbatim
*>
*> \param[in] N2
*> \verbatim
*>          N2 is INTEGER
*> \endverbatim
*>
*> \param[in] N3
*> \verbatim
*>          N3 is INTEGER
*> \endverbatim
*>
*> \param[in] N4
*> \verbatim
*>          N4 is INTEGER
*>          Problem dimensions for the subroutine NAME; these may not all
*>          be required.
*> \endverbatim
*
*  Authors:
*  ========
*
*> \author Univ. of Tennessee 
*> \author Univ. of California Berkeley 
*> \author Univ. of Colorado Denver 
*> \author NAG Ltd. 
*
*> \date November 2011
*
*> \ingroup auxOTHERauxiliary
*
*> \par Further Details:
*  =====================
*>
*> \verbatim
*>
*>  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 )
*> \endverbatim
*>
*  =====================================================================
      INTEGER FUNCTION GAL_ILAENV(ISPEC,NAME,OPTS,N1,N2,N3,N4)
*
*  -- LAPACK auxiliary routine (version 3.4.0) --
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*     November 2011
*
*     .. Scalar Arguments ..
      CHARACTER*(*)NAME,OPTS
      INTEGER ISPEC,N1,N2,N3,N4
*     ..
*
*  =====================================================================
*
*     .. Local Scalars ..
      INTEGER I,IC,IZ,NB,NBMIN,NX
      LOGICAL CNAME,SNAME
      CHARACTERC1*1,C2*2,C4*2,C3*3,SUBNAM*6
*     ..
*     .. Intrinsic Functions ..
      INTRINSIC CHAR,ICHAR,INT,MIN,REAL
*     ..
*     .. External Functions ..
      INTEGER GAL_IEEECK,GAL_IPARMQ
      EXTERNAL GAL_IEEECK,GAL_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
*
      GAL_ILAENV=-1
      RETURN
*
   10 CONTINUE
*
*     Convert NAME to upper case if the first character is lower case.
*
      GAL_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 20I=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 30I=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 40I=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
      GAL_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
      GAL_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
      GAL_ILAENV=NX
      RETURN
*
   80 CONTINUE
*
*     ISPEC = 4:  number of shifts (used by xHSEQR)
*
      GAL_ILAENV=6
      RETURN
*
   90 CONTINUE
*
*     ISPEC = 5:  minimum column dimension (not used)
*
      GAL_ILAENV=2
      RETURN
*
  100 CONTINUE
*
*     ISPEC = 6:  crossover point for SVD (used by xGELSS and xGESVD)
*
      GAL_ILAENV=INT(REAL(MIN(N1,N2))*1.6E0)
      RETURN
*
  110 CONTINUE
*
*     ISPEC = 7:  number of processors (not used)
*
      GAL_ILAENV=1
      RETURN
*
  120 CONTINUE
*
*     ISPEC = 8:  crossover point for multishift (used by xHSEQR)
*
      GAL_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)
*
      GAL_ILAENV=25
      RETURN
*
  140 CONTINUE
*
*     ISPEC = 10: ieee NaN arithmetic can be trusted not to trap
*
*     ILAENV = 0
      GAL_ILAENV=1
      IF(GAL_ILAENV.EQ.1)THEN
      GAL_ILAENV=GAL_IEEECK(1,0.0,1.0)
      END IF
      RETURN
*
  150 CONTINUE
*
*     ISPEC = 11: infinity arithmetic can be trusted not to trap
*
*     ILAENV = 0
      GAL_ILAENV=1
      IF(GAL_ILAENV.EQ.1)THEN
      GAL_ILAENV=GAL_IEEECK(0,0.0,1.0)
      END IF
      RETURN
*
  160 CONTINUE
*
*     12 <= ISPEC <= 16: xHSEQR or one of its subroutines. 
*
      GAL_ILAENV=GAL_IPARMQ(ISPEC,NAME,OPTS,N1,N2,N3,N4)
      RETURN
*
*     End of ILAENV
*
      END 
