LAPACK  3.9.1
LAPACK: Linear Algebra PACKage
iparmq.f
Go to the documentation of this file.
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 related subroutines for eigenvalue
35 *> problems. It is called whenever
36 *> IPARMQ is called with 12 <= ISPEC <= 16
37 *> \endverbatim
38 *
39 * Arguments:
40 * ==========
41 *
42 *> \param[in] ISPEC
43 *> \verbatim
44 *> ISPEC is INTEGER
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 > (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.
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
84 *> far-from-diagonal matrix entries.
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.
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
120 *> N is INTEGER
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
138 *> LWORK is INTEGER
139 *> The amount of workspace available.
140 *> \endverbatim
141 *
142 * Authors:
143 * ========
144 *
145 *> \author Univ. of Tennessee
146 *> \author Univ. of California Berkeley
147 *> \author Univ. of Colorado Denver
148 *> \author NAG Ltd.
149 *
150 *> \ingroup OTHERauxiliary
151 *
152 *> \par Further Details:
153 * =====================
154 *>
155 *> \verbatim
156 *>
157 *> Little is known about how best to choose these parameters.
158 *> It is possible to use different values of the parameters
159 *> for each of CHSEQR, DHSEQR, SHSEQR and ZHSEQR.
160 *>
161 *> It is probably best to choose different parameters for
162 *> different matrices and different parameters at different
163 *> times during the iteration, but this has not been
164 *> implemented --- yet.
165 *>
166 *>
167 *> The best choices of most of the parameters depend
168 *> in an ill-understood way on the relative execution
169 *> rate of xLAQR3 and xLAQR5 and on the nature of each
170 *> particular eigenvalue problem. Experiment may be the
171 *> only practical way to determine which choices are most
172 *> effective.
173 *>
174 *> Following is a list of default values supplied by IPARMQ.
175 *> These defaults may be adjusted in order to attain better
176 *> performance in any particular computational environment.
177 *>
178 *> IPARMQ(ISPEC=12) The xLAHQR vs xLAQR0 crossover point.
179 *> Default: 75. (Must be at least 11.)
180 *>
181 *> IPARMQ(ISPEC=13) Recommended deflation window size.
182 *> This depends on ILO, IHI and NS, the
183 *> number of simultaneous shifts returned
184 *> by IPARMQ(ISPEC=15). The default for
185 *> (IHI-ILO+1) <= 500 is NS. The default
186 *> for (IHI-ILO+1) > 500 is 3*NS/2.
187 *>
188 *> IPARMQ(ISPEC=14) Nibble crossover point. Default: 14.
189 *>
190 *> IPARMQ(ISPEC=15) Number of simultaneous shifts, NS.
191 *> a multi-shift QR iteration.
192 *>
193 *> If IHI-ILO+1 is ...
194 *>
195 *> greater than ...but less ... the
196 *> or equal to ... than default is
197 *>
198 *> 0 30 NS = 2+
199 *> 30 60 NS = 4+
200 *> 60 150 NS = 10
201 *> 150 590 NS = **
202 *> 590 3000 NS = 64
203 *> 3000 6000 NS = 128
204 *> 6000 infinity NS = 256
205 *>
206 *> (+) By default matrices of this order are
207 *> passed to the implicit double shift routine
208 *> xLAHQR. See IPARMQ(ISPEC=12) above. These
209 *> values of NS are used only in case of a rare
210 *> xLAHQR failure.
211 *>
212 *> (**) The asterisks (**) indicate an ad-hoc
213 *> function increasing from 10 to 64.
214 *>
215 *> IPARMQ(ISPEC=16) Select structured matrix multiply.
216 *> (See ISPEC=16 above for details.)
217 *> Default: 3.
218 *> \endverbatim
219 *>
220 * =====================================================================
221  INTEGER FUNCTION iparmq( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK )
222 *
223 * -- LAPACK auxiliary routine --
224 * -- LAPACK is a software package provided by Univ. of Tennessee, --
225 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
226 *
227 * .. Scalar Arguments ..
228  INTEGER ihi, ilo, ispec, lwork, n
229  CHARACTER name*( * ), opts*( * )
230 *
231 * ================================================================
232 * .. Parameters ..
233  INTEGER inmin, inwin, inibl, ishfts, iacc22
234  parameter( inmin = 12, inwin = 13, inibl = 14,
235  $ ishfts = 15, iacc22 = 16 )
236  INTEGER nmin, k22min, kacmin, nibble, knwswp
237  parameter( nmin = 75, k22min = 14, kacmin = 14,
238  $ nibble = 14, knwswp = 500 )
239  REAL two
240  parameter( two = 2.0 )
241 * ..
242 * .. Local Scalars ..
243  INTEGER nh, ns
244  INTEGER i, ic, iz
245  CHARACTER subnam*6
246 * ..
247 * .. Intrinsic Functions ..
248  INTRINSIC log, max, mod, nint, real
249 * ..
250 * .. Executable Statements ..
251  IF( ( ispec.EQ.ishfts ) .OR. ( ispec.EQ.inwin ) .OR.
252  $ ( ispec.EQ.iacc22 ) ) THEN
253 *
254 * ==== Set the number simultaneous shifts ====
255 *
256  nh = ihi - ilo + 1
257  ns = 2
258  IF( nh.GE.30 )
259  $ ns = 4
260  IF( nh.GE.60 )
261  $ ns = 10
262  IF( nh.GE.150 )
263  $ ns = max( 10, nh / nint( log( real( nh ) ) / log( two ) ) )
264  IF( nh.GE.590 )
265  $ ns = 64
266  IF( nh.GE.3000 )
267  $ ns = 128
268  IF( nh.GE.6000 )
269  $ ns = 256
270  ns = max( 2, ns-mod( ns, 2 ) )
271  END IF
272 *
273  IF( ispec.EQ.inmin ) THEN
274 *
275 *
276 * ===== Matrices of order smaller than NMIN get sent
277 * . to xLAHQR, the classic double shift algorithm.
278 * . This must be at least 11. ====
279 *
280  iparmq = nmin
281 *
282  ELSE IF( ispec.EQ.inibl ) THEN
283 *
284 * ==== INIBL: skip a multi-shift qr iteration and
285 * . whenever aggressive early deflation finds
286 * . at least (NIBBLE*(window size)/100) deflations. ====
287 *
288  iparmq = nibble
289 *
290  ELSE IF( ispec.EQ.ishfts ) THEN
291 *
292 * ==== NSHFTS: The number of simultaneous shifts =====
293 *
294  iparmq = ns
295 *
296  ELSE IF( ispec.EQ.inwin ) THEN
297 *
298 * ==== NW: deflation window size. ====
299 *
300  IF( nh.LE.knwswp ) THEN
301  iparmq = ns
302  ELSE
303  iparmq = 3*ns / 2
304  END IF
305 *
306  ELSE IF( ispec.EQ.iacc22 ) THEN
307 *
308 * ==== IACC22: Whether to accumulate reflections
309 * . before updating the far-from-diagonal elements
310 * . and whether to use 2-by-2 block structure while
311 * . doing it. A small amount of work could be saved
312 * . by making this choice dependent also upon the
313 * . NH=IHI-ILO+1.
314 *
315 *
316 * Convert NAME to upper case if the first character is lower case.
317 *
318  iparmq = 0
319  subnam = name
320  ic = ichar( subnam( 1: 1 ) )
321  iz = ichar( 'Z' )
322  IF( iz.EQ.90 .OR. iz.EQ.122 ) THEN
323 *
324 * ASCII character set
325 *
326  IF( ic.GE.97 .AND. ic.LE.122 ) THEN
327  subnam( 1: 1 ) = char( ic-32 )
328  DO i = 2, 6
329  ic = ichar( subnam( i: i ) )
330  IF( ic.GE.97 .AND. ic.LE.122 )
331  $ subnam( i: i ) = char( ic-32 )
332  END DO
333  END IF
334 *
335  ELSE IF( iz.EQ.233 .OR. iz.EQ.169 ) THEN
336 *
337 * EBCDIC character set
338 *
339  IF( ( ic.GE.129 .AND. ic.LE.137 ) .OR.
340  $ ( ic.GE.145 .AND. ic.LE.153 ) .OR.
341  $ ( ic.GE.162 .AND. ic.LE.169 ) ) THEN
342  subnam( 1: 1 ) = char( ic+64 )
343  DO i = 2, 6
344  ic = ichar( subnam( i: i ) )
345  IF( ( ic.GE.129 .AND. ic.LE.137 ) .OR.
346  $ ( ic.GE.145 .AND. ic.LE.153 ) .OR.
347  $ ( ic.GE.162 .AND. ic.LE.169 ) )subnam( i:
348  $ i ) = char( ic+64 )
349  END DO
350  END IF
351 *
352  ELSE IF( iz.EQ.218 .OR. iz.EQ.250 ) THEN
353 *
354 * Prime machines: ASCII+128
355 *
356  IF( ic.GE.225 .AND. ic.LE.250 ) THEN
357  subnam( 1: 1 ) = char( ic-32 )
358  DO i = 2, 6
359  ic = ichar( subnam( i: i ) )
360  IF( ic.GE.225 .AND. ic.LE.250 )
361  $ subnam( i: i ) = char( ic-32 )
362  END DO
363  END IF
364  END IF
365 *
366  IF( subnam( 2:6 ).EQ.'GGHRD' .OR.
367  $ subnam( 2:6 ).EQ.'GGHD3' ) THEN
368  iparmq = 1
369  IF( nh.GE.k22min )
370  $ iparmq = 2
371  ELSE IF ( subnam( 4:6 ).EQ.'EXC' ) THEN
372  IF( nh.GE.kacmin )
373  $ iparmq = 1
374  IF( nh.GE.k22min )
375  $ iparmq = 2
376  ELSE IF ( subnam( 2:6 ).EQ.'HSEQR' .OR.
377  $ subnam( 2:5 ).EQ.'LAQR' ) THEN
378  IF( ns.GE.kacmin )
379  $ iparmq = 1
380  IF( ns.GE.k22min )
381  $ iparmq = 2
382  END IF
383 *
384  ELSE
385 * ===== invalid value of ispec =====
386  iparmq = -1
387 *
388  END IF
389 *
390 * ==== End of IPARMQ ====
391 *
392  END
integer function iparmq(ISPEC, NAME, OPTS, N, ILO, IHI, LWORK)
IPARMQ
Definition: iparmq.f:222