forked from lijiext/lammps
704 lines
20 KiB
Fortran
704 lines
20 KiB
Fortran
*> \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 related 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 December 2016
|
|
*
|
|
*> \ingroup OTHERauxiliary
|
|
*
|
|
*> \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 ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
|
|
*
|
|
* -- LAPACK auxiliary routine (version 3.7.0) --
|
|
* -- LAPACK is a software package provided by Univ. of Tennessee, --
|
|
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
|
|
* December 2016
|
|
*
|
|
* .. Scalar Arguments ..
|
|
CHARACTER*( * ) NAME, OPTS
|
|
INTEGER ISPEC, N1, N2, N3, N4
|
|
* ..
|
|
*
|
|
* =====================================================================
|
|
*
|
|
* .. 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, IPARAM2STAGE
|
|
EXTERNAL IEEECK, IPARMQ, IPARAM2STAGE
|
|
* ..
|
|
* .. Executable Statements ..
|
|
*
|
|
GO TO ( 10, 10, 10, 80, 90, 100, 110, 120,
|
|
$ 130, 140, 150, 160, 160, 160, 160, 160,
|
|
$ 170, 170, 170, 170, 170 )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.'QR ') THEN
|
|
IF( N3 .EQ. 1) THEN
|
|
IF( SNAME ) THEN
|
|
* M*N
|
|
IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
|
|
NB = N1
|
|
ELSE
|
|
NB = 32768/N2
|
|
END IF
|
|
ELSE
|
|
IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
|
|
NB = N1
|
|
ELSE
|
|
NB = 32768/N2
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
IF( SNAME ) THEN
|
|
NB = 1
|
|
ELSE
|
|
NB = 1
|
|
END IF
|
|
END IF
|
|
ELSE IF( C3.EQ.'LQ ') THEN
|
|
IF( N3 .EQ. 2) THEN
|
|
IF( SNAME ) THEN
|
|
* M*N
|
|
IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
|
|
NB = N1
|
|
ELSE
|
|
NB = 32768/N2
|
|
END IF
|
|
ELSE
|
|
IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN
|
|
NB = N1
|
|
ELSE
|
|
NB = 32768/N2
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
IF( SNAME ) THEN
|
|
NB = 1
|
|
ELSE
|
|
NB = 1
|
|
END IF
|
|
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
|
|
ELSE IF ( C3.EQ.'EVC' ) 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
|
|
ELSE IF( C2.EQ.'GG' ) THEN
|
|
NB = 32
|
|
IF( C3.EQ.'HD3' ) THEN
|
|
IF( SNAME ) THEN
|
|
NB = 32
|
|
ELSE
|
|
NB = 32
|
|
END IF
|
|
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
|
|
ELSE IF( C2.EQ.'GG' ) THEN
|
|
NBMIN = 2
|
|
IF( C3.EQ.'HD3' ) THEN
|
|
NBMIN = 2
|
|
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
|
|
ELSE IF( C2.EQ.'GG' ) THEN
|
|
NX = 128
|
|
IF( C3.EQ.'HD3' ) THEN
|
|
NX = 128
|
|
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( 1, 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( 0, 0.0, 1.0 )
|
|
END IF
|
|
RETURN
|
|
*
|
|
160 CONTINUE
|
|
*
|
|
* 12 <= ISPEC <= 16: xHSEQR or related subroutines.
|
|
*
|
|
ILAENV = IPARMQ( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
|
|
RETURN
|
|
*
|
|
170 CONTINUE
|
|
*
|
|
* 17 <= ISPEC <= 21: 2stage eigenvalues and SVD or related subroutines.
|
|
*
|
|
ILAENV = IPARAM2STAGE( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
|
|
RETURN
|
|
*
|
|
* End of ILAENV
|
|
*
|
|
END
|