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
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
subroutine dlarfg(n, alpha, x, incx, tau)
DLARFG generates an elementary reflector (Householder matrix).
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY