]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 1 | * |
2 | * $Id$ | |
3 | * | |
4 | * $Log$ | |
5 | * Revision 1.1.1.1 1996/04/01 15:02:35 mclareni | |
6 | * Mathlib gen | |
7 | * | |
8 | * | |
9 | #include "gen/pilot.h" | |
10 | SUBROUTINE HQR2(NM,N,LOW,IGH,H,WR,WI,Z,IERR) | |
11 | INTEGER I,J,K,L,M,N,EN,II,JJ,LL,MM,NA,NM,NN, | |
12 | X IGH,ITS,LOW,MP2,ENM2,IERR | |
13 | REAL H(NM,N),WR(N),WI(N),Z(NM,N) | |
14 | REAL P,Q,R,S,T,W,X,Y,RA,SA,VI,VR,ZZ,NORM,MACHEP | |
15 | LOGICAL NOTLAS | |
16 | COMPLEX Z3 | |
17 | REAL T3(2) | |
18 | EQUIVALENCE (Z3,T3(1)) | |
19 | #if defined(CERNLIB_CDC) | |
20 | MACHEP=2.**(-47) | |
21 | #endif | |
22 | #if !defined(CERNLIB_CDC) | |
23 | MACHEP=2.**(-23) | |
24 | #endif | |
25 | IERR = 0 | |
26 | DO 50 I = 1, N | |
27 | IF (I .GE. LOW .AND. I .LE. IGH) GO TO 50 | |
28 | WR(I) = H(I,I) | |
29 | WI(I) = 0.0 | |
30 | 50 CONTINUE | |
31 | EN = IGH | |
32 | T = 0.0 | |
33 | 60 IF (EN .LT. LOW) GO TO 340 | |
34 | ITS = 0 | |
35 | NA = EN - 1 | |
36 | ENM2 = NA - 1 | |
37 | 70 DO 80 LL = LOW, EN | |
38 | L = EN + LOW - LL | |
39 | IF (L .EQ. LOW) GO TO 100 | |
40 | IF (ABS(H(L,L-1)) .LE. MACHEP * (ABS(H(L-1,L-1)) | |
41 | X + ABS(H(L,L)))) GO TO 100 | |
42 | 80 CONTINUE | |
43 | 100 X = H(EN,EN) | |
44 | IF (L .EQ. EN) GO TO 270 | |
45 | Y = H(NA,NA) | |
46 | W = H(EN,NA) * H(NA,EN) | |
47 | IF (L .EQ. NA) GO TO 280 | |
48 | IF (ITS .EQ. 30) GO TO 1000 | |
49 | IF (ITS .NE. 10 .AND. ITS .NE. 20) GO TO 130 | |
50 | T = T + X | |
51 | DO 120 I = LOW, EN | |
52 | 120 H(I,I) = H(I,I) - X | |
53 | S = ABS(H(EN,NA)) + ABS(H(NA,ENM2)) | |
54 | X = 0.75 * S | |
55 | Y = X | |
56 | W = -0.4375 * S * S | |
57 | 130 ITS = ITS + 1 | |
58 | DO 140 MM = L, ENM2 | |
59 | M = ENM2 + L - MM | |
60 | ZZ = H(M,M) | |
61 | R = X - ZZ | |
62 | S = Y - ZZ | |
63 | P = (R * S - W) / H(M+1,M) + H(M,M+1) | |
64 | Q = H(M+1,M+1) - ZZ - R - S | |
65 | R = H(M+2,M+1) | |
66 | S = ABS(P) + ABS(Q) + ABS(R) | |
67 | P = P / S | |
68 | Q = Q / S | |
69 | R = R / S | |
70 | IF (M .EQ. L) GO TO 150 | |
71 | IF (ABS(H(M,M-1)) * (ABS(Q) + ABS(R)) .LE. MACHEP * ABS(P) | |
72 | X * (ABS(H(M-1,M-1)) + ABS(ZZ) + ABS(H(M+1,M+1)))) GO TO 150 | |
73 | 140 CONTINUE | |
74 | 150 MP2 = M + 2 | |
75 | DO 160 I = MP2, EN | |
76 | H(I,I-2) = 0.0 | |
77 | IF (I .EQ. MP2) GO TO 160 | |
78 | H(I,I-3) = 0.0 | |
79 | 160 CONTINUE | |
80 | DO 260 K = M, NA | |
81 | NOTLAS = K .NE. NA | |
82 | IF (K .EQ. M) GO TO 170 | |
83 | P = H(K,K-1) | |
84 | Q = H(K+1,K-1) | |
85 | R = 0.0 | |
86 | IF (NOTLAS) R = H(K+2,K-1) | |
87 | X = ABS(P) + ABS(Q) + ABS(R) | |
88 | IF (X .EQ. 0.0) GO TO 260 | |
89 | P = P / X | |
90 | Q = Q / X | |
91 | R = R / X | |
92 | 170 S = SIGN(SQRT(P*P+Q*Q+R*R),P) | |
93 | IF (K .EQ. M) GO TO 180 | |
94 | H(K,K-1) = -S * X | |
95 | GO TO 190 | |
96 | 180 IF (L .NE. M) H(K,K-1) = -H(K,K-1) | |
97 | 190 P = P + S | |
98 | X = P / S | |
99 | Y = Q / S | |
100 | ZZ = R / S | |
101 | Q = Q / P | |
102 | R = R / P | |
103 | DO 210 J = K, N | |
104 | P = H(K,J) + Q * H(K+1,J) | |
105 | IF (.NOT. NOTLAS) GO TO 200 | |
106 | P = P + R * H(K+2,J) | |
107 | H(K+2,J) = H(K+2,J) - P * ZZ | |
108 | 200 H(K+1,J) = H(K+1,J) - P * Y | |
109 | H(K,J) = H(K,J) - P * X | |
110 | 210 CONTINUE | |
111 | J = MIN(EN,K+3) | |
112 | DO 230 I = 1, J | |
113 | P = X * H(I,K) + Y * H(I,K+1) | |
114 | IF (.NOT. NOTLAS) GO TO 220 | |
115 | P = P + ZZ * H(I,K+2) | |
116 | H(I,K+2) = H(I,K+2) - P * R | |
117 | 220 H(I,K+1) = H(I,K+1) - P * Q | |
118 | H(I,K) = H(I,K) - P | |
119 | 230 CONTINUE | |
120 | DO 250 I = LOW, IGH | |
121 | P = X * Z(I,K) + Y * Z(I,K+1) | |
122 | IF (.NOT. NOTLAS) GO TO 240 | |
123 | P = P + ZZ * Z(I,K+2) | |
124 | Z(I,K+2) = Z(I,K+2) - P * R | |
125 | 240 Z(I,K+1) = Z(I,K+1) - P * Q | |
126 | Z(I,K) = Z(I,K) - P | |
127 | 250 CONTINUE | |
128 | 260 CONTINUE | |
129 | GO TO 70 | |
130 | 270 H(EN,EN) = X + T | |
131 | WR(EN) = H(EN,EN) | |
132 | WI(EN) = 0.0 | |
133 | EN = NA | |
134 | GO TO 60 | |
135 | 280 P = (Y - X) / 2.0 | |
136 | Q = P * P + W | |
137 | ZZ = SQRT(ABS(Q)) | |
138 | H(EN,EN) = X + T | |
139 | X = H(EN,EN) | |
140 | H(NA,NA) = Y + T | |
141 | IF (Q .LT. 0.0) GO TO 320 | |
142 | ZZ = P + SIGN(ZZ,P) | |
143 | WR(NA) = X + ZZ | |
144 | WR(EN) = WR(NA) | |
145 | IF (ZZ .NE. 0.0) WR(EN) = X - W / ZZ | |
146 | WI(NA) = 0.0 | |
147 | WI(EN) = 0.0 | |
148 | X = H(EN,NA) | |
149 | R = SQRT(X*X+ZZ*ZZ) | |
150 | P = X / R | |
151 | Q = ZZ / R | |
152 | DO 290 J = NA, N | |
153 | ZZ = H(NA,J) | |
154 | H(NA,J) = Q * ZZ + P * H(EN,J) | |
155 | H(EN,J) = Q * H(EN,J) - P * ZZ | |
156 | 290 CONTINUE | |
157 | DO 300 I = 1, EN | |
158 | ZZ = H(I,NA) | |
159 | H(I,NA) = Q * ZZ + P * H(I,EN) | |
160 | H(I,EN) = Q * H(I,EN) - P * ZZ | |
161 | 300 CONTINUE | |
162 | DO 310 I = LOW, IGH | |
163 | ZZ = Z(I,NA) | |
164 | Z(I,NA) = Q * ZZ + P * Z(I,EN) | |
165 | Z(I,EN) = Q * Z(I,EN) - P * ZZ | |
166 | 310 CONTINUE | |
167 | GO TO 330 | |
168 | 320 WR(NA) = X + P | |
169 | WR(EN) = X + P | |
170 | WI(NA) = ZZ | |
171 | WI(EN) = -ZZ | |
172 | 330 EN = ENM2 | |
173 | GO TO 60 | |
174 | 340 NORM = 0.0 | |
175 | K = 1 | |
176 | DO 360 I = 1, N | |
177 | DO 350 J = K, N | |
178 | 350 NORM = NORM + ABS(H(I,J)) | |
179 | K = I | |
180 | 360 CONTINUE | |
181 | IF (NORM .EQ. 0.0) GO TO 1001 | |
182 | DO 800 NN = 1, N | |
183 | EN = N + 1 - NN | |
184 | P = WR(EN) | |
185 | Q = WI(EN) | |
186 | NA = EN - 1 | |
187 | IF (Q) 710, 600, 800 | |
188 | 600 M = EN | |
189 | H(EN,EN) = 1.0 | |
190 | IF (NA .EQ. 0) GO TO 800 | |
191 | DO 700 II = 1, NA | |
192 | I = EN - II | |
193 | W = H(I,I) - P | |
194 | R = H(I,EN) | |
195 | IF (M .GT. NA) GO TO 620 | |
196 | DO 610 J = M, NA | |
197 | 610 R = R + H(I,J) * H(J,EN) | |
198 | 620 IF (WI(I) .GE. 0.0) GO TO 630 | |
199 | ZZ = W | |
200 | S = R | |
201 | GO TO 700 | |
202 | 630 M = I | |
203 | IF (WI(I) .NE. 0.0) GO TO 640 | |
204 | T = W | |
205 | IF (W .EQ. 0.0) T = MACHEP * NORM | |
206 | H(I,EN) = -R / T | |
207 | GO TO 700 | |
208 | 640 X = H(I,I+1) | |
209 | Y = H(I+1,I) | |
210 | Q = (WR(I) - P) * (WR(I) - P) + WI(I) * WI(I) | |
211 | T = (X * S - ZZ * R) / Q | |
212 | H(I,EN) = T | |
213 | IF (ABS(X) .LE. ABS(ZZ)) GO TO 650 | |
214 | H(I+1,EN) = (-R - W * T) / X | |
215 | GO TO 700 | |
216 | 650 H(I+1,EN) = (-S - Y * T) / ZZ | |
217 | 700 CONTINUE | |
218 | GO TO 800 | |
219 | 710 M = NA | |
220 | IF (ABS(H(EN,NA)) .LE. ABS(H(NA,EN))) GO TO 720 | |
221 | H(NA,NA) = Q / H(EN,NA) | |
222 | H(NA,EN) = -(H(EN,EN) - P) / H(EN,NA) | |
223 | GO TO 730 | |
224 | 720 Z3 = CMPLX(0.0,-H(NA,EN)) / CMPLX(H(NA,NA)-P,Q) | |
225 | H(NA,NA) = T3(1) | |
226 | H(NA,EN) = T3(2) | |
227 | 730 H(EN,NA) = 0.0 | |
228 | H(EN,EN) = 1.0 | |
229 | ENM2 = NA - 1 | |
230 | IF (ENM2 .EQ. 0) GO TO 800 | |
231 | DO 790 II = 1, ENM2 | |
232 | I = NA - II | |
233 | W = H(I,I) - P | |
234 | RA = 0.0 | |
235 | SA = H(I,EN) | |
236 | DO 760 J = M, NA | |
237 | RA = RA + H(I,J) * H(J,NA) | |
238 | SA = SA + H(I,J) * H(J,EN) | |
239 | 760 CONTINUE | |
240 | IF (WI(I) .GE. 0.0) GO TO 770 | |
241 | ZZ = W | |
242 | R = RA | |
243 | S = SA | |
244 | GO TO 790 | |
245 | 770 M = I | |
246 | IF (WI(I) .NE. 0.0) GO TO 780 | |
247 | Z3 = CMPLX(-RA,-SA) / CMPLX(W,Q) | |
248 | H(I,NA) = T3(1) | |
249 | H(I,EN) = T3(2) | |
250 | GO TO 790 | |
251 | 780 X = H(I,I+1) | |
252 | Y = H(I+1,I) | |
253 | VR = (WR(I) - P) * (WR(I) - P) + WI(I) * WI(I) - Q * Q | |
254 | VI = (WR(I) - P) * 2.0 * Q | |
255 | IF (VR .EQ. 0.0 .AND. VI .EQ. 0.0) VR = MACHEP * NORM | |
256 | X * (ABS(W) + ABS(Q) + ABS(X) + ABS(Y) + ABS(ZZ)) | |
257 | Z3 = CMPLX(X*R-ZZ*RA+Q*SA,X*S-ZZ*SA-Q*RA) / CMPLX(VR,VI) | |
258 | H(I,NA) = T3(1) | |
259 | H(I,EN) = T3(2) | |
260 | IF (ABS(X) .LE. ABS(ZZ) + ABS(Q)) GO TO 785 | |
261 | H(I+1,NA) = (-RA - W * H(I,NA) + Q * H(I,EN)) / X | |
262 | H(I+1,EN) = (-SA - W * H(I,EN) - Q * H(I,NA)) / X | |
263 | GO TO 790 | |
264 | 785 Z3 = CMPLX(-R-Y*H(I,NA),-S-Y*H(I,EN)) / CMPLX(ZZ,Q) | |
265 | H(I+1,NA) = T3(1) | |
266 | H(I+1,EN) = T3(2) | |
267 | 790 CONTINUE | |
268 | 800 CONTINUE | |
269 | DO 840 I = 1, N | |
270 | IF (I .GE. LOW .AND. I .LE. IGH) GO TO 840 | |
271 | DO 820 J = I, N | |
272 | 820 Z(I,J) = H(I,J) | |
273 | 840 CONTINUE | |
274 | DO 880 JJ = LOW, N | |
275 | J = N + LOW - JJ | |
276 | M = MIN(J,IGH) | |
277 | DO 880 I = LOW, IGH | |
278 | ZZ = 0.0 | |
279 | DO 860 K = LOW, M | |
280 | 860 ZZ = ZZ + Z(I,K) * H(K,J) | |
281 | Z(I,J) = ZZ | |
282 | 880 CONTINUE | |
283 | GO TO 1001 | |
284 | 1000 IERR = EN | |
285 | 1001 RETURN | |
286 | END |