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, , 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
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
subroutine zlarfg(n, alpha, x, incx, tau)
ZLARFG generates an elementary reflector (Householder matrix).
subroutine zcopy(n, zx, incx, zy, incy)
ZCOPY