3
4
5
6
7
8
9
10 LOGICAL WANTT, WANTZ
11 INTEGER IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, N
12
13
14 COMPLEX*16 H( LDH, * ), W( * ), Z( LDZ, * )
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 COMPLEX*16 ZERO
99 parameter( zero = ( 0.0d+0, 0.0d+0 ) )
100 DOUBLE PRECISION RZERO, RONE
101 parameter( rzero = 0.0d+0, rone = 1.0d+0 )
102 DOUBLE PRECISION DAT1, DAT2
103 parameter( dat1 = 0.75d+0, dat2 = -0.4375d+0 )
104
105
106 INTEGER I, I1, I2, ITN, ITS, J, K, L, M, NH, NR, NZ
107 DOUBLE PRECISION CS, OVFL, S, SMLNUM, TST1, ULP, UNFL
108 COMPLEX*16 CDUM, H00, H10, H11, H12, H21, H22, H33, H33S,
109 $ H43H34, H44, H44S, SN, SUM, T1, T2, T3, V1, V2,
110 $ V3
111
112
113 DOUBLE PRECISION RWORK( 1 )
114 COMPLEX*16 V( 3 )
115
116
117 DOUBLE PRECISION DLAMCH, ZLANHS
119
120
121 EXTERNAL dlabad, zcopy,
zlanv2, zlarfg, zrot
122
123
124 INTRINSIC abs, dble, dconjg, dimag,
max,
min
125
126
127 DOUBLE PRECISION CABS1
128
129
130 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
131
132
133
134 info = 0
135
136
137
138 IF( n.EQ.0 )
139 $ RETURN
140 IF( ilo.EQ.ihi ) THEN
141 w( ilo ) = h( ilo, ilo )
142 RETURN
143 END IF
144
145 nh = ihi - ilo + 1
146 nz = ihiz - iloz + 1
147
148
149
150
151 unfl =
dlamch(
'Safe minimum' )
152 ovfl = rone / unfl
153 CALL dlabad( unfl, ovfl )
154 ulp =
dlamch(
'Precision' )
155 smlnum = unfl*( nh / ulp )
156
157
158
159
160
161 IF( wantt ) THEN
162 i1 = 1
163 i2 = n
164 END IF
165
166
167
168 itn = 30*nh
169
170
171
172
173
174
175
176 i = ihi
177 10 CONTINUE
178 l = ilo
179 IF( i.LT.ilo )
180 $ GO TO 150
181
182
183
184
185
186 DO 130 its = 0, itn
187
188
189
190 DO 20 k = i, l + 1, -1
191 tst1 = cabs1( h( k-1, k-1 ) ) + cabs1( h( k, k ) )
192 IF( tst1.EQ.rzero )
193 $ tst1 = zlanhs( '1', i-l+1, h( l, l ), ldh, rwork )
194 IF( cabs1( h( k, k-1 ) ).LE.
max( ulp*tst1, smlnum ) )
195 $ GO TO 30
196 20 CONTINUE
197 30 CONTINUE
198 l = k
199 IF( l.GT.ilo ) THEN
200
201
202
203 h( l, l-1 ) = zero
204 END IF
205
206
207
208 IF( l.GE.i-1 )
209 $ GO TO 140
210
211
212
213
214
215 IF( .NOT.wantt ) THEN
216 i1 = l
217 i2 = i
218 END IF
219
220 IF( its.EQ.10 .OR. its.EQ.20 ) THEN
221
222
223
224
225 s = cabs1( h( i, i-1 ) ) + cabs1( h( i-1, i-2 ) )
226 h44 = dat1*s
227 h33 = h44
228 h43h34 = dat2*s*s
229 ELSE
230
231
232
233 h44 = h( i, i )
234 h33 = h( i-1, i-1 )
235 h43h34 = h( i, i-1 )*h( i-1, i )
236 END IF
237
238
239
240 DO 40 m = i - 2, l, -1
241
242
243
244
245
246 h11 = h( m, m )
247 h22 = h( m+1, m+1 )
248 h21 = h( m+1, m )
249 h12 = h( m, m+1 )
250 h44s = h44 - h11
251 h33s = h33 - h11
252 v1 = ( h33s*h44s-h43h34 ) / h21 + h12
253 v2 = h22 - h11 - h33s - h44s
254 v3 = h( m+2, m+1 )
255 s = cabs1( v1 ) + cabs1( v2 ) + abs( v3 )
256 v1 = v1 / s
257 v2 = v2 / s
258 v3 = v3 / s
259 v( 1 ) = v1
260 v( 2 ) = v2
261 v( 3 ) = v3
262 IF( m.EQ.l )
263 $ GO TO 50
264 h00 = h( m-1, m-1 )
265 h10 = h( m, m-1 )
266 tst1 = cabs1( v1 )*( cabs1( h00 )+cabs1( h11 )+
267 $ cabs1( h22 ) )
268 IF( cabs1( h10 )*( cabs1( v2 )+cabs1( v3 ) ).LE.ulp*tst1 )
269 $ GO TO 50
270 40 CONTINUE
271 50 CONTINUE
272
273
274
275 DO 120 k = m, i - 1
276
277
278
279
280
281
282
283
284
285
287 IF( k.GT.m )
288 $ CALL zcopy( nr, h( k, k-1 ), 1, v, 1 )
289 CALL zlarfg( nr, v( 1 ), v( 2 ), 1, t1 )
290 IF( k.GT.m ) THEN
291 h( k, k-1 ) = v( 1 )
292 h( k+1, k-1 ) = zero
293 IF( k.LT.i-1 )
294 $ h( k+2, k-1 ) = zero
295 ELSE IF( m.GT.l ) THEN
296
297
298 h( k, k-1 ) = h( k, k-1 ) - dconjg( t1 )*h( k, k-1 )
299 END IF
300 v2 = v( 2 )
301 t2 = t1*v2
302 IF( nr.EQ.3 ) THEN
303 v3 = v( 3 )
304 t3 = t1*v3
305
306
307
308
309 DO 60 j = k, i2
310 sum = dconjg( t1 )*h( k, j ) +
311 $ dconjg( t2 )*h( k+1, j ) +
312 $ dconjg( t3 )*h( k+2, j )
313 h( k, j ) = h( k, j ) - sum
314 h( k+1, j ) = h( k+1, j ) - sum*v2
315 h( k+2, j ) = h( k+2, j ) - sum*v3
316 60 CONTINUE
317
318
319
320
321 DO 70 j = i1,
min( k+3, i )
322 sum = t1*h( j, k ) + t2*h( j, k+1 ) + t3*h( j, k+2 )
323 h( j, k ) = h( j, k ) - sum
324 h( j, k+1 ) = h( j, k+1 ) - sum*dconjg( v2 )
325 h( j, k+2 ) = h( j, k+2 ) - sum*dconjg( v3 )
326 70 CONTINUE
327
328 IF( wantz ) THEN
329
330
331
332 DO 80 j = iloz, ihiz
333 sum = t1*z( j, k ) + t2*z( j, k+1 ) +
334 $ t3*z( j, k+2 )
335 z( j, k ) = z( j, k ) - sum
336 z( j, k+1 ) = z( j, k+1 ) - sum*dconjg( v2 )
337 z( j, k+2 ) = z( j, k+2 ) - sum*dconjg( v3 )
338 80 CONTINUE
339 END IF
340 ELSE IF( nr.EQ.2 ) THEN
341
342
343
344
345 DO 90 j = k, i2
346 sum = dconjg( t1 )*h( k, j ) +
347 $ dconjg( t2 )*h( k+1, j )
348 h( k, j ) = h( k, j ) - sum
349 h( k+1, j ) = h( k+1, j ) - sum*v2
350 90 CONTINUE
351
352
353
354
355 DO 100 j = i1,
min( k+2, i )
356 sum = t1*h( j, k ) + t2*h( j, k+1 )
357 h( j, k ) = h( j, k ) - sum
358 h( j, k+1 ) = h( j, k+1 ) - sum*dconjg( v2 )
359 100 CONTINUE
360
361 IF( wantz ) THEN
362
363
364
365 DO 110 j = iloz, ihiz
366 sum = t1*z( j, k ) + t2*z( j, k+1 )
367 z( j, k ) = z( j, k ) - sum
368 z( j, k+1 ) = z( j, k+1 ) - sum*dconjg( v2 )
369 110 CONTINUE
370 END IF
371 END IF
372
373
374
375
376
377
378
379
380
381
382
383 120 CONTINUE
384
385
386
387 130 CONTINUE
388
389
390
391 info = i
392 RETURN
393
394 140 CONTINUE
395
396 IF( l.EQ.i ) THEN
397
398
399
400 w( i ) = h( i, i )
401
402 ELSE IF( l.EQ.i-1 ) THEN
403
404
405
406
407
408
409 CALL zlanv2( h( i-1, i-1 ), h( i-1, i ), h( i, i-1 ),
410 $ h( i, i ), w( i-1 ), w( i ), cs, sn )
411
412 IF( wantt ) THEN
413
414
415
416 IF( i2.GT.i )
417 $ CALL zrot( i2-i, h( i-1, i+1 ), ldh, h( i, i+1 ), ldh,
418 $ cs, sn )
419 CALL zrot( i-i1-1, h( i1, i-1 ), 1, h( i1, i ), 1, cs,
420 $ dconjg( sn ) )
421 END IF
422 IF( wantz ) THEN
423
424
425
426 CALL zrot( nz, z( iloz, i-1 ), 1, z( iloz, i ), 1, cs,
427 $ dconjg( sn ) )
428 END IF
429
430 END IF
431
432
433
434
435 itn = itn - its
436 i = l - 1
437 GO TO 10
438
439 150 CONTINUE
440 RETURN
441
442
443
subroutine zlanv2(a, b, c, d, rt1, rt2, cs, sn)