forked from lijiext/lammps
255 lines
9.7 KiB
FortranFixed
255 lines
9.7 KiB
FortranFixed
|
INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
|
||
|
*
|
||
|
* -- LAPACK auxiliary routine (version 3.2) --
|
||
|
* -- LAPACK is a software package provided by Univ. of Tennessee, --
|
||
|
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
|
||
|
* November 2006
|
||
|
*
|
||
|
* .. Scalar Arguments ..
|
||
|
INTEGER IHI, ILO, ISPEC, LWORK, N
|
||
|
CHARACTER NAME*( * ), OPTS*( * )
|
||
|
*
|
||
|
* Purpose
|
||
|
* =======
|
||
|
*
|
||
|
* This program sets problem and machine dependent parameters
|
||
|
* useful for xHSEQR and its subroutines. It is called whenever
|
||
|
* ILAENV is called with 12 <= ISPEC <= 16
|
||
|
*
|
||
|
* Arguments
|
||
|
* =========
|
||
|
*
|
||
|
* ISPEC (input) integer scalar
|
||
|
* 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 sweep,
|
||
|
* xLAQR5 does not accumulate reflections and
|
||
|
* does not use matrix-matrix multiply to
|
||
|
* update the far-from-diagonal matrix
|
||
|
* entries.
|
||
|
* 1: During the multi-shift QR sweep,
|
||
|
* xLAQR5 and/or xLAQRaccumulates reflections and uses
|
||
|
* matrix-matrix multiply to update the
|
||
|
* far-from-diagonal matrix entries.
|
||
|
* 2: During the multi-shift QR sweep.
|
||
|
* xLAQR5 accumulates reflections and takes
|
||
|
* advantage of 2-by-2 block structure 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.)
|
||
|
*
|
||
|
* NAME (input) character string
|
||
|
* Name of the calling subroutine
|
||
|
*
|
||
|
* OPTS (input) character string
|
||
|
* This is a concatenation of the string arguments to
|
||
|
* TTQRE.
|
||
|
*
|
||
|
* N (input) integer scalar
|
||
|
* N is the order of the Hessenberg matrix H.
|
||
|
*
|
||
|
* ILO (input) INTEGER
|
||
|
* IHI (input) INTEGER
|
||
|
* It is assumed that H is already upper triangular
|
||
|
* in rows and columns 1:ILO-1 and IHI+1:N.
|
||
|
*
|
||
|
* LWORK (input) integer scalar
|
||
|
* The amount of workspace available.
|
||
|
*
|
||
|
* Further Details
|
||
|
* ===============
|
||
|
*
|
||
|
* 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.
|
||
|
*
|
||
|
* ================================================================
|
||
|
* .. 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
|
||
|
* ..
|
||
|
* .. 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.
|
||
|
*
|
||
|
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
|