You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
402 lines
12 KiB
402 lines
12 KiB
2 years ago
|
*> \brief \b ILAENV
|
||
|
*
|
||
|
* =========== DOCUMENTATION ===========
|
||
|
*
|
||
|
* Online html documentation available at
|
||
|
* http://www.netlib.org/lapack/explore-html/
|
||
|
*
|
||
|
* 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 returns problem-dependent parameters for the local
|
||
|
*> environment. See ISPEC for a description of the parameters.
|
||
|
*>
|
||
|
*> In this version, the problem-dependent parameters are contained in
|
||
|
*> the integer array IPARMS in the common block CLAENV and the value
|
||
|
*> with index ISPEC is copied to ILAENV. This version of ILAENV is
|
||
|
*> to be used in conjunction with XLAENV in TESTING and TIMING.
|
||
|
*> \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
|
||
|
*> = 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 and QZ methods
|
||
|
*> for nonsymmetric eigenvalue problems.
|
||
|
*> = 9: maximum size of the subproblems at the bottom of the
|
||
|
*> computation tree in the divide-and-conquer algorithm
|
||
|
*> =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
|
||
|
*>
|
||
|
*> Other specifications (up to 100) can be added later.
|
||
|
*> \endverbatim
|
||
|
*>
|
||
|
*> \param[in] NAME
|
||
|
*> \verbatim
|
||
|
*> NAME is CHARACTER*(*)
|
||
|
*> The name of the calling subroutine.
|
||
|
*> \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
|
||
|
*>
|
||
|
*> \result ILAENV
|
||
|
*> \verbatim
|
||
|
*> ILAENV is INTEGER
|
||
|
*> >= 0: the value of the parameter specified by ISPEC
|
||
|
*> < 0: if ILAENV = -k, the k-th argument had an illegal value.
|
||
|
*> \endverbatim
|
||
|
*
|
||
|
* Authors:
|
||
|
* ========
|
||
|
*
|
||
|
*> \author Univ. of Tennessee
|
||
|
*> \author Univ. of California Berkeley
|
||
|
*> \author Univ. of Colorado Denver
|
||
|
*> \author NAG Ltd.
|
||
|
*
|
||
|
*> \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 test routine --
|
||
|
* -- LAPACK is a software package provided by Univ. of Tennessee, --
|
||
|
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
|
||
|
*
|
||
|
* .. Scalar Arguments ..
|
||
|
CHARACTER*( * ) NAME, OPTS
|
||
|
INTEGER ISPEC, N1, N2, N3, N4
|
||
|
* ..
|
||
|
*
|
||
|
* =====================================================================
|
||
|
*
|
||
|
* .. Intrinsic Functions ..
|
||
|
INTRINSIC INT, MIN, REAL
|
||
|
* ..
|
||
|
* .. External Functions ..
|
||
|
INTEGER IEEECK, IPARAM2STAGE
|
||
|
EXTERNAL IEEECK, IPARAM2STAGE
|
||
|
* ..
|
||
|
* .. Arrays in Common ..
|
||
|
INTEGER IPARMS( 100 )
|
||
|
* ..
|
||
|
* .. Common blocks ..
|
||
|
COMMON / CLAENV / IPARMS
|
||
|
* ..
|
||
|
* .. Save statement ..
|
||
|
SAVE / CLAENV /
|
||
|
* ..
|
||
|
* .. Executable Statements ..
|
||
|
*
|
||
|
IF( ISPEC.GE.1 .AND. ISPEC.LE.5 ) THEN
|
||
|
*
|
||
|
* Return a value from the common block.
|
||
|
*
|
||
|
ILAENV = IPARMS( ISPEC )
|
||
|
*
|
||
|
ELSE IF( ISPEC.EQ.6 ) THEN
|
||
|
*
|
||
|
* Compute SVD crossover point.
|
||
|
*
|
||
|
ILAENV = INT( REAL( MIN( N1, N2 ) )*1.6E0 )
|
||
|
*
|
||
|
ELSE IF( ISPEC.GE.7 .AND. ISPEC.LE.9 ) THEN
|
||
|
*
|
||
|
* Return a value from the common block.
|
||
|
*
|
||
|
ILAENV = IPARMS( ISPEC )
|
||
|
*
|
||
|
ELSE IF( ISPEC.EQ.10 ) THEN
|
||
|
*
|
||
|
* IEEE NaN arithmetic can be trusted not to trap
|
||
|
*
|
||
|
C ILAENV = 0
|
||
|
ILAENV = 1
|
||
|
IF( ILAENV.EQ.1 ) THEN
|
||
|
ILAENV = IEEECK( 1, 0.0, 1.0 )
|
||
|
END IF
|
||
|
*
|
||
|
ELSE IF( ISPEC.EQ.11 ) THEN
|
||
|
*
|
||
|
* Infinity arithmetic can be trusted not to trap
|
||
|
*
|
||
|
C ILAENV = 0
|
||
|
ILAENV = 1
|
||
|
IF( ILAENV.EQ.1 ) THEN
|
||
|
ILAENV = IEEECK( 0, 0.0, 1.0 )
|
||
|
END IF
|
||
|
*
|
||
|
ELSE IF(( ISPEC.GE.12 ) .AND. (ISPEC.LE.16)) THEN
|
||
|
*
|
||
|
* 12 <= ISPEC <= 16: xHSEQR or one of its subroutines.
|
||
|
*
|
||
|
ILAENV = IPARMS( ISPEC )
|
||
|
* WRITE(*,*) 'ISPEC = ',ISPEC,' ILAENV =',ILAENV
|
||
|
* ILAENV = IPARMQ( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
|
||
|
*
|
||
|
ELSE IF(( ISPEC.GE.17 ) .AND. (ISPEC.LE.21)) THEN
|
||
|
*
|
||
|
* 17 <= ISPEC <= 21: 2stage eigenvalues SVD routines.
|
||
|
*
|
||
|
IF( ISPEC.EQ.17 ) THEN
|
||
|
ILAENV = IPARMS( 1 )
|
||
|
ELSE
|
||
|
ILAENV = IPARAM2STAGE( ISPEC, NAME, OPTS, N1, N2, N3, N4 )
|
||
|
ENDIF
|
||
|
*
|
||
|
ELSE
|
||
|
*
|
||
|
* Invalid value for ISPEC
|
||
|
*
|
||
|
ILAENV = -1
|
||
|
END IF
|
||
|
*
|
||
|
RETURN
|
||
|
*
|
||
|
* End of ILAENV
|
||
|
*
|
||
|
END
|
||
|
INTEGER FUNCTION ILAENV2STAGE( ISPEC, NAME, OPTS, N1, N2,
|
||
|
$ N3, N4 )
|
||
|
* .. Scalar Arguments ..
|
||
|
CHARACTER*( * ) NAME, OPTS
|
||
|
INTEGER ISPEC, N1, N2, N3, N4
|
||
|
* ..
|
||
|
*
|
||
|
* =====================================================================
|
||
|
*
|
||
|
* .. Local variables ..
|
||
|
INTEGER IISPEC
|
||
|
* .. External Functions ..
|
||
|
INTEGER IPARAM2STAGE
|
||
|
EXTERNAL IPARAM2STAGE
|
||
|
* ..
|
||
|
* .. Arrays in Common ..
|
||
|
INTEGER IPARMS( 100 )
|
||
|
* ..
|
||
|
* .. Common blocks ..
|
||
|
COMMON / CLAENV / IPARMS
|
||
|
* ..
|
||
|
* .. Save statement ..
|
||
|
SAVE / CLAENV /
|
||
|
* ..
|
||
|
* .. Executable Statements ..
|
||
|
*
|
||
|
IF(( ISPEC.GE.1 ) .AND. (ISPEC.LE.5)) THEN
|
||
|
*
|
||
|
* 1 <= ISPEC <= 5: 2stage eigenvalues SVD routines.
|
||
|
*
|
||
|
IF( ISPEC.EQ.1 ) THEN
|
||
|
ILAENV2STAGE = IPARMS( 1 )
|
||
|
ELSE
|
||
|
IISPEC = 16 + ISPEC
|
||
|
ILAENV2STAGE = IPARAM2STAGE( IISPEC, NAME, OPTS,
|
||
|
$ N1, N2, N3, N4 )
|
||
|
ENDIF
|
||
|
*
|
||
|
ELSE
|
||
|
*
|
||
|
* Invalid value for ISPEC
|
||
|
*
|
||
|
ILAENV2STAGE = -1
|
||
|
END IF
|
||
|
*
|
||
|
RETURN
|
||
|
*
|
||
|
* End of ILAENV2STAGE
|
||
|
*
|
||
|
END
|
||
|
INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
|
||
|
*
|
||
|
INTEGER INMIN, INWIN, INIBL, ISHFTS, IACC22
|
||
|
PARAMETER ( INMIN = 12, INWIN = 13, INIBL = 14,
|
||
|
$ ISHFTS = 15, IACC22 = 16 )
|
||
|
INTEGER NMIN, K22MIN, KACMIN, NIBBLE, KNWSWP
|
||
|
PARAMETER ( NMIN = 11, K22MIN = 14, KACMIN = 14,
|
||
|
$ NIBBLE = 14, KNWSWP = 500 )
|
||
|
REAL TWO
|
||
|
PARAMETER ( TWO = 2.0 )
|
||
|
* ..
|
||
|
* .. Scalar Arguments ..
|
||
|
INTEGER IHI, ILO, ISPEC, LWORK, N
|
||
|
CHARACTER NAME*( * ), OPTS*( * )
|
||
|
* ..
|
||
|
* .. Local Scalars ..
|
||
|
INTEGER NH, NS
|
||
|
* ..
|
||
|
* .. Intrinsic Functions ..
|
||
|
INTRINSIC LOG, MAX, MOD, NINT, REAL
|
||
|
* ..
|
||
|
* .. Executable Statements ..
|
||
|
IF( ( ISPEC.EQ.ISHFTS ) .OR. ( ISPEC.EQ.INWIN ) .OR.
|
||
|
$ ( ISPEC.EQ.IACC22 ) ) THEN
|
||
|
*
|
||
|
* ==== Set the number simultaneous shifts ====
|
||
|
*
|
||
|
NH = IHI - ILO + 1
|
||
|
NS = 2
|
||
|
IF( NH.GE.30 )
|
||
|
$ NS = 4
|
||
|
IF( NH.GE.60 )
|
||
|
$ NS = 10
|
||
|
IF( NH.GE.150 )
|
||
|
$ NS = MAX( 10, NH / NINT( LOG( REAL( NH ) ) / LOG( TWO ) ) )
|
||
|
IF( NH.GE.590 )
|
||
|
$ NS = 64
|
||
|
IF( NH.GE.3000 )
|
||
|
$ NS = 128
|
||
|
IF( NH.GE.6000 )
|
||
|
$ NS = 256
|
||
|
NS = MAX( 2, NS-MOD( NS, 2 ) )
|
||
|
END IF
|
||
|
*
|
||
|
IF( ISPEC.EQ.INMIN ) THEN
|
||
|
*
|
||
|
*
|
||
|
* ===== Matrices of order smaller than NMIN get sent
|
||
|
* . to LAHQR, the classic double shift algorithm.
|
||
|
* . This must be at least 11. ====
|
||
|
*
|
||
|
IPARMQ = NMIN
|
||
|
*
|
||
|
ELSE IF( ISPEC.EQ.INIBL ) THEN
|
||
|
*
|
||
|
* ==== INIBL: skip a multi-shift qr iteration and
|
||
|
* . whenever aggressive early deflation finds
|
||
|
* . at least (NIBBLE*(window size)/100) deflations. ====
|
||
|
*
|
||
|
IPARMQ = NIBBLE
|
||
|
*
|
||
|
ELSE IF( ISPEC.EQ.ISHFTS ) THEN
|
||
|
*
|
||
|
* ==== NSHFTS: The number of simultaneous shifts =====
|
||
|
*
|
||
|
IPARMQ = NS
|
||
|
*
|
||
|
ELSE IF( ISPEC.EQ.INWIN ) THEN
|
||
|
*
|
||
|
* ==== NW: deflation window size. ====
|
||
|
*
|
||
|
IF( NH.LE.KNWSWP ) THEN
|
||
|
IPARMQ = NS
|
||
|
ELSE
|
||
|
IPARMQ = 3*NS / 2
|
||
|
END IF
|
||
|
*
|
||
|
ELSE IF( ISPEC.EQ.IACC22 ) THEN
|
||
|
*
|
||
|
* ==== IACC22: Whether to accumulate reflections
|
||
|
* . before updating the far-from-diagonal elements
|
||
|
* . and whether to use 2-by-2 block structure while
|
||
|
* . doing it. A small amount of work could be saved
|
||
|
* . by making this choice dependent also upon the
|
||
|
* . NH=IHI-ILO+1.
|
||
|
*
|
||
|
IPARMQ = 0
|
||
|
IF( NS.GE.KACMIN )
|
||
|
$ IPARMQ = 1
|
||
|
IF( NS.GE.K22MIN )
|
||
|
$ IPARMQ = 2
|
||
|
*
|
||
|
ELSE
|
||
|
* ===== invalid value of ispec =====
|
||
|
IPARMQ = -1
|
||
|
*
|
||
|
END IF
|
||
|
*
|
||
|
* ==== End of IPARMQ ====
|
||
|
*
|
||
|
END
|