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