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