forked from lijiext/lammps
396 lines
14 KiB
Fortran
396 lines
14 KiB
Fortran
*> \brief \b IPARMQ
|
|
*
|
|
* =========== DOCUMENTATION ===========
|
|
*
|
|
* Online html documentation available at
|
|
* http://www.netlib.org/lapack/explore-html/
|
|
*
|
|
*> \htmlonly
|
|
*> Download IPARMQ + dependencies
|
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/iparmq.f">
|
|
*> [TGZ]</a>
|
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/iparmq.f">
|
|
*> [ZIP]</a>
|
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/iparmq.f">
|
|
*> [TXT]</a>
|
|
*> \endhtmlonly
|
|
*
|
|
* Definition:
|
|
* ===========
|
|
*
|
|
* INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
|
|
*
|
|
* .. Scalar Arguments ..
|
|
* INTEGER IHI, ILO, ISPEC, LWORK, N
|
|
* CHARACTER NAME*( * ), OPTS*( * )
|
|
*
|
|
*
|
|
*> \par Purpose:
|
|
* =============
|
|
*>
|
|
*> \verbatim
|
|
*>
|
|
*> This program sets problem and machine dependent parameters
|
|
*> useful for xHSEQR and related subroutines for eigenvalue
|
|
*> problems. It is called whenever
|
|
*> IPARMQ is called with 12 <= ISPEC <= 16
|
|
*> \endverbatim
|
|
*
|
|
* Arguments:
|
|
* ==========
|
|
*
|
|
*> \param[in] ISPEC
|
|
*> \verbatim
|
|
*> ISPEC is INTEGER
|
|
*> ISPEC specifies which tunable parameter IPARMQ should
|
|
*> return.
|
|
*>
|
|
*> ISPEC=12: (INMIN) Matrices of order nmin or less
|
|
*> are sent directly to xLAHQR, the implicit
|
|
*> double shift QR algorithm. NMIN must be
|
|
*> at least 11.
|
|
*>
|
|
*> ISPEC=13: (INWIN) Size of the deflation window.
|
|
*> This is best set greater than or equal to
|
|
*> the number of simultaneous shifts NS.
|
|
*> Larger matrices benefit from larger deflation
|
|
*> windows.
|
|
*>
|
|
*> ISPEC=14: (INIBL) Determines when to stop nibbling and
|
|
*> invest in an (expensive) multi-shift QR sweep.
|
|
*> If the aggressive early deflation subroutine
|
|
*> finds LD converged eigenvalues from an order
|
|
*> NW deflation window and LD.GT.(NW*NIBBLE)/100,
|
|
*> then the next QR sweep is skipped and early
|
|
*> deflation is applied immediately to the
|
|
*> remaining active diagonal block. Setting
|
|
*> IPARMQ(ISPEC=14) = 0 causes TTQRE to skip a
|
|
*> multi-shift QR sweep whenever early deflation
|
|
*> finds a converged eigenvalue. Setting
|
|
*> IPARMQ(ISPEC=14) greater than or equal to 100
|
|
*> prevents TTQRE from skipping a multi-shift
|
|
*> QR sweep.
|
|
*>
|
|
*> ISPEC=15: (NSHFTS) The number of simultaneous shifts in
|
|
*> a multi-shift QR iteration.
|
|
*>
|
|
*> ISPEC=16: (IACC22) IPARMQ is set to 0, 1 or 2 with the
|
|
*> following meanings.
|
|
*> 0: During the multi-shift QR/QZ sweep,
|
|
*> blocked eigenvalue reordering, blocked
|
|
*> Hessenberg-triangular reduction,
|
|
*> reflections and/or rotations are not
|
|
*> accumulated when updating the
|
|
*> far-from-diagonal matrix entries.
|
|
*> 1: During the multi-shift QR/QZ sweep,
|
|
*> blocked eigenvalue reordering, blocked
|
|
*> Hessenberg-triangular reduction,
|
|
*> reflections and/or rotations are
|
|
*> accumulated, and matrix-matrix
|
|
*> multiplication is used to update the
|
|
*> far-from-diagonal matrix entries.
|
|
*> 2: During the multi-shift QR/QZ sweep,
|
|
*> blocked eigenvalue reordering, blocked
|
|
*> Hessenberg-triangular reduction,
|
|
*> reflections and/or rotations are
|
|
*> accumulated, and 2-by-2 block structure
|
|
*> is exploited during matrix-matrix
|
|
*> multiplies.
|
|
*> (If xTRMM is slower than xGEMM, then
|
|
*> IPARMQ(ISPEC=16)=1 may be more efficient than
|
|
*> IPARMQ(ISPEC=16)=2 despite the greater level of
|
|
*> arithmetic work implied by the latter choice.)
|
|
*> \endverbatim
|
|
*>
|
|
*> \param[in] NAME
|
|
*> \verbatim
|
|
*> NAME is character string
|
|
*> Name of the calling subroutine
|
|
*> \endverbatim
|
|
*>
|
|
*> \param[in] OPTS
|
|
*> \verbatim
|
|
*> OPTS is character string
|
|
*> This is a concatenation of the string arguments to
|
|
*> TTQRE.
|
|
*> \endverbatim
|
|
*>
|
|
*> \param[in] N
|
|
*> \verbatim
|
|
*> N is INTEGER
|
|
*> N is the order of the Hessenberg matrix H.
|
|
*> \endverbatim
|
|
*>
|
|
*> \param[in] ILO
|
|
*> \verbatim
|
|
*> ILO is INTEGER
|
|
*> \endverbatim
|
|
*>
|
|
*> \param[in] IHI
|
|
*> \verbatim
|
|
*> IHI is INTEGER
|
|
*> It is assumed that H is already upper triangular
|
|
*> in rows and columns 1:ILO-1 and IHI+1:N.
|
|
*> \endverbatim
|
|
*>
|
|
*> \param[in] LWORK
|
|
*> \verbatim
|
|
*> LWORK is INTEGER
|
|
*> The amount of workspace available.
|
|
*> \endverbatim
|
|
*
|
|
* Authors:
|
|
* ========
|
|
*
|
|
*> \author Univ. of Tennessee
|
|
*> \author Univ. of California Berkeley
|
|
*> \author Univ. of Colorado Denver
|
|
*> \author NAG Ltd.
|
|
*
|
|
*> \date June 2017
|
|
*
|
|
*> \ingroup OTHERauxiliary
|
|
*
|
|
*> \par Further Details:
|
|
* =====================
|
|
*>
|
|
*> \verbatim
|
|
*>
|
|
*> Little is known about how best to choose these parameters.
|
|
*> It is possible to use different values of the parameters
|
|
*> for each of CHSEQR, DHSEQR, SHSEQR and ZHSEQR.
|
|
*>
|
|
*> It is probably best to choose different parameters for
|
|
*> different matrices and different parameters at different
|
|
*> times during the iteration, but this has not been
|
|
*> implemented --- yet.
|
|
*>
|
|
*>
|
|
*> The best choices of most of the parameters depend
|
|
*> in an ill-understood way on the relative execution
|
|
*> rate of xLAQR3 and xLAQR5 and on the nature of each
|
|
*> particular eigenvalue problem. Experiment may be the
|
|
*> only practical way to determine which choices are most
|
|
*> effective.
|
|
*>
|
|
*> Following is a list of default values supplied by IPARMQ.
|
|
*> These defaults may be adjusted in order to attain better
|
|
*> performance in any particular computational environment.
|
|
*>
|
|
*> IPARMQ(ISPEC=12) The xLAHQR vs xLAQR0 crossover point.
|
|
*> Default: 75. (Must be at least 11.)
|
|
*>
|
|
*> IPARMQ(ISPEC=13) Recommended deflation window size.
|
|
*> This depends on ILO, IHI and NS, the
|
|
*> number of simultaneous shifts returned
|
|
*> by IPARMQ(ISPEC=15). The default for
|
|
*> (IHI-ILO+1).LE.500 is NS. The default
|
|
*> for (IHI-ILO+1).GT.500 is 3*NS/2.
|
|
*>
|
|
*> IPARMQ(ISPEC=14) Nibble crossover point. Default: 14.
|
|
*>
|
|
*> IPARMQ(ISPEC=15) Number of simultaneous shifts, NS.
|
|
*> a multi-shift QR iteration.
|
|
*>
|
|
*> If IHI-ILO+1 is ...
|
|
*>
|
|
*> greater than ...but less ... the
|
|
*> or equal to ... than default is
|
|
*>
|
|
*> 0 30 NS = 2+
|
|
*> 30 60 NS = 4+
|
|
*> 60 150 NS = 10
|
|
*> 150 590 NS = **
|
|
*> 590 3000 NS = 64
|
|
*> 3000 6000 NS = 128
|
|
*> 6000 infinity NS = 256
|
|
*>
|
|
*> (+) By default matrices of this order are
|
|
*> passed to the implicit double shift routine
|
|
*> xLAHQR. See IPARMQ(ISPEC=12) above. These
|
|
*> values of NS are used only in case of a rare
|
|
*> xLAHQR failure.
|
|
*>
|
|
*> (**) The asterisks (**) indicate an ad-hoc
|
|
*> function increasing from 10 to 64.
|
|
*>
|
|
*> IPARMQ(ISPEC=16) Select structured matrix multiply.
|
|
*> (See ISPEC=16 above for details.)
|
|
*> Default: 3.
|
|
*> \endverbatim
|
|
*>
|
|
* =====================================================================
|
|
INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
|
|
*
|
|
* -- LAPACK auxiliary routine (version 3.7.1) --
|
|
* -- LAPACK is a software package provided by Univ. of Tennessee, --
|
|
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
|
|
* June 2017
|
|
*
|
|
* .. Scalar Arguments ..
|
|
INTEGER IHI, ILO, ISPEC, LWORK, N
|
|
CHARACTER NAME*( * ), OPTS*( * )
|
|
*
|
|
* ================================================================
|
|
* .. Parameters ..
|
|
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 = 75, K22MIN = 14, KACMIN = 14,
|
|
$ NIBBLE = 14, KNWSWP = 500 )
|
|
REAL TWO
|
|
PARAMETER ( TWO = 2.0 )
|
|
* ..
|
|
* .. Local Scalars ..
|
|
INTEGER NH, NS
|
|
INTEGER I, IC, IZ
|
|
CHARACTER SUBNAM*6
|
|
* ..
|
|
* .. 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 xLAHQR, 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.
|
|
*
|
|
*
|
|
* Convert NAME to upper case if the first character is lower case.
|
|
*
|
|
IPARMQ = 0
|
|
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 I = 2, 6
|
|
IC = ICHAR( SUBNAM( I: I ) )
|
|
IF( IC.GE.97 .AND. IC.LE.122 )
|
|
$ SUBNAM( I: I ) = CHAR( IC-32 )
|
|
END DO
|
|
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 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 )
|
|
END DO
|
|
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 I = 2, 6
|
|
IC = ICHAR( SUBNAM( I: I ) )
|
|
IF( IC.GE.225 .AND. IC.LE.250 )
|
|
$ SUBNAM( I: I ) = CHAR( IC-32 )
|
|
END DO
|
|
END IF
|
|
END IF
|
|
*
|
|
IF( SUBNAM( 2:6 ).EQ.'GGHRD' .OR.
|
|
$ SUBNAM( 2:6 ).EQ.'GGHD3' ) THEN
|
|
IPARMQ = 1
|
|
IF( NH.GE.K22MIN )
|
|
$ IPARMQ = 2
|
|
ELSE IF ( SUBNAM( 4:6 ).EQ.'EXC' ) THEN
|
|
IF( NH.GE.KACMIN )
|
|
$ IPARMQ = 1
|
|
IF( NH.GE.K22MIN )
|
|
$ IPARMQ = 2
|
|
ELSE IF ( SUBNAM( 2:6 ).EQ.'HSEQR' .OR.
|
|
$ SUBNAM( 2:5 ).EQ.'LAQR' ) THEN
|
|
IF( NS.GE.KACMIN )
|
|
$ IPARMQ = 1
|
|
IF( NS.GE.K22MIN )
|
|
$ IPARMQ = 2
|
|
END IF
|
|
*
|
|
ELSE
|
|
* ===== invalid value of ispec =====
|
|
IPARMQ = -1
|
|
*
|
|
END IF
|
|
*
|
|
* ==== End of IPARMQ ====
|
|
*
|
|
END
|