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