2
3
4
5
6
7
8
9 INTEGER JBLK, LDH, LDS, N, NBULGE
10 DOUBLE PRECISION ULP
11
12
13 COMPLEX*16 H( LDH, * ), S( LDS, * )
14
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 DOUBLE PRECISION RONE, TEN
79 parameter( rone = 1.0d+0, ten = 10.0d+0 )
80 COMPLEX*16 ZERO
81 parameter( zero = ( 0.0d+0, 0.0d+0 ) )
82
83
84 INTEGER I, IBULGE, IVAL, J, K, M, NR
85 DOUBLE PRECISION DVAL, S1, TST1
86 COMPLEX*16 CDUM, H00, H10, H11, H12, H21, H22, H33, H33S,
87 $ H43H34, H44, H44S, SUM, T1, T2, T3, V1, V2, V3
88
89
90 COMPLEX*16 V( 3 )
91
92
93 EXTERNAL zcopy, zlarfg
94
95
96 INTRINSIC abs, dble, dconjg, dimag,
max,
min
97
98
99 DOUBLE PRECISION CABS1
100
101
102 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
103
104
105
106 m = 2
107 DO 50 ibulge = 1, nbulge
108 h44 = s( 2*jblk-2*ibulge+2, 2*jblk-2*ibulge+2 )
109 h33 = s( 2*jblk-2*ibulge+1, 2*jblk-2*ibulge+1 )
110 h43h34 = s( 2*jblk-2*ibulge+1, 2*jblk-2*ibulge+2 )*
111 $ s( 2*jblk-2*ibulge+2, 2*jblk-2*ibulge+1 )
112 h11 = h( m, m )
113 h22 = h( m+1, m+1 )
114 h21 = h( m+1, m )
115 h12 = h( m, m+1 )
116 h44s = h44 - h11
117 h33s = h33 - h11
118 v1 = ( h33s*h44s-h43h34 ) / h21 + h12
119 v2 = h22 - h11 - h33s - h44s
120 v3 = h( m+2, m+1 )
121 s1 = cabs1( v1 ) + cabs1( v2 ) + cabs1( v3 )
122 v1 = v1 / s1
123 v2 = v2 / s1
124 v3 = v3 / s1
125 v( 1 ) = v1
126 v( 2 ) = v2
127 v( 3 ) = v3
128 h00 = h( m-1, m-1 )
129 h10 = h( m, m-1 )
130 tst1 = cabs1( v1 )*( cabs1( h00 )+cabs1( h11 )+cabs1( h22 ) )
131 IF( cabs1( h10 )*( cabs1( v2 )+cabs1( v3 ) ).GT.ulp*tst1 ) THEN
132
133 dval = ( cabs1( h10 )*( cabs1( v2 )+cabs1( v3 ) ) ) /
134 $ ( ulp*tst1 )
135 ival = ibulge
136 DO 10 i = ibulge + 1, nbulge
137 h44 = s( 2*jblk-2*i+2, 2*jblk-2*i+2 )
138 h33 = s( 2*jblk-2*i+1, 2*jblk-2*i+1 )
139 h43h34 = s( 2*jblk-2*i+1, 2*jblk-2*i+2 )*
140 $ s( 2*jblk-2*i+2, 2*jblk-2*i+1 )
141 h11 = h( m, m )
142 h22 = h( m+1, m+1 )
143 h21 = h( m+1, m )
144 h12 = h( m, m+1 )
145 h44s = h44 - h11
146 h33s = h33 - h11
147 v1 = ( h33s*h44s-h43h34 ) / h21 + h12
148 v2 = h22 - h11 - h33s - h44s
149 v3 = h( m+2, m+1 )
150 s1 = cabs1( v1 ) + cabs1( v2 ) + cabs1( v3 )
151 v1 = v1 / s1
152 v2 = v2 / s1
153 v3 = v3 / s1
154 v( 1 ) = v1
155 v( 2 ) = v2
156 v( 3 ) = v3
157 h00 = h( m-1, m-1 )
158 h10 = h( m, m-1 )
159 tst1 = cabs1( v1 )*( cabs1( h00 )+cabs1( h11 )+
160 $ cabs1( h22 ) )
161 IF( ( dval.GT.( cabs1( h10 )*( cabs1( v2 )+
162 $ cabs1( v3 ) ) ) / ( ulp*tst1 ) ) .AND.
163 $ ( dval.GT.rone ) ) THEN
164 dval = ( cabs1( h10 )*( cabs1( v2 )+cabs1( v3 ) ) ) /
165 $ ( ulp*tst1 )
166 ival = i
167 END IF
168 10 CONTINUE
169 IF( ( dval.LT.ten ) .AND. ( ival.NE.ibulge ) ) THEN
170 h44 = s( 2*jblk-2*ival+2, 2*jblk-2*ival+2 )
171 h33 = s( 2*jblk-2*ival+1, 2*jblk-2*ival+1 )
172 h43h34 = s( 2*jblk-2*ival+1, 2*jblk-2*ival+2 )
173 h10 = s( 2*jblk-2*ival+2, 2*jblk-2*ival+1 )
174 s( 2*jblk-2*ival+2, 2*jblk-2*ival+2 ) = s( 2*jblk-2*
175 $ ibulge+2, 2*jblk-2*ibulge+2 )
176 s( 2*jblk-2*ival+1, 2*jblk-2*ival+1 ) = s( 2*jblk-2*
177 $ ibulge+1, 2*jblk-2*ibulge+1 )
178 s( 2*jblk-2*ival+1, 2*jblk-2*ival+2 ) = s( 2*jblk-2*
179 $ ibulge+1, 2*jblk-2*ibulge+2 )
180 s( 2*jblk-2*ival+2, 2*jblk-2*ival+1 ) = s( 2*jblk-2*
181 $ ibulge+2, 2*jblk-2*ibulge+1 )
182 s( 2*jblk-2*ibulge+2, 2*jblk-2*ibulge+2 ) = h44
183 s( 2*jblk-2*ibulge+1, 2*jblk-2*ibulge+1 ) = h33
184 s( 2*jblk-2*ibulge+1, 2*jblk-2*ibulge+2 ) = h43h34
185 s( 2*jblk-2*ibulge+2, 2*jblk-2*ibulge+1 ) = h10
186 END IF
187 h44 = s( 2*jblk-2*ibulge+2, 2*jblk-2*ibulge+2 )
188 h33 = s( 2*jblk-2*ibulge+1, 2*jblk-2*ibulge+1 )
189 h43h34 = s( 2*jblk-2*ibulge+1, 2*jblk-2*ibulge+2 )*
190 $ s( 2*jblk-2*ibulge+2, 2*jblk-2*ibulge+1 )
191 h11 = h( m, m )
192 h22 = h( m+1, m+1 )
193 h21 = h( m+1, m )
194 h12 = h( m, m+1 )
195 h44s = h44 - h11
196 h33s = h33 - h11
197 v1 = ( h33s*h44s-h43h34 ) / h21 + h12
198 v2 = h22 - h11 - h33s - h44s
199 v3 = h( m+2, m+1 )
200 s1 = cabs1( v1 ) + cabs1( v2 ) + cabs1( v3 )
201 v1 = v1 / s1
202 v2 = v2 / s1
203 v3 = v3 / s1
204 v( 1 ) = v1
205 v( 2 ) = v2
206 v( 3 ) = v3
207 h00 = h( m-1, m-1 )
208 h10 = h( m, m-1 )
209 tst1 = cabs1( v1 )*( cabs1( h00 )+cabs1( h11 )+
210 $ cabs1( h22 ) )
211 END IF
212 IF( cabs1( h10 )*( cabs1( v2 )+cabs1( v3 ) ).GT.ten*ulp*tst1 )
213 $ THEN
214
215 nbulge =
max( ibulge-1, 1 )
216 RETURN
217 END IF
218 DO 40 k = m, n - 1
220 IF( k.GT.m )
221 $ CALL zcopy( nr, h( k, k-1 ), 1, v, 1 )
222 CALL zlarfg( nr, v( 1 ), v( 2 ), 1, t1 )
223 IF( k.GT.m ) THEN
224 h( k, k-1 ) = v( 1 )
225 h( k+1, k-1 ) = zero
226 IF( k.LT.n-1 )
227 $ h( k+2, k-1 ) = zero
228 ELSE
229
230
231 h( k, k-1 ) = h( k, k-1 ) - dconjg( t1 )*h( k, k-1 )
232 END IF
233 v2 = v( 2 )
234 t2 = t1*v2
235 IF( nr.EQ.3 ) THEN
236 v3 = v( 3 )
237 t3 = t1*v3
238 DO 20 j = k, n
239 sum = dconjg( t1 )*h( k, j ) +
240 $ dconjg( t2 )*h( k+1, j ) +
241 $ dconjg( t3 )*h( k+2, j )
242 h( k, j ) = h( k, j ) - sum
243 h( k+1, j ) = h( k+1, j ) - sum*v2
244 h( k+2, j ) = h( k+2, j ) - sum*v3
245 20 CONTINUE
246 DO 30 j = 1,
min( k+3, n )
247 sum = t1*h( j, k ) + t2*h( j, k+1 ) + t3*h( j, k+2 )
248 h( j, k ) = h( j, k ) - sum
249 h( j, k+1 ) = h( j, k+1 ) - sum*dconjg( v2 )
250 h( j, k+2 ) = h( j, k+2 ) - sum*dconjg( v3 )
251 30 CONTINUE
252 END IF
253 40 CONTINUE
254 50 CONTINUE
255
256 RETURN
257
258
259