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