root / src / lapack / double / dlasq4.f @ 1
Historique | Voir | Annoter | Télécharger (9,54 ko)
1 | 1 | equemene | SUBROUTINE DLASQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN, |
---|---|---|---|
2 | 1 | equemene | $ DN1, DN2, TAU, TTYPE, G ) |
3 | 1 | equemene | * |
4 | 1 | equemene | * -- LAPACK routine (version 3.2) -- |
5 | 1 | equemene | * |
6 | 1 | equemene | * -- Contributed by Osni Marques of the Lawrence Berkeley National -- |
7 | 1 | equemene | * -- Laboratory and Beresford Parlett of the Univ. of California at -- |
8 | 1 | equemene | * -- Berkeley -- |
9 | 1 | equemene | * -- November 2008 -- |
10 | 1 | equemene | * |
11 | 1 | equemene | * -- LAPACK is a software package provided by Univ. of Tennessee, -- |
12 | 1 | equemene | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
13 | 1 | equemene | * |
14 | 1 | equemene | * .. Scalar Arguments .. |
15 | 1 | equemene | INTEGER I0, N0, N0IN, PP, TTYPE |
16 | 1 | equemene | DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, TAU |
17 | 1 | equemene | * .. |
18 | 1 | equemene | * .. Array Arguments .. |
19 | 1 | equemene | DOUBLE PRECISION Z( * ) |
20 | 1 | equemene | * .. |
21 | 1 | equemene | * |
22 | 1 | equemene | * Purpose |
23 | 1 | equemene | * ======= |
24 | 1 | equemene | * |
25 | 1 | equemene | * DLASQ4 computes an approximation TAU to the smallest eigenvalue |
26 | 1 | equemene | * using values of d from the previous transform. |
27 | 1 | equemene | * |
28 | 1 | equemene | * I0 (input) INTEGER |
29 | 1 | equemene | * First index. |
30 | 1 | equemene | * |
31 | 1 | equemene | * N0 (input) INTEGER |
32 | 1 | equemene | * Last index. |
33 | 1 | equemene | * |
34 | 1 | equemene | * Z (input) DOUBLE PRECISION array, dimension ( 4*N ) |
35 | 1 | equemene | * Z holds the qd array. |
36 | 1 | equemene | * |
37 | 1 | equemene | * PP (input) INTEGER |
38 | 1 | equemene | * PP=0 for ping, PP=1 for pong. |
39 | 1 | equemene | * |
40 | 1 | equemene | * NOIN (input) INTEGER |
41 | 1 | equemene | * The value of N0 at start of EIGTEST. |
42 | 1 | equemene | * |
43 | 1 | equemene | * DMIN (input) DOUBLE PRECISION |
44 | 1 | equemene | * Minimum value of d. |
45 | 1 | equemene | * |
46 | 1 | equemene | * DMIN1 (input) DOUBLE PRECISION |
47 | 1 | equemene | * Minimum value of d, excluding D( N0 ). |
48 | 1 | equemene | * |
49 | 1 | equemene | * DMIN2 (input) DOUBLE PRECISION |
50 | 1 | equemene | * Minimum value of d, excluding D( N0 ) and D( N0-1 ). |
51 | 1 | equemene | * |
52 | 1 | equemene | * DN (input) DOUBLE PRECISION |
53 | 1 | equemene | * d(N) |
54 | 1 | equemene | * |
55 | 1 | equemene | * DN1 (input) DOUBLE PRECISION |
56 | 1 | equemene | * d(N-1) |
57 | 1 | equemene | * |
58 | 1 | equemene | * DN2 (input) DOUBLE PRECISION |
59 | 1 | equemene | * d(N-2) |
60 | 1 | equemene | * |
61 | 1 | equemene | * TAU (output) DOUBLE PRECISION |
62 | 1 | equemene | * This is the shift. |
63 | 1 | equemene | * |
64 | 1 | equemene | * TTYPE (output) INTEGER |
65 | 1 | equemene | * Shift type. |
66 | 1 | equemene | * |
67 | 1 | equemene | * G (input/output) REAL |
68 | 1 | equemene | * G is passed as an argument in order to save its value between |
69 | 1 | equemene | * calls to DLASQ4. |
70 | 1 | equemene | * |
71 | 1 | equemene | * Further Details |
72 | 1 | equemene | * =============== |
73 | 1 | equemene | * CNST1 = 9/16 |
74 | 1 | equemene | * |
75 | 1 | equemene | * ===================================================================== |
76 | 1 | equemene | * |
77 | 1 | equemene | * .. Parameters .. |
78 | 1 | equemene | DOUBLE PRECISION CNST1, CNST2, CNST3 |
79 | 1 | equemene | PARAMETER ( CNST1 = 0.5630D0, CNST2 = 1.010D0, |
80 | 1 | equemene | $ CNST3 = 1.050D0 ) |
81 | 1 | equemene | DOUBLE PRECISION QURTR, THIRD, HALF, ZERO, ONE, TWO, HUNDRD |
82 | 1 | equemene | PARAMETER ( QURTR = 0.250D0, THIRD = 0.3330D0, |
83 | 1 | equemene | $ HALF = 0.50D0, ZERO = 0.0D0, ONE = 1.0D0, |
84 | 1 | equemene | $ TWO = 2.0D0, HUNDRD = 100.0D0 ) |
85 | 1 | equemene | * .. |
86 | 1 | equemene | * .. Local Scalars .. |
87 | 1 | equemene | INTEGER I4, NN, NP |
88 | 1 | equemene | DOUBLE PRECISION A2, B1, B2, GAM, GAP1, GAP2, S |
89 | 1 | equemene | * .. |
90 | 1 | equemene | * .. Intrinsic Functions .. |
91 | 1 | equemene | INTRINSIC MAX, MIN, SQRT |
92 | 1 | equemene | * .. |
93 | 1 | equemene | * .. Executable Statements .. |
94 | 1 | equemene | * |
95 | 1 | equemene | * A negative DMIN forces the shift to take that absolute value |
96 | 1 | equemene | * TTYPE records the type of shift. |
97 | 1 | equemene | * |
98 | 1 | equemene | IF( DMIN.LE.ZERO ) THEN |
99 | 1 | equemene | TAU = -DMIN |
100 | 1 | equemene | TTYPE = -1 |
101 | 1 | equemene | RETURN |
102 | 1 | equemene | END IF |
103 | 1 | equemene | * |
104 | 1 | equemene | NN = 4*N0 + PP |
105 | 1 | equemene | IF( N0IN.EQ.N0 ) THEN |
106 | 1 | equemene | * |
107 | 1 | equemene | * No eigenvalues deflated. |
108 | 1 | equemene | * |
109 | 1 | equemene | IF( DMIN.EQ.DN .OR. DMIN.EQ.DN1 ) THEN |
110 | 1 | equemene | * |
111 | 1 | equemene | B1 = SQRT( Z( NN-3 ) )*SQRT( Z( NN-5 ) ) |
112 | 1 | equemene | B2 = SQRT( Z( NN-7 ) )*SQRT( Z( NN-9 ) ) |
113 | 1 | equemene | A2 = Z( NN-7 ) + Z( NN-5 ) |
114 | 1 | equemene | * |
115 | 1 | equemene | * Cases 2 and 3. |
116 | 1 | equemene | * |
117 | 1 | equemene | IF( DMIN.EQ.DN .AND. DMIN1.EQ.DN1 ) THEN |
118 | 1 | equemene | GAP2 = DMIN2 - A2 - DMIN2*QURTR |
119 | 1 | equemene | IF( GAP2.GT.ZERO .AND. GAP2.GT.B2 ) THEN |
120 | 1 | equemene | GAP1 = A2 - DN - ( B2 / GAP2 )*B2 |
121 | 1 | equemene | ELSE |
122 | 1 | equemene | GAP1 = A2 - DN - ( B1+B2 ) |
123 | 1 | equemene | END IF |
124 | 1 | equemene | IF( GAP1.GT.ZERO .AND. GAP1.GT.B1 ) THEN |
125 | 1 | equemene | S = MAX( DN-( B1 / GAP1 )*B1, HALF*DMIN ) |
126 | 1 | equemene | TTYPE = -2 |
127 | 1 | equemene | ELSE |
128 | 1 | equemene | S = ZERO |
129 | 1 | equemene | IF( DN.GT.B1 ) |
130 | 1 | equemene | $ S = DN - B1 |
131 | 1 | equemene | IF( A2.GT.( B1+B2 ) ) |
132 | 1 | equemene | $ S = MIN( S, A2-( B1+B2 ) ) |
133 | 1 | equemene | S = MAX( S, THIRD*DMIN ) |
134 | 1 | equemene | TTYPE = -3 |
135 | 1 | equemene | END IF |
136 | 1 | equemene | ELSE |
137 | 1 | equemene | * |
138 | 1 | equemene | * Case 4. |
139 | 1 | equemene | * |
140 | 1 | equemene | TTYPE = -4 |
141 | 1 | equemene | S = QURTR*DMIN |
142 | 1 | equemene | IF( DMIN.EQ.DN ) THEN |
143 | 1 | equemene | GAM = DN |
144 | 1 | equemene | A2 = ZERO |
145 | 1 | equemene | IF( Z( NN-5 ) .GT. Z( NN-7 ) ) |
146 | 1 | equemene | $ RETURN |
147 | 1 | equemene | B2 = Z( NN-5 ) / Z( NN-7 ) |
148 | 1 | equemene | NP = NN - 9 |
149 | 1 | equemene | ELSE |
150 | 1 | equemene | NP = NN - 2*PP |
151 | 1 | equemene | B2 = Z( NP-2 ) |
152 | 1 | equemene | GAM = DN1 |
153 | 1 | equemene | IF( Z( NP-4 ) .GT. Z( NP-2 ) ) |
154 | 1 | equemene | $ RETURN |
155 | 1 | equemene | A2 = Z( NP-4 ) / Z( NP-2 ) |
156 | 1 | equemene | IF( Z( NN-9 ) .GT. Z( NN-11 ) ) |
157 | 1 | equemene | $ RETURN |
158 | 1 | equemene | B2 = Z( NN-9 ) / Z( NN-11 ) |
159 | 1 | equemene | NP = NN - 13 |
160 | 1 | equemene | END IF |
161 | 1 | equemene | * |
162 | 1 | equemene | * Approximate contribution to norm squared from I < NN-1. |
163 | 1 | equemene | * |
164 | 1 | equemene | A2 = A2 + B2 |
165 | 1 | equemene | DO 10 I4 = NP, 4*I0 - 1 + PP, -4 |
166 | 1 | equemene | IF( B2.EQ.ZERO ) |
167 | 1 | equemene | $ GO TO 20 |
168 | 1 | equemene | B1 = B2 |
169 | 1 | equemene | IF( Z( I4 ) .GT. Z( I4-2 ) ) |
170 | 1 | equemene | $ RETURN |
171 | 1 | equemene | B2 = B2*( Z( I4 ) / Z( I4-2 ) ) |
172 | 1 | equemene | A2 = A2 + B2 |
173 | 1 | equemene | IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) |
174 | 1 | equemene | $ GO TO 20 |
175 | 1 | equemene | 10 CONTINUE |
176 | 1 | equemene | 20 CONTINUE |
177 | 1 | equemene | A2 = CNST3*A2 |
178 | 1 | equemene | * |
179 | 1 | equemene | * Rayleigh quotient residual bound. |
180 | 1 | equemene | * |
181 | 1 | equemene | IF( A2.LT.CNST1 ) |
182 | 1 | equemene | $ S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 ) |
183 | 1 | equemene | END IF |
184 | 1 | equemene | ELSE IF( DMIN.EQ.DN2 ) THEN |
185 | 1 | equemene | * |
186 | 1 | equemene | * Case 5. |
187 | 1 | equemene | * |
188 | 1 | equemene | TTYPE = -5 |
189 | 1 | equemene | S = QURTR*DMIN |
190 | 1 | equemene | * |
191 | 1 | equemene | * Compute contribution to norm squared from I > NN-2. |
192 | 1 | equemene | * |
193 | 1 | equemene | NP = NN - 2*PP |
194 | 1 | equemene | B1 = Z( NP-2 ) |
195 | 1 | equemene | B2 = Z( NP-6 ) |
196 | 1 | equemene | GAM = DN2 |
197 | 1 | equemene | IF( Z( NP-8 ).GT.B2 .OR. Z( NP-4 ).GT.B1 ) |
198 | 1 | equemene | $ RETURN |
199 | 1 | equemene | A2 = ( Z( NP-8 ) / B2 )*( ONE+Z( NP-4 ) / B1 ) |
200 | 1 | equemene | * |
201 | 1 | equemene | * Approximate contribution to norm squared from I < NN-2. |
202 | 1 | equemene | * |
203 | 1 | equemene | IF( N0-I0.GT.2 ) THEN |
204 | 1 | equemene | B2 = Z( NN-13 ) / Z( NN-15 ) |
205 | 1 | equemene | A2 = A2 + B2 |
206 | 1 | equemene | DO 30 I4 = NN - 17, 4*I0 - 1 + PP, -4 |
207 | 1 | equemene | IF( B2.EQ.ZERO ) |
208 | 1 | equemene | $ GO TO 40 |
209 | 1 | equemene | B1 = B2 |
210 | 1 | equemene | IF( Z( I4 ) .GT. Z( I4-2 ) ) |
211 | 1 | equemene | $ RETURN |
212 | 1 | equemene | B2 = B2*( Z( I4 ) / Z( I4-2 ) ) |
213 | 1 | equemene | A2 = A2 + B2 |
214 | 1 | equemene | IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) |
215 | 1 | equemene | $ GO TO 40 |
216 | 1 | equemene | 30 CONTINUE |
217 | 1 | equemene | 40 CONTINUE |
218 | 1 | equemene | A2 = CNST3*A2 |
219 | 1 | equemene | END IF |
220 | 1 | equemene | * |
221 | 1 | equemene | IF( A2.LT.CNST1 ) |
222 | 1 | equemene | $ S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 ) |
223 | 1 | equemene | ELSE |
224 | 1 | equemene | * |
225 | 1 | equemene | * Case 6, no information to guide us. |
226 | 1 | equemene | * |
227 | 1 | equemene | IF( TTYPE.EQ.-6 ) THEN |
228 | 1 | equemene | G = G + THIRD*( ONE-G ) |
229 | 1 | equemene | ELSE IF( TTYPE.EQ.-18 ) THEN |
230 | 1 | equemene | G = QURTR*THIRD |
231 | 1 | equemene | ELSE |
232 | 1 | equemene | G = QURTR |
233 | 1 | equemene | END IF |
234 | 1 | equemene | S = G*DMIN |
235 | 1 | equemene | TTYPE = -6 |
236 | 1 | equemene | END IF |
237 | 1 | equemene | * |
238 | 1 | equemene | ELSE IF( N0IN.EQ.( N0+1 ) ) THEN |
239 | 1 | equemene | * |
240 | 1 | equemene | * One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN. |
241 | 1 | equemene | * |
242 | 1 | equemene | IF( DMIN1.EQ.DN1 .AND. DMIN2.EQ.DN2 ) THEN |
243 | 1 | equemene | * |
244 | 1 | equemene | * Cases 7 and 8. |
245 | 1 | equemene | * |
246 | 1 | equemene | TTYPE = -7 |
247 | 1 | equemene | S = THIRD*DMIN1 |
248 | 1 | equemene | IF( Z( NN-5 ).GT.Z( NN-7 ) ) |
249 | 1 | equemene | $ RETURN |
250 | 1 | equemene | B1 = Z( NN-5 ) / Z( NN-7 ) |
251 | 1 | equemene | B2 = B1 |
252 | 1 | equemene | IF( B2.EQ.ZERO ) |
253 | 1 | equemene | $ GO TO 60 |
254 | 1 | equemene | DO 50 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4 |
255 | 1 | equemene | A2 = B1 |
256 | 1 | equemene | IF( Z( I4 ).GT.Z( I4-2 ) ) |
257 | 1 | equemene | $ RETURN |
258 | 1 | equemene | B1 = B1*( Z( I4 ) / Z( I4-2 ) ) |
259 | 1 | equemene | B2 = B2 + B1 |
260 | 1 | equemene | IF( HUNDRD*MAX( B1, A2 ).LT.B2 ) |
261 | 1 | equemene | $ GO TO 60 |
262 | 1 | equemene | 50 CONTINUE |
263 | 1 | equemene | 60 CONTINUE |
264 | 1 | equemene | B2 = SQRT( CNST3*B2 ) |
265 | 1 | equemene | A2 = DMIN1 / ( ONE+B2**2 ) |
266 | 1 | equemene | GAP2 = HALF*DMIN2 - A2 |
267 | 1 | equemene | IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN |
268 | 1 | equemene | S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) ) |
269 | 1 | equemene | ELSE |
270 | 1 | equemene | S = MAX( S, A2*( ONE-CNST2*B2 ) ) |
271 | 1 | equemene | TTYPE = -8 |
272 | 1 | equemene | END IF |
273 | 1 | equemene | ELSE |
274 | 1 | equemene | * |
275 | 1 | equemene | * Case 9. |
276 | 1 | equemene | * |
277 | 1 | equemene | S = QURTR*DMIN1 |
278 | 1 | equemene | IF( DMIN1.EQ.DN1 ) |
279 | 1 | equemene | $ S = HALF*DMIN1 |
280 | 1 | equemene | TTYPE = -9 |
281 | 1 | equemene | END IF |
282 | 1 | equemene | * |
283 | 1 | equemene | ELSE IF( N0IN.EQ.( N0+2 ) ) THEN |
284 | 1 | equemene | * |
285 | 1 | equemene | * Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN. |
286 | 1 | equemene | * |
287 | 1 | equemene | * Cases 10 and 11. |
288 | 1 | equemene | * |
289 | 1 | equemene | IF( DMIN2.EQ.DN2 .AND. TWO*Z( NN-5 ).LT.Z( NN-7 ) ) THEN |
290 | 1 | equemene | TTYPE = -10 |
291 | 1 | equemene | S = THIRD*DMIN2 |
292 | 1 | equemene | IF( Z( NN-5 ).GT.Z( NN-7 ) ) |
293 | 1 | equemene | $ RETURN |
294 | 1 | equemene | B1 = Z( NN-5 ) / Z( NN-7 ) |
295 | 1 | equemene | B2 = B1 |
296 | 1 | equemene | IF( B2.EQ.ZERO ) |
297 | 1 | equemene | $ GO TO 80 |
298 | 1 | equemene | DO 70 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4 |
299 | 1 | equemene | IF( Z( I4 ).GT.Z( I4-2 ) ) |
300 | 1 | equemene | $ RETURN |
301 | 1 | equemene | B1 = B1*( Z( I4 ) / Z( I4-2 ) ) |
302 | 1 | equemene | B2 = B2 + B1 |
303 | 1 | equemene | IF( HUNDRD*B1.LT.B2 ) |
304 | 1 | equemene | $ GO TO 80 |
305 | 1 | equemene | 70 CONTINUE |
306 | 1 | equemene | 80 CONTINUE |
307 | 1 | equemene | B2 = SQRT( CNST3*B2 ) |
308 | 1 | equemene | A2 = DMIN2 / ( ONE+B2**2 ) |
309 | 1 | equemene | GAP2 = Z( NN-7 ) + Z( NN-9 ) - |
310 | 1 | equemene | $ SQRT( Z( NN-11 ) )*SQRT( Z( NN-9 ) ) - A2 |
311 | 1 | equemene | IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN |
312 | 1 | equemene | S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) ) |
313 | 1 | equemene | ELSE |
314 | 1 | equemene | S = MAX( S, A2*( ONE-CNST2*B2 ) ) |
315 | 1 | equemene | END IF |
316 | 1 | equemene | ELSE |
317 | 1 | equemene | S = QURTR*DMIN2 |
318 | 1 | equemene | TTYPE = -11 |
319 | 1 | equemene | END IF |
320 | 1 | equemene | ELSE IF( N0IN.GT.( N0+2 ) ) THEN |
321 | 1 | equemene | * |
322 | 1 | equemene | * Case 12, more than two eigenvalues deflated. No information. |
323 | 1 | equemene | * |
324 | 1 | equemene | S = ZERO |
325 | 1 | equemene | TTYPE = -12 |
326 | 1 | equemene | END IF |
327 | 1 | equemene | * |
328 | 1 | equemene | TAU = S |
329 | 1 | equemene | RETURN |
330 | 1 | equemene | * |
331 | 1 | equemene | * End of DLASQ4 |
332 | 1 | equemene | * |
333 | 1 | equemene | END |