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