Annotation of rpl/lapack/lapack/iparmq.f, revision 1.7
1.1 bertrand 1: INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
2: *
3: * -- LAPACK auxiliary routine (version 3.2) --
4: * -- LAPACK is a software package provided by Univ. of Tennessee, --
5: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
6: * November 2006
7: *
8: * .. Scalar Arguments ..
9: INTEGER IHI, ILO, ISPEC, LWORK, N
10: CHARACTER NAME*( * ), OPTS*( * )
11: *
12: * Purpose
13: * =======
14: *
15: * This program sets problem and machine dependent parameters
16: * useful for xHSEQR and its subroutines. It is called whenever
17: * ILAENV is called with 12 <= ISPEC <= 16
18: *
19: * Arguments
20: * =========
21: *
22: * ISPEC (input) integer scalar
23: * ISPEC specifies which tunable parameter IPARMQ should
24: * return.
25: *
26: * ISPEC=12: (INMIN) Matrices of order nmin or less
27: * are sent directly to xLAHQR, the implicit
28: * double shift QR algorithm. NMIN must be
29: * at least 11.
30: *
31: * ISPEC=13: (INWIN) Size of the deflation window.
32: * This is best set greater than or equal to
33: * the number of simultaneous shifts NS.
34: * Larger matrices benefit from larger deflation
35: * windows.
36: *
37: * ISPEC=14: (INIBL) Determines when to stop nibbling and
38: * invest in an (expensive) multi-shift QR sweep.
39: * If the aggressive early deflation subroutine
40: * finds LD converged eigenvalues from an order
41: * NW deflation window and LD.GT.(NW*NIBBLE)/100,
42: * then the next QR sweep is skipped and early
43: * deflation is applied immediately to the
44: * remaining active diagonal block. Setting
45: * IPARMQ(ISPEC=14) = 0 causes TTQRE to skip a
46: * multi-shift QR sweep whenever early deflation
47: * finds a converged eigenvalue. Setting
48: * IPARMQ(ISPEC=14) greater than or equal to 100
49: * prevents TTQRE from skipping a multi-shift
50: * QR sweep.
51: *
52: * ISPEC=15: (NSHFTS) The number of simultaneous shifts in
53: * a multi-shift QR iteration.
54: *
55: * ISPEC=16: (IACC22) IPARMQ is set to 0, 1 or 2 with the
56: * following meanings.
57: * 0: During the multi-shift QR sweep,
58: * xLAQR5 does not accumulate reflections and
59: * does not use matrix-matrix multiply to
60: * update the far-from-diagonal matrix
61: * entries.
62: * 1: During the multi-shift QR sweep,
63: * xLAQR5 and/or xLAQRaccumulates reflections and uses
64: * matrix-matrix multiply to update the
65: * far-from-diagonal matrix entries.
66: * 2: During the multi-shift QR sweep.
67: * xLAQR5 accumulates reflections and takes
68: * advantage of 2-by-2 block structure during
69: * matrix-matrix multiplies.
70: * (If xTRMM is slower than xGEMM, then
71: * IPARMQ(ISPEC=16)=1 may be more efficient than
72: * IPARMQ(ISPEC=16)=2 despite the greater level of
73: * arithmetic work implied by the latter choice.)
74: *
75: * NAME (input) character string
76: * Name of the calling subroutine
77: *
78: * OPTS (input) character string
79: * This is a concatenation of the string arguments to
80: * TTQRE.
81: *
82: * N (input) integer scalar
83: * N is the order of the Hessenberg matrix H.
84: *
85: * ILO (input) INTEGER
86: * IHI (input) INTEGER
87: * It is assumed that H is already upper triangular
88: * in rows and columns 1:ILO-1 and IHI+1:N.
89: *
90: * LWORK (input) integer scalar
91: * The amount of workspace available.
92: *
93: * Further Details
94: * ===============
95: *
96: * Little is known about how best to choose these parameters.
97: * It is possible to use different values of the parameters
98: * for each of CHSEQR, DHSEQR, SHSEQR and ZHSEQR.
99: *
100: * It is probably best to choose different parameters for
101: * different matrices and different parameters at different
102: * times during the iteration, but this has not been
103: * implemented --- yet.
104: *
105: *
106: * The best choices of most of the parameters depend
107: * in an ill-understood way on the relative execution
108: * rate of xLAQR3 and xLAQR5 and on the nature of each
109: * particular eigenvalue problem. Experiment may be the
110: * only practical way to determine which choices are most
111: * effective.
112: *
113: * Following is a list of default values supplied by IPARMQ.
114: * These defaults may be adjusted in order to attain better
115: * performance in any particular computational environment.
116: *
117: * IPARMQ(ISPEC=12) The xLAHQR vs xLAQR0 crossover point.
118: * Default: 75. (Must be at least 11.)
119: *
120: * IPARMQ(ISPEC=13) Recommended deflation window size.
121: * This depends on ILO, IHI and NS, the
122: * number of simultaneous shifts returned
123: * by IPARMQ(ISPEC=15). The default for
124: * (IHI-ILO+1).LE.500 is NS. The default
125: * for (IHI-ILO+1).GT.500 is 3*NS/2.
126: *
127: * IPARMQ(ISPEC=14) Nibble crossover point. Default: 14.
128: *
129: * IPARMQ(ISPEC=15) Number of simultaneous shifts, NS.
130: * a multi-shift QR iteration.
131: *
132: * If IHI-ILO+1 is ...
133: *
134: * greater than ...but less ... the
135: * or equal to ... than default is
136: *
137: * 0 30 NS = 2+
138: * 30 60 NS = 4+
139: * 60 150 NS = 10
140: * 150 590 NS = **
141: * 590 3000 NS = 64
142: * 3000 6000 NS = 128
143: * 6000 infinity NS = 256
144: *
145: * (+) By default matrices of this order are
146: * passed to the implicit double shift routine
147: * xLAHQR. See IPARMQ(ISPEC=12) above. These
148: * values of NS are used only in case of a rare
149: * xLAHQR failure.
150: *
151: * (**) The asterisks (**) indicate an ad-hoc
152: * function increasing from 10 to 64.
153: *
154: * IPARMQ(ISPEC=16) Select structured matrix multiply.
155: * (See ISPEC=16 above for details.)
156: * Default: 3.
157: *
158: * ================================================================
159: * .. Parameters ..
160: INTEGER INMIN, INWIN, INIBL, ISHFTS, IACC22
161: PARAMETER ( INMIN = 12, INWIN = 13, INIBL = 14,
162: $ ISHFTS = 15, IACC22 = 16 )
163: INTEGER NMIN, K22MIN, KACMIN, NIBBLE, KNWSWP
164: PARAMETER ( NMIN = 75, K22MIN = 14, KACMIN = 14,
165: $ NIBBLE = 14, KNWSWP = 500 )
166: REAL TWO
167: PARAMETER ( TWO = 2.0 )
168: * ..
169: * .. Local Scalars ..
170: INTEGER NH, NS
171: * ..
172: * .. Intrinsic Functions ..
173: INTRINSIC LOG, MAX, MOD, NINT, REAL
174: * ..
175: * .. Executable Statements ..
176: IF( ( ISPEC.EQ.ISHFTS ) .OR. ( ISPEC.EQ.INWIN ) .OR.
177: $ ( ISPEC.EQ.IACC22 ) ) THEN
178: *
179: * ==== Set the number simultaneous shifts ====
180: *
181: NH = IHI - ILO + 1
182: NS = 2
183: IF( NH.GE.30 )
184: $ NS = 4
185: IF( NH.GE.60 )
186: $ NS = 10
187: IF( NH.GE.150 )
188: $ NS = MAX( 10, NH / NINT( LOG( REAL( NH ) ) / LOG( TWO ) ) )
189: IF( NH.GE.590 )
190: $ NS = 64
191: IF( NH.GE.3000 )
192: $ NS = 128
193: IF( NH.GE.6000 )
194: $ NS = 256
195: NS = MAX( 2, NS-MOD( NS, 2 ) )
196: END IF
197: *
198: IF( ISPEC.EQ.INMIN ) THEN
199: *
200: *
201: * ===== Matrices of order smaller than NMIN get sent
202: * . to xLAHQR, the classic double shift algorithm.
203: * . This must be at least 11. ====
204: *
205: IPARMQ = NMIN
206: *
207: ELSE IF( ISPEC.EQ.INIBL ) THEN
208: *
209: * ==== INIBL: skip a multi-shift qr iteration and
210: * . whenever aggressive early deflation finds
211: * . at least (NIBBLE*(window size)/100) deflations. ====
212: *
213: IPARMQ = NIBBLE
214: *
215: ELSE IF( ISPEC.EQ.ISHFTS ) THEN
216: *
217: * ==== NSHFTS: The number of simultaneous shifts =====
218: *
219: IPARMQ = NS
220: *
221: ELSE IF( ISPEC.EQ.INWIN ) THEN
222: *
223: * ==== NW: deflation window size. ====
224: *
225: IF( NH.LE.KNWSWP ) THEN
226: IPARMQ = NS
227: ELSE
228: IPARMQ = 3*NS / 2
229: END IF
230: *
231: ELSE IF( ISPEC.EQ.IACC22 ) THEN
232: *
233: * ==== IACC22: Whether to accumulate reflections
234: * . before updating the far-from-diagonal elements
235: * . and whether to use 2-by-2 block structure while
236: * . doing it. A small amount of work could be saved
237: * . by making this choice dependent also upon the
238: * . NH=IHI-ILO+1.
239: *
240: IPARMQ = 0
241: IF( NS.GE.KACMIN )
242: $ IPARMQ = 1
243: IF( NS.GE.K22MIN )
244: $ IPARMQ = 2
245: *
246: ELSE
247: * ===== invalid value of ispec =====
248: IPARMQ = -1
249: *
250: END IF
251: *
252: * ==== End of IPARMQ ====
253: *
254: END
CVSweb interface <joel.bertrand@systella.fr>