root / src / lapack / double / dlasd4.f @ 2
Historique | Voir | Annoter | Télécharger (27,1 ko)
1 | 1 | equemene | SUBROUTINE DLASD4( N, I, D, Z, DELTA, RHO, SIGMA, WORK, INFO ) |
---|---|---|---|
2 | 1 | equemene | * |
3 | 1 | equemene | * -- LAPACK auxiliary routine (version 3.2) -- |
4 | 1 | equemene | * -- LAPACK is a software package provided by Univ. of Tennessee, -- |
5 | 1 | equemene | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
6 | 1 | equemene | * November 2006 |
7 | 1 | equemene | * |
8 | 1 | equemene | * .. Scalar Arguments .. |
9 | 1 | equemene | INTEGER I, INFO, N |
10 | 1 | equemene | DOUBLE PRECISION RHO, SIGMA |
11 | 1 | equemene | * .. |
12 | 1 | equemene | * .. Array Arguments .. |
13 | 1 | equemene | DOUBLE PRECISION D( * ), DELTA( * ), WORK( * ), Z( * ) |
14 | 1 | equemene | * .. |
15 | 1 | equemene | * |
16 | 1 | equemene | * Purpose |
17 | 1 | equemene | * ======= |
18 | 1 | equemene | * |
19 | 1 | equemene | * This subroutine computes the square root of the I-th updated |
20 | 1 | equemene | * eigenvalue of a positive symmetric rank-one modification to |
21 | 1 | equemene | * a positive diagonal matrix whose entries are given as the squares |
22 | 1 | equemene | * of the corresponding entries in the array d, and that |
23 | 1 | equemene | * |
24 | 1 | equemene | * 0 <= D(i) < D(j) for i < j |
25 | 1 | equemene | * |
26 | 1 | equemene | * and that RHO > 0. This is arranged by the calling routine, and is |
27 | 1 | equemene | * no loss in generality. The rank-one modified system is thus |
28 | 1 | equemene | * |
29 | 1 | equemene | * diag( D ) * diag( D ) + RHO * Z * Z_transpose. |
30 | 1 | equemene | * |
31 | 1 | equemene | * where we assume the Euclidean norm of Z is 1. |
32 | 1 | equemene | * |
33 | 1 | equemene | * The method consists of approximating the rational functions in the |
34 | 1 | equemene | * secular equation by simpler interpolating rational functions. |
35 | 1 | equemene | * |
36 | 1 | equemene | * Arguments |
37 | 1 | equemene | * ========= |
38 | 1 | equemene | * |
39 | 1 | equemene | * N (input) INTEGER |
40 | 1 | equemene | * The length of all arrays. |
41 | 1 | equemene | * |
42 | 1 | equemene | * I (input) INTEGER |
43 | 1 | equemene | * The index of the eigenvalue to be computed. 1 <= I <= N. |
44 | 1 | equemene | * |
45 | 1 | equemene | * D (input) DOUBLE PRECISION array, dimension ( N ) |
46 | 1 | equemene | * The original eigenvalues. It is assumed that they are in |
47 | 1 | equemene | * order, 0 <= D(I) < D(J) for I < J. |
48 | 1 | equemene | * |
49 | 1 | equemene | * Z (input) DOUBLE PRECISION array, dimension ( N ) |
50 | 1 | equemene | * The components of the updating vector. |
51 | 1 | equemene | * |
52 | 1 | equemene | * DELTA (output) DOUBLE PRECISION array, dimension ( N ) |
53 | 1 | equemene | * If N .ne. 1, DELTA contains (D(j) - sigma_I) in its j-th |
54 | 1 | equemene | * component. If N = 1, then DELTA(1) = 1. The vector DELTA |
55 | 1 | equemene | * contains the information necessary to construct the |
56 | 1 | equemene | * (singular) eigenvectors. |
57 | 1 | equemene | * |
58 | 1 | equemene | * RHO (input) DOUBLE PRECISION |
59 | 1 | equemene | * The scalar in the symmetric updating formula. |
60 | 1 | equemene | * |
61 | 1 | equemene | * SIGMA (output) DOUBLE PRECISION |
62 | 1 | equemene | * The computed sigma_I, the I-th updated eigenvalue. |
63 | 1 | equemene | * |
64 | 1 | equemene | * WORK (workspace) DOUBLE PRECISION array, dimension ( N ) |
65 | 1 | equemene | * If N .ne. 1, WORK contains (D(j) + sigma_I) in its j-th |
66 | 1 | equemene | * component. If N = 1, then WORK( 1 ) = 1. |
67 | 1 | equemene | * |
68 | 1 | equemene | * INFO (output) INTEGER |
69 | 1 | equemene | * = 0: successful exit |
70 | 1 | equemene | * > 0: if INFO = 1, the updating process failed. |
71 | 1 | equemene | * |
72 | 1 | equemene | * Internal Parameters |
73 | 1 | equemene | * =================== |
74 | 1 | equemene | * |
75 | 1 | equemene | * Logical variable ORGATI (origin-at-i?) is used for distinguishing |
76 | 1 | equemene | * whether D(i) or D(i+1) is treated as the origin. |
77 | 1 | equemene | * |
78 | 1 | equemene | * ORGATI = .true. origin at i |
79 | 1 | equemene | * ORGATI = .false. origin at i+1 |
80 | 1 | equemene | * |
81 | 1 | equemene | * Logical variable SWTCH3 (switch-for-3-poles?) is for noting |
82 | 1 | equemene | * if we are working with THREE poles! |
83 | 1 | equemene | * |
84 | 1 | equemene | * MAXIT is the maximum number of iterations allowed for each |
85 | 1 | equemene | * eigenvalue. |
86 | 1 | equemene | * |
87 | 1 | equemene | * Further Details |
88 | 1 | equemene | * =============== |
89 | 1 | equemene | * |
90 | 1 | equemene | * Based on contributions by |
91 | 1 | equemene | * Ren-Cang Li, Computer Science Division, University of California |
92 | 1 | equemene | * at Berkeley, USA |
93 | 1 | equemene | * |
94 | 1 | equemene | * ===================================================================== |
95 | 1 | equemene | * |
96 | 1 | equemene | * .. Parameters .. |
97 | 1 | equemene | INTEGER MAXIT |
98 | 1 | equemene | PARAMETER ( MAXIT = 20 ) |
99 | 1 | equemene | DOUBLE PRECISION ZERO, ONE, TWO, THREE, FOUR, EIGHT, TEN |
100 | 1 | equemene | PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0, |
101 | 1 | equemene | $ THREE = 3.0D+0, FOUR = 4.0D+0, EIGHT = 8.0D+0, |
102 | 1 | equemene | $ TEN = 10.0D+0 ) |
103 | 1 | equemene | * .. |
104 | 1 | equemene | * .. Local Scalars .. |
105 | 1 | equemene | LOGICAL ORGATI, SWTCH, SWTCH3 |
106 | 1 | equemene | INTEGER II, IIM1, IIP1, IP1, ITER, J, NITER |
107 | 1 | equemene | DOUBLE PRECISION A, B, C, DELSQ, DELSQ2, DPHI, DPSI, DTIIM, |
108 | 1 | equemene | $ DTIIP, DTIPSQ, DTISQ, DTNSQ, DTNSQ1, DW, EPS, |
109 | 1 | equemene | $ ERRETM, ETA, PHI, PREW, PSI, RHOINV, SG2LB, |
110 | 1 | equemene | $ SG2UB, TAU, TEMP, TEMP1, TEMP2, W |
111 | 1 | equemene | * .. |
112 | 1 | equemene | * .. Local Arrays .. |
113 | 1 | equemene | DOUBLE PRECISION DD( 3 ), ZZ( 3 ) |
114 | 1 | equemene | * .. |
115 | 1 | equemene | * .. External Subroutines .. |
116 | 1 | equemene | EXTERNAL DLAED6, DLASD5 |
117 | 1 | equemene | * .. |
118 | 1 | equemene | * .. External Functions .. |
119 | 1 | equemene | DOUBLE PRECISION DLAMCH |
120 | 1 | equemene | EXTERNAL DLAMCH |
121 | 1 | equemene | * .. |
122 | 1 | equemene | * .. Intrinsic Functions .. |
123 | 1 | equemene | INTRINSIC ABS, MAX, MIN, SQRT |
124 | 1 | equemene | * .. |
125 | 1 | equemene | * .. Executable Statements .. |
126 | 1 | equemene | * |
127 | 1 | equemene | * Since this routine is called in an inner loop, we do no argument |
128 | 1 | equemene | * checking. |
129 | 1 | equemene | * |
130 | 1 | equemene | * Quick return for N=1 and 2. |
131 | 1 | equemene | * |
132 | 1 | equemene | INFO = 0 |
133 | 1 | equemene | IF( N.EQ.1 ) THEN |
134 | 1 | equemene | * |
135 | 1 | equemene | * Presumably, I=1 upon entry |
136 | 1 | equemene | * |
137 | 1 | equemene | SIGMA = SQRT( D( 1 )*D( 1 )+RHO*Z( 1 )*Z( 1 ) ) |
138 | 1 | equemene | DELTA( 1 ) = ONE |
139 | 1 | equemene | WORK( 1 ) = ONE |
140 | 1 | equemene | RETURN |
141 | 1 | equemene | END IF |
142 | 1 | equemene | IF( N.EQ.2 ) THEN |
143 | 1 | equemene | CALL DLASD5( I, D, Z, DELTA, RHO, SIGMA, WORK ) |
144 | 1 | equemene | RETURN |
145 | 1 | equemene | END IF |
146 | 1 | equemene | * |
147 | 1 | equemene | * Compute machine epsilon |
148 | 1 | equemene | * |
149 | 1 | equemene | EPS = DLAMCH( 'Epsilon' ) |
150 | 1 | equemene | RHOINV = ONE / RHO |
151 | 1 | equemene | * |
152 | 1 | equemene | * The case I = N |
153 | 1 | equemene | * |
154 | 1 | equemene | IF( I.EQ.N ) THEN |
155 | 1 | equemene | * |
156 | 1 | equemene | * Initialize some basic variables |
157 | 1 | equemene | * |
158 | 1 | equemene | II = N - 1 |
159 | 1 | equemene | NITER = 1 |
160 | 1 | equemene | * |
161 | 1 | equemene | * Calculate initial guess |
162 | 1 | equemene | * |
163 | 1 | equemene | TEMP = RHO / TWO |
164 | 1 | equemene | * |
165 | 1 | equemene | * If ||Z||_2 is not one, then TEMP should be set to |
166 | 1 | equemene | * RHO * ||Z||_2^2 / TWO |
167 | 1 | equemene | * |
168 | 1 | equemene | TEMP1 = TEMP / ( D( N )+SQRT( D( N )*D( N )+TEMP ) ) |
169 | 1 | equemene | DO 10 J = 1, N |
170 | 1 | equemene | WORK( J ) = D( J ) + D( N ) + TEMP1 |
171 | 1 | equemene | DELTA( J ) = ( D( J )-D( N ) ) - TEMP1 |
172 | 1 | equemene | 10 CONTINUE |
173 | 1 | equemene | * |
174 | 1 | equemene | PSI = ZERO |
175 | 1 | equemene | DO 20 J = 1, N - 2 |
176 | 1 | equemene | PSI = PSI + Z( J )*Z( J ) / ( DELTA( J )*WORK( J ) ) |
177 | 1 | equemene | 20 CONTINUE |
178 | 1 | equemene | * |
179 | 1 | equemene | C = RHOINV + PSI |
180 | 1 | equemene | W = C + Z( II )*Z( II ) / ( DELTA( II )*WORK( II ) ) + |
181 | 1 | equemene | $ Z( N )*Z( N ) / ( DELTA( N )*WORK( N ) ) |
182 | 1 | equemene | * |
183 | 1 | equemene | IF( W.LE.ZERO ) THEN |
184 | 1 | equemene | TEMP1 = SQRT( D( N )*D( N )+RHO ) |
185 | 1 | equemene | TEMP = Z( N-1 )*Z( N-1 ) / ( ( D( N-1 )+TEMP1 )* |
186 | 1 | equemene | $ ( D( N )-D( N-1 )+RHO / ( D( N )+TEMP1 ) ) ) + |
187 | 1 | equemene | $ Z( N )*Z( N ) / RHO |
188 | 1 | equemene | * |
189 | 1 | equemene | * The following TAU is to approximate |
190 | 1 | equemene | * SIGMA_n^2 - D( N )*D( N ) |
191 | 1 | equemene | * |
192 | 1 | equemene | IF( C.LE.TEMP ) THEN |
193 | 1 | equemene | TAU = RHO |
194 | 1 | equemene | ELSE |
195 | 1 | equemene | DELSQ = ( D( N )-D( N-1 ) )*( D( N )+D( N-1 ) ) |
196 | 1 | equemene | A = -C*DELSQ + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N ) |
197 | 1 | equemene | B = Z( N )*Z( N )*DELSQ |
198 | 1 | equemene | IF( A.LT.ZERO ) THEN |
199 | 1 | equemene | TAU = TWO*B / ( SQRT( A*A+FOUR*B*C )-A ) |
200 | 1 | equemene | ELSE |
201 | 1 | equemene | TAU = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C ) |
202 | 1 | equemene | END IF |
203 | 1 | equemene | END IF |
204 | 1 | equemene | * |
205 | 1 | equemene | * It can be proved that |
206 | 1 | equemene | * D(N)^2+RHO/2 <= SIGMA_n^2 < D(N)^2+TAU <= D(N)^2+RHO |
207 | 1 | equemene | * |
208 | 1 | equemene | ELSE |
209 | 1 | equemene | DELSQ = ( D( N )-D( N-1 ) )*( D( N )+D( N-1 ) ) |
210 | 1 | equemene | A = -C*DELSQ + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N ) |
211 | 1 | equemene | B = Z( N )*Z( N )*DELSQ |
212 | 1 | equemene | * |
213 | 1 | equemene | * The following TAU is to approximate |
214 | 1 | equemene | * SIGMA_n^2 - D( N )*D( N ) |
215 | 1 | equemene | * |
216 | 1 | equemene | IF( A.LT.ZERO ) THEN |
217 | 1 | equemene | TAU = TWO*B / ( SQRT( A*A+FOUR*B*C )-A ) |
218 | 1 | equemene | ELSE |
219 | 1 | equemene | TAU = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C ) |
220 | 1 | equemene | END IF |
221 | 1 | equemene | * |
222 | 1 | equemene | * It can be proved that |
223 | 1 | equemene | * D(N)^2 < D(N)^2+TAU < SIGMA(N)^2 < D(N)^2+RHO/2 |
224 | 1 | equemene | * |
225 | 1 | equemene | END IF |
226 | 1 | equemene | * |
227 | 1 | equemene | * The following ETA is to approximate SIGMA_n - D( N ) |
228 | 1 | equemene | * |
229 | 1 | equemene | ETA = TAU / ( D( N )+SQRT( D( N )*D( N )+TAU ) ) |
230 | 1 | equemene | * |
231 | 1 | equemene | SIGMA = D( N ) + ETA |
232 | 1 | equemene | DO 30 J = 1, N |
233 | 1 | equemene | DELTA( J ) = ( D( J )-D( I ) ) - ETA |
234 | 1 | equemene | WORK( J ) = D( J ) + D( I ) + ETA |
235 | 1 | equemene | 30 CONTINUE |
236 | 1 | equemene | * |
237 | 1 | equemene | * Evaluate PSI and the derivative DPSI |
238 | 1 | equemene | * |
239 | 1 | equemene | DPSI = ZERO |
240 | 1 | equemene | PSI = ZERO |
241 | 1 | equemene | ERRETM = ZERO |
242 | 1 | equemene | DO 40 J = 1, II |
243 | 1 | equemene | TEMP = Z( J ) / ( DELTA( J )*WORK( J ) ) |
244 | 1 | equemene | PSI = PSI + Z( J )*TEMP |
245 | 1 | equemene | DPSI = DPSI + TEMP*TEMP |
246 | 1 | equemene | ERRETM = ERRETM + PSI |
247 | 1 | equemene | 40 CONTINUE |
248 | 1 | equemene | ERRETM = ABS( ERRETM ) |
249 | 1 | equemene | * |
250 | 1 | equemene | * Evaluate PHI and the derivative DPHI |
251 | 1 | equemene | * |
252 | 1 | equemene | TEMP = Z( N ) / ( DELTA( N )*WORK( N ) ) |
253 | 1 | equemene | PHI = Z( N )*TEMP |
254 | 1 | equemene | DPHI = TEMP*TEMP |
255 | 1 | equemene | ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV + |
256 | 1 | equemene | $ ABS( TAU )*( DPSI+DPHI ) |
257 | 1 | equemene | * |
258 | 1 | equemene | W = RHOINV + PHI + PSI |
259 | 1 | equemene | * |
260 | 1 | equemene | * Test for convergence |
261 | 1 | equemene | * |
262 | 1 | equemene | IF( ABS( W ).LE.EPS*ERRETM ) THEN |
263 | 1 | equemene | GO TO 240 |
264 | 1 | equemene | END IF |
265 | 1 | equemene | * |
266 | 1 | equemene | * Calculate the new step |
267 | 1 | equemene | * |
268 | 1 | equemene | NITER = NITER + 1 |
269 | 1 | equemene | DTNSQ1 = WORK( N-1 )*DELTA( N-1 ) |
270 | 1 | equemene | DTNSQ = WORK( N )*DELTA( N ) |
271 | 1 | equemene | C = W - DTNSQ1*DPSI - DTNSQ*DPHI |
272 | 1 | equemene | A = ( DTNSQ+DTNSQ1 )*W - DTNSQ*DTNSQ1*( DPSI+DPHI ) |
273 | 1 | equemene | B = DTNSQ*DTNSQ1*W |
274 | 1 | equemene | IF( C.LT.ZERO ) |
275 | 1 | equemene | $ C = ABS( C ) |
276 | 1 | equemene | IF( C.EQ.ZERO ) THEN |
277 | 1 | equemene | ETA = RHO - SIGMA*SIGMA |
278 | 1 | equemene | ELSE IF( A.GE.ZERO ) THEN |
279 | 1 | equemene | ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) |
280 | 1 | equemene | ELSE |
281 | 1 | equemene | ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) |
282 | 1 | equemene | END IF |
283 | 1 | equemene | * |
284 | 1 | equemene | * Note, eta should be positive if w is negative, and |
285 | 1 | equemene | * eta should be negative otherwise. However, |
286 | 1 | equemene | * if for some reason caused by roundoff, eta*w > 0, |
287 | 1 | equemene | * we simply use one Newton step instead. This way |
288 | 1 | equemene | * will guarantee eta*w < 0. |
289 | 1 | equemene | * |
290 | 1 | equemene | IF( W*ETA.GT.ZERO ) |
291 | 1 | equemene | $ ETA = -W / ( DPSI+DPHI ) |
292 | 1 | equemene | TEMP = ETA - DTNSQ |
293 | 1 | equemene | IF( TEMP.GT.RHO ) |
294 | 1 | equemene | $ ETA = RHO + DTNSQ |
295 | 1 | equemene | * |
296 | 1 | equemene | TAU = TAU + ETA |
297 | 1 | equemene | ETA = ETA / ( SIGMA+SQRT( ETA+SIGMA*SIGMA ) ) |
298 | 1 | equemene | DO 50 J = 1, N |
299 | 1 | equemene | DELTA( J ) = DELTA( J ) - ETA |
300 | 1 | equemene | WORK( J ) = WORK( J ) + ETA |
301 | 1 | equemene | 50 CONTINUE |
302 | 1 | equemene | * |
303 | 1 | equemene | SIGMA = SIGMA + ETA |
304 | 1 | equemene | * |
305 | 1 | equemene | * Evaluate PSI and the derivative DPSI |
306 | 1 | equemene | * |
307 | 1 | equemene | DPSI = ZERO |
308 | 1 | equemene | PSI = ZERO |
309 | 1 | equemene | ERRETM = ZERO |
310 | 1 | equemene | DO 60 J = 1, II |
311 | 1 | equemene | TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) |
312 | 1 | equemene | PSI = PSI + Z( J )*TEMP |
313 | 1 | equemene | DPSI = DPSI + TEMP*TEMP |
314 | 1 | equemene | ERRETM = ERRETM + PSI |
315 | 1 | equemene | 60 CONTINUE |
316 | 1 | equemene | ERRETM = ABS( ERRETM ) |
317 | 1 | equemene | * |
318 | 1 | equemene | * Evaluate PHI and the derivative DPHI |
319 | 1 | equemene | * |
320 | 1 | equemene | TEMP = Z( N ) / ( WORK( N )*DELTA( N ) ) |
321 | 1 | equemene | PHI = Z( N )*TEMP |
322 | 1 | equemene | DPHI = TEMP*TEMP |
323 | 1 | equemene | ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV + |
324 | 1 | equemene | $ ABS( TAU )*( DPSI+DPHI ) |
325 | 1 | equemene | * |
326 | 1 | equemene | W = RHOINV + PHI + PSI |
327 | 1 | equemene | * |
328 | 1 | equemene | * Main loop to update the values of the array DELTA |
329 | 1 | equemene | * |
330 | 1 | equemene | ITER = NITER + 1 |
331 | 1 | equemene | * |
332 | 1 | equemene | DO 90 NITER = ITER, MAXIT |
333 | 1 | equemene | * |
334 | 1 | equemene | * Test for convergence |
335 | 1 | equemene | * |
336 | 1 | equemene | IF( ABS( W ).LE.EPS*ERRETM ) THEN |
337 | 1 | equemene | GO TO 240 |
338 | 1 | equemene | END IF |
339 | 1 | equemene | * |
340 | 1 | equemene | * Calculate the new step |
341 | 1 | equemene | * |
342 | 1 | equemene | DTNSQ1 = WORK( N-1 )*DELTA( N-1 ) |
343 | 1 | equemene | DTNSQ = WORK( N )*DELTA( N ) |
344 | 1 | equemene | C = W - DTNSQ1*DPSI - DTNSQ*DPHI |
345 | 1 | equemene | A = ( DTNSQ+DTNSQ1 )*W - DTNSQ1*DTNSQ*( DPSI+DPHI ) |
346 | 1 | equemene | B = DTNSQ1*DTNSQ*W |
347 | 1 | equemene | IF( A.GE.ZERO ) THEN |
348 | 1 | equemene | ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) |
349 | 1 | equemene | ELSE |
350 | 1 | equemene | ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) |
351 | 1 | equemene | END IF |
352 | 1 | equemene | * |
353 | 1 | equemene | * Note, eta should be positive if w is negative, and |
354 | 1 | equemene | * eta should be negative otherwise. However, |
355 | 1 | equemene | * if for some reason caused by roundoff, eta*w > 0, |
356 | 1 | equemene | * we simply use one Newton step instead. This way |
357 | 1 | equemene | * will guarantee eta*w < 0. |
358 | 1 | equemene | * |
359 | 1 | equemene | IF( W*ETA.GT.ZERO ) |
360 | 1 | equemene | $ ETA = -W / ( DPSI+DPHI ) |
361 | 1 | equemene | TEMP = ETA - DTNSQ |
362 | 1 | equemene | IF( TEMP.LE.ZERO ) |
363 | 1 | equemene | $ ETA = ETA / TWO |
364 | 1 | equemene | * |
365 | 1 | equemene | TAU = TAU + ETA |
366 | 1 | equemene | ETA = ETA / ( SIGMA+SQRT( ETA+SIGMA*SIGMA ) ) |
367 | 1 | equemene | DO 70 J = 1, N |
368 | 1 | equemene | DELTA( J ) = DELTA( J ) - ETA |
369 | 1 | equemene | WORK( J ) = WORK( J ) + ETA |
370 | 1 | equemene | 70 CONTINUE |
371 | 1 | equemene | * |
372 | 1 | equemene | SIGMA = SIGMA + ETA |
373 | 1 | equemene | * |
374 | 1 | equemene | * Evaluate PSI and the derivative DPSI |
375 | 1 | equemene | * |
376 | 1 | equemene | DPSI = ZERO |
377 | 1 | equemene | PSI = ZERO |
378 | 1 | equemene | ERRETM = ZERO |
379 | 1 | equemene | DO 80 J = 1, II |
380 | 1 | equemene | TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) |
381 | 1 | equemene | PSI = PSI + Z( J )*TEMP |
382 | 1 | equemene | DPSI = DPSI + TEMP*TEMP |
383 | 1 | equemene | ERRETM = ERRETM + PSI |
384 | 1 | equemene | 80 CONTINUE |
385 | 1 | equemene | ERRETM = ABS( ERRETM ) |
386 | 1 | equemene | * |
387 | 1 | equemene | * Evaluate PHI and the derivative DPHI |
388 | 1 | equemene | * |
389 | 1 | equemene | TEMP = Z( N ) / ( WORK( N )*DELTA( N ) ) |
390 | 1 | equemene | PHI = Z( N )*TEMP |
391 | 1 | equemene | DPHI = TEMP*TEMP |
392 | 1 | equemene | ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV + |
393 | 1 | equemene | $ ABS( TAU )*( DPSI+DPHI ) |
394 | 1 | equemene | * |
395 | 1 | equemene | W = RHOINV + PHI + PSI |
396 | 1 | equemene | 90 CONTINUE |
397 | 1 | equemene | * |
398 | 1 | equemene | * Return with INFO = 1, NITER = MAXIT and not converged |
399 | 1 | equemene | * |
400 | 1 | equemene | INFO = 1 |
401 | 1 | equemene | GO TO 240 |
402 | 1 | equemene | * |
403 | 1 | equemene | * End for the case I = N |
404 | 1 | equemene | * |
405 | 1 | equemene | ELSE |
406 | 1 | equemene | * |
407 | 1 | equemene | * The case for I < N |
408 | 1 | equemene | * |
409 | 1 | equemene | NITER = 1 |
410 | 1 | equemene | IP1 = I + 1 |
411 | 1 | equemene | * |
412 | 1 | equemene | * Calculate initial guess |
413 | 1 | equemene | * |
414 | 1 | equemene | DELSQ = ( D( IP1 )-D( I ) )*( D( IP1 )+D( I ) ) |
415 | 1 | equemene | DELSQ2 = DELSQ / TWO |
416 | 1 | equemene | TEMP = DELSQ2 / ( D( I )+SQRT( D( I )*D( I )+DELSQ2 ) ) |
417 | 1 | equemene | DO 100 J = 1, N |
418 | 1 | equemene | WORK( J ) = D( J ) + D( I ) + TEMP |
419 | 1 | equemene | DELTA( J ) = ( D( J )-D( I ) ) - TEMP |
420 | 1 | equemene | 100 CONTINUE |
421 | 1 | equemene | * |
422 | 1 | equemene | PSI = ZERO |
423 | 1 | equemene | DO 110 J = 1, I - 1 |
424 | 1 | equemene | PSI = PSI + Z( J )*Z( J ) / ( WORK( J )*DELTA( J ) ) |
425 | 1 | equemene | 110 CONTINUE |
426 | 1 | equemene | * |
427 | 1 | equemene | PHI = ZERO |
428 | 1 | equemene | DO 120 J = N, I + 2, -1 |
429 | 1 | equemene | PHI = PHI + Z( J )*Z( J ) / ( WORK( J )*DELTA( J ) ) |
430 | 1 | equemene | 120 CONTINUE |
431 | 1 | equemene | C = RHOINV + PSI + PHI |
432 | 1 | equemene | W = C + Z( I )*Z( I ) / ( WORK( I )*DELTA( I ) ) + |
433 | 1 | equemene | $ Z( IP1 )*Z( IP1 ) / ( WORK( IP1 )*DELTA( IP1 ) ) |
434 | 1 | equemene | * |
435 | 1 | equemene | IF( W.GT.ZERO ) THEN |
436 | 1 | equemene | * |
437 | 1 | equemene | * d(i)^2 < the ith sigma^2 < (d(i)^2+d(i+1)^2)/2 |
438 | 1 | equemene | * |
439 | 1 | equemene | * We choose d(i) as origin. |
440 | 1 | equemene | * |
441 | 1 | equemene | ORGATI = .TRUE. |
442 | 1 | equemene | SG2LB = ZERO |
443 | 1 | equemene | SG2UB = DELSQ2 |
444 | 1 | equemene | A = C*DELSQ + Z( I )*Z( I ) + Z( IP1 )*Z( IP1 ) |
445 | 1 | equemene | B = Z( I )*Z( I )*DELSQ |
446 | 1 | equemene | IF( A.GT.ZERO ) THEN |
447 | 1 | equemene | TAU = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) |
448 | 1 | equemene | ELSE |
449 | 1 | equemene | TAU = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) |
450 | 1 | equemene | END IF |
451 | 1 | equemene | * |
452 | 1 | equemene | * TAU now is an estimation of SIGMA^2 - D( I )^2. The |
453 | 1 | equemene | * following, however, is the corresponding estimation of |
454 | 1 | equemene | * SIGMA - D( I ). |
455 | 1 | equemene | * |
456 | 1 | equemene | ETA = TAU / ( D( I )+SQRT( D( I )*D( I )+TAU ) ) |
457 | 1 | equemene | ELSE |
458 | 1 | equemene | * |
459 | 1 | equemene | * (d(i)^2+d(i+1)^2)/2 <= the ith sigma^2 < d(i+1)^2/2 |
460 | 1 | equemene | * |
461 | 1 | equemene | * We choose d(i+1) as origin. |
462 | 1 | equemene | * |
463 | 1 | equemene | ORGATI = .FALSE. |
464 | 1 | equemene | SG2LB = -DELSQ2 |
465 | 1 | equemene | SG2UB = ZERO |
466 | 1 | equemene | A = C*DELSQ - Z( I )*Z( I ) - Z( IP1 )*Z( IP1 ) |
467 | 1 | equemene | B = Z( IP1 )*Z( IP1 )*DELSQ |
468 | 1 | equemene | IF( A.LT.ZERO ) THEN |
469 | 1 | equemene | TAU = TWO*B / ( A-SQRT( ABS( A*A+FOUR*B*C ) ) ) |
470 | 1 | equemene | ELSE |
471 | 1 | equemene | TAU = -( A+SQRT( ABS( A*A+FOUR*B*C ) ) ) / ( TWO*C ) |
472 | 1 | equemene | END IF |
473 | 1 | equemene | * |
474 | 1 | equemene | * TAU now is an estimation of SIGMA^2 - D( IP1 )^2. The |
475 | 1 | equemene | * following, however, is the corresponding estimation of |
476 | 1 | equemene | * SIGMA - D( IP1 ). |
477 | 1 | equemene | * |
478 | 1 | equemene | ETA = TAU / ( D( IP1 )+SQRT( ABS( D( IP1 )*D( IP1 )+ |
479 | 1 | equemene | $ TAU ) ) ) |
480 | 1 | equemene | END IF |
481 | 1 | equemene | * |
482 | 1 | equemene | IF( ORGATI ) THEN |
483 | 1 | equemene | II = I |
484 | 1 | equemene | SIGMA = D( I ) + ETA |
485 | 1 | equemene | DO 130 J = 1, N |
486 | 1 | equemene | WORK( J ) = D( J ) + D( I ) + ETA |
487 | 1 | equemene | DELTA( J ) = ( D( J )-D( I ) ) - ETA |
488 | 1 | equemene | 130 CONTINUE |
489 | 1 | equemene | ELSE |
490 | 1 | equemene | II = I + 1 |
491 | 1 | equemene | SIGMA = D( IP1 ) + ETA |
492 | 1 | equemene | DO 140 J = 1, N |
493 | 1 | equemene | WORK( J ) = D( J ) + D( IP1 ) + ETA |
494 | 1 | equemene | DELTA( J ) = ( D( J )-D( IP1 ) ) - ETA |
495 | 1 | equemene | 140 CONTINUE |
496 | 1 | equemene | END IF |
497 | 1 | equemene | IIM1 = II - 1 |
498 | 1 | equemene | IIP1 = II + 1 |
499 | 1 | equemene | * |
500 | 1 | equemene | * Evaluate PSI and the derivative DPSI |
501 | 1 | equemene | * |
502 | 1 | equemene | DPSI = ZERO |
503 | 1 | equemene | PSI = ZERO |
504 | 1 | equemene | ERRETM = ZERO |
505 | 1 | equemene | DO 150 J = 1, IIM1 |
506 | 1 | equemene | TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) |
507 | 1 | equemene | PSI = PSI + Z( J )*TEMP |
508 | 1 | equemene | DPSI = DPSI + TEMP*TEMP |
509 | 1 | equemene | ERRETM = ERRETM + PSI |
510 | 1 | equemene | 150 CONTINUE |
511 | 1 | equemene | ERRETM = ABS( ERRETM ) |
512 | 1 | equemene | * |
513 | 1 | equemene | * Evaluate PHI and the derivative DPHI |
514 | 1 | equemene | * |
515 | 1 | equemene | DPHI = ZERO |
516 | 1 | equemene | PHI = ZERO |
517 | 1 | equemene | DO 160 J = N, IIP1, -1 |
518 | 1 | equemene | TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) |
519 | 1 | equemene | PHI = PHI + Z( J )*TEMP |
520 | 1 | equemene | DPHI = DPHI + TEMP*TEMP |
521 | 1 | equemene | ERRETM = ERRETM + PHI |
522 | 1 | equemene | 160 CONTINUE |
523 | 1 | equemene | * |
524 | 1 | equemene | W = RHOINV + PHI + PSI |
525 | 1 | equemene | * |
526 | 1 | equemene | * W is the value of the secular function with |
527 | 1 | equemene | * its ii-th element removed. |
528 | 1 | equemene | * |
529 | 1 | equemene | SWTCH3 = .FALSE. |
530 | 1 | equemene | IF( ORGATI ) THEN |
531 | 1 | equemene | IF( W.LT.ZERO ) |
532 | 1 | equemene | $ SWTCH3 = .TRUE. |
533 | 1 | equemene | ELSE |
534 | 1 | equemene | IF( W.GT.ZERO ) |
535 | 1 | equemene | $ SWTCH3 = .TRUE. |
536 | 1 | equemene | END IF |
537 | 1 | equemene | IF( II.EQ.1 .OR. II.EQ.N ) |
538 | 1 | equemene | $ SWTCH3 = .FALSE. |
539 | 1 | equemene | * |
540 | 1 | equemene | TEMP = Z( II ) / ( WORK( II )*DELTA( II ) ) |
541 | 1 | equemene | DW = DPSI + DPHI + TEMP*TEMP |
542 | 1 | equemene | TEMP = Z( II )*TEMP |
543 | 1 | equemene | W = W + TEMP |
544 | 1 | equemene | ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV + |
545 | 1 | equemene | $ THREE*ABS( TEMP ) + ABS( TAU )*DW |
546 | 1 | equemene | * |
547 | 1 | equemene | * Test for convergence |
548 | 1 | equemene | * |
549 | 1 | equemene | IF( ABS( W ).LE.EPS*ERRETM ) THEN |
550 | 1 | equemene | GO TO 240 |
551 | 1 | equemene | END IF |
552 | 1 | equemene | * |
553 | 1 | equemene | IF( W.LE.ZERO ) THEN |
554 | 1 | equemene | SG2LB = MAX( SG2LB, TAU ) |
555 | 1 | equemene | ELSE |
556 | 1 | equemene | SG2UB = MIN( SG2UB, TAU ) |
557 | 1 | equemene | END IF |
558 | 1 | equemene | * |
559 | 1 | equemene | * Calculate the new step |
560 | 1 | equemene | * |
561 | 1 | equemene | NITER = NITER + 1 |
562 | 1 | equemene | IF( .NOT.SWTCH3 ) THEN |
563 | 1 | equemene | DTIPSQ = WORK( IP1 )*DELTA( IP1 ) |
564 | 1 | equemene | DTISQ = WORK( I )*DELTA( I ) |
565 | 1 | equemene | IF( ORGATI ) THEN |
566 | 1 | equemene | C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2 |
567 | 1 | equemene | ELSE |
568 | 1 | equemene | C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2 |
569 | 1 | equemene | END IF |
570 | 1 | equemene | A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW |
571 | 1 | equemene | B = DTIPSQ*DTISQ*W |
572 | 1 | equemene | IF( C.EQ.ZERO ) THEN |
573 | 1 | equemene | IF( A.EQ.ZERO ) THEN |
574 | 1 | equemene | IF( ORGATI ) THEN |
575 | 1 | equemene | A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ*( DPSI+DPHI ) |
576 | 1 | equemene | ELSE |
577 | 1 | equemene | A = Z( IP1 )*Z( IP1 ) + DTISQ*DTISQ*( DPSI+DPHI ) |
578 | 1 | equemene | END IF |
579 | 1 | equemene | END IF |
580 | 1 | equemene | ETA = B / A |
581 | 1 | equemene | ELSE IF( A.LE.ZERO ) THEN |
582 | 1 | equemene | ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) |
583 | 1 | equemene | ELSE |
584 | 1 | equemene | ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) |
585 | 1 | equemene | END IF |
586 | 1 | equemene | ELSE |
587 | 1 | equemene | * |
588 | 1 | equemene | * Interpolation using THREE most relevant poles |
589 | 1 | equemene | * |
590 | 1 | equemene | DTIIM = WORK( IIM1 )*DELTA( IIM1 ) |
591 | 1 | equemene | DTIIP = WORK( IIP1 )*DELTA( IIP1 ) |
592 | 1 | equemene | TEMP = RHOINV + PSI + PHI |
593 | 1 | equemene | IF( ORGATI ) THEN |
594 | 1 | equemene | TEMP1 = Z( IIM1 ) / DTIIM |
595 | 1 | equemene | TEMP1 = TEMP1*TEMP1 |
596 | 1 | equemene | C = ( TEMP - DTIIP*( DPSI+DPHI ) ) - |
597 | 1 | equemene | $ ( D( IIM1 )-D( IIP1 ) )*( D( IIM1 )+D( IIP1 ) )*TEMP1 |
598 | 1 | equemene | ZZ( 1 ) = Z( IIM1 )*Z( IIM1 ) |
599 | 1 | equemene | IF( DPSI.LT.TEMP1 ) THEN |
600 | 1 | equemene | ZZ( 3 ) = DTIIP*DTIIP*DPHI |
601 | 1 | equemene | ELSE |
602 | 1 | equemene | ZZ( 3 ) = DTIIP*DTIIP*( ( DPSI-TEMP1 )+DPHI ) |
603 | 1 | equemene | END IF |
604 | 1 | equemene | ELSE |
605 | 1 | equemene | TEMP1 = Z( IIP1 ) / DTIIP |
606 | 1 | equemene | TEMP1 = TEMP1*TEMP1 |
607 | 1 | equemene | C = ( TEMP - DTIIM*( DPSI+DPHI ) ) - |
608 | 1 | equemene | $ ( D( IIP1 )-D( IIM1 ) )*( D( IIM1 )+D( IIP1 ) )*TEMP1 |
609 | 1 | equemene | IF( DPHI.LT.TEMP1 ) THEN |
610 | 1 | equemene | ZZ( 1 ) = DTIIM*DTIIM*DPSI |
611 | 1 | equemene | ELSE |
612 | 1 | equemene | ZZ( 1 ) = DTIIM*DTIIM*( DPSI+( DPHI-TEMP1 ) ) |
613 | 1 | equemene | END IF |
614 | 1 | equemene | ZZ( 3 ) = Z( IIP1 )*Z( IIP1 ) |
615 | 1 | equemene | END IF |
616 | 1 | equemene | ZZ( 2 ) = Z( II )*Z( II ) |
617 | 1 | equemene | DD( 1 ) = DTIIM |
618 | 1 | equemene | DD( 2 ) = DELTA( II )*WORK( II ) |
619 | 1 | equemene | DD( 3 ) = DTIIP |
620 | 1 | equemene | CALL DLAED6( NITER, ORGATI, C, DD, ZZ, W, ETA, INFO ) |
621 | 1 | equemene | IF( INFO.NE.0 ) |
622 | 1 | equemene | $ GO TO 240 |
623 | 1 | equemene | END IF |
624 | 1 | equemene | * |
625 | 1 | equemene | * Note, eta should be positive if w is negative, and |
626 | 1 | equemene | * eta should be negative otherwise. However, |
627 | 1 | equemene | * if for some reason caused by roundoff, eta*w > 0, |
628 | 1 | equemene | * we simply use one Newton step instead. This way |
629 | 1 | equemene | * will guarantee eta*w < 0. |
630 | 1 | equemene | * |
631 | 1 | equemene | IF( W*ETA.GE.ZERO ) |
632 | 1 | equemene | $ ETA = -W / DW |
633 | 1 | equemene | IF( ORGATI ) THEN |
634 | 1 | equemene | TEMP1 = WORK( I )*DELTA( I ) |
635 | 1 | equemene | TEMP = ETA - TEMP1 |
636 | 1 | equemene | ELSE |
637 | 1 | equemene | TEMP1 = WORK( IP1 )*DELTA( IP1 ) |
638 | 1 | equemene | TEMP = ETA - TEMP1 |
639 | 1 | equemene | END IF |
640 | 1 | equemene | IF( TEMP.GT.SG2UB .OR. TEMP.LT.SG2LB ) THEN |
641 | 1 | equemene | IF( W.LT.ZERO ) THEN |
642 | 1 | equemene | ETA = ( SG2UB-TAU ) / TWO |
643 | 1 | equemene | ELSE |
644 | 1 | equemene | ETA = ( SG2LB-TAU ) / TWO |
645 | 1 | equemene | END IF |
646 | 1 | equemene | END IF |
647 | 1 | equemene | * |
648 | 1 | equemene | TAU = TAU + ETA |
649 | 1 | equemene | ETA = ETA / ( SIGMA+SQRT( SIGMA*SIGMA+ETA ) ) |
650 | 1 | equemene | * |
651 | 1 | equemene | PREW = W |
652 | 1 | equemene | * |
653 | 1 | equemene | SIGMA = SIGMA + ETA |
654 | 1 | equemene | DO 170 J = 1, N |
655 | 1 | equemene | WORK( J ) = WORK( J ) + ETA |
656 | 1 | equemene | DELTA( J ) = DELTA( J ) - ETA |
657 | 1 | equemene | 170 CONTINUE |
658 | 1 | equemene | * |
659 | 1 | equemene | * Evaluate PSI and the derivative DPSI |
660 | 1 | equemene | * |
661 | 1 | equemene | DPSI = ZERO |
662 | 1 | equemene | PSI = ZERO |
663 | 1 | equemene | ERRETM = ZERO |
664 | 1 | equemene | DO 180 J = 1, IIM1 |
665 | 1 | equemene | TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) |
666 | 1 | equemene | PSI = PSI + Z( J )*TEMP |
667 | 1 | equemene | DPSI = DPSI + TEMP*TEMP |
668 | 1 | equemene | ERRETM = ERRETM + PSI |
669 | 1 | equemene | 180 CONTINUE |
670 | 1 | equemene | ERRETM = ABS( ERRETM ) |
671 | 1 | equemene | * |
672 | 1 | equemene | * Evaluate PHI and the derivative DPHI |
673 | 1 | equemene | * |
674 | 1 | equemene | DPHI = ZERO |
675 | 1 | equemene | PHI = ZERO |
676 | 1 | equemene | DO 190 J = N, IIP1, -1 |
677 | 1 | equemene | TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) |
678 | 1 | equemene | PHI = PHI + Z( J )*TEMP |
679 | 1 | equemene | DPHI = DPHI + TEMP*TEMP |
680 | 1 | equemene | ERRETM = ERRETM + PHI |
681 | 1 | equemene | 190 CONTINUE |
682 | 1 | equemene | * |
683 | 1 | equemene | TEMP = Z( II ) / ( WORK( II )*DELTA( II ) ) |
684 | 1 | equemene | DW = DPSI + DPHI + TEMP*TEMP |
685 | 1 | equemene | TEMP = Z( II )*TEMP |
686 | 1 | equemene | W = RHOINV + PHI + PSI + TEMP |
687 | 1 | equemene | ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV + |
688 | 1 | equemene | $ THREE*ABS( TEMP ) + ABS( TAU )*DW |
689 | 1 | equemene | * |
690 | 1 | equemene | IF( W.LE.ZERO ) THEN |
691 | 1 | equemene | SG2LB = MAX( SG2LB, TAU ) |
692 | 1 | equemene | ELSE |
693 | 1 | equemene | SG2UB = MIN( SG2UB, TAU ) |
694 | 1 | equemene | END IF |
695 | 1 | equemene | * |
696 | 1 | equemene | SWTCH = .FALSE. |
697 | 1 | equemene | IF( ORGATI ) THEN |
698 | 1 | equemene | IF( -W.GT.ABS( PREW ) / TEN ) |
699 | 1 | equemene | $ SWTCH = .TRUE. |
700 | 1 | equemene | ELSE |
701 | 1 | equemene | IF( W.GT.ABS( PREW ) / TEN ) |
702 | 1 | equemene | $ SWTCH = .TRUE. |
703 | 1 | equemene | END IF |
704 | 1 | equemene | * |
705 | 1 | equemene | * Main loop to update the values of the array DELTA and WORK |
706 | 1 | equemene | * |
707 | 1 | equemene | ITER = NITER + 1 |
708 | 1 | equemene | * |
709 | 1 | equemene | DO 230 NITER = ITER, MAXIT |
710 | 1 | equemene | * |
711 | 1 | equemene | * Test for convergence |
712 | 1 | equemene | * |
713 | 1 | equemene | IF( ABS( W ).LE.EPS*ERRETM ) THEN |
714 | 1 | equemene | GO TO 240 |
715 | 1 | equemene | END IF |
716 | 1 | equemene | * |
717 | 1 | equemene | * Calculate the new step |
718 | 1 | equemene | * |
719 | 1 | equemene | IF( .NOT.SWTCH3 ) THEN |
720 | 1 | equemene | DTIPSQ = WORK( IP1 )*DELTA( IP1 ) |
721 | 1 | equemene | DTISQ = WORK( I )*DELTA( I ) |
722 | 1 | equemene | IF( .NOT.SWTCH ) THEN |
723 | 1 | equemene | IF( ORGATI ) THEN |
724 | 1 | equemene | C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2 |
725 | 1 | equemene | ELSE |
726 | 1 | equemene | C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2 |
727 | 1 | equemene | END IF |
728 | 1 | equemene | ELSE |
729 | 1 | equemene | TEMP = Z( II ) / ( WORK( II )*DELTA( II ) ) |
730 | 1 | equemene | IF( ORGATI ) THEN |
731 | 1 | equemene | DPSI = DPSI + TEMP*TEMP |
732 | 1 | equemene | ELSE |
733 | 1 | equemene | DPHI = DPHI + TEMP*TEMP |
734 | 1 | equemene | END IF |
735 | 1 | equemene | C = W - DTISQ*DPSI - DTIPSQ*DPHI |
736 | 1 | equemene | END IF |
737 | 1 | equemene | A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW |
738 | 1 | equemene | B = DTIPSQ*DTISQ*W |
739 | 1 | equemene | IF( C.EQ.ZERO ) THEN |
740 | 1 | equemene | IF( A.EQ.ZERO ) THEN |
741 | 1 | equemene | IF( .NOT.SWTCH ) THEN |
742 | 1 | equemene | IF( ORGATI ) THEN |
743 | 1 | equemene | A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ* |
744 | 1 | equemene | $ ( DPSI+DPHI ) |
745 | 1 | equemene | ELSE |
746 | 1 | equemene | A = Z( IP1 )*Z( IP1 ) + |
747 | 1 | equemene | $ DTISQ*DTISQ*( DPSI+DPHI ) |
748 | 1 | equemene | END IF |
749 | 1 | equemene | ELSE |
750 | 1 | equemene | A = DTISQ*DTISQ*DPSI + DTIPSQ*DTIPSQ*DPHI |
751 | 1 | equemene | END IF |
752 | 1 | equemene | END IF |
753 | 1 | equemene | ETA = B / A |
754 | 1 | equemene | ELSE IF( A.LE.ZERO ) THEN |
755 | 1 | equemene | ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) |
756 | 1 | equemene | ELSE |
757 | 1 | equemene | ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) |
758 | 1 | equemene | END IF |
759 | 1 | equemene | ELSE |
760 | 1 | equemene | * |
761 | 1 | equemene | * Interpolation using THREE most relevant poles |
762 | 1 | equemene | * |
763 | 1 | equemene | DTIIM = WORK( IIM1 )*DELTA( IIM1 ) |
764 | 1 | equemene | DTIIP = WORK( IIP1 )*DELTA( IIP1 ) |
765 | 1 | equemene | TEMP = RHOINV + PSI + PHI |
766 | 1 | equemene | IF( SWTCH ) THEN |
767 | 1 | equemene | C = TEMP - DTIIM*DPSI - DTIIP*DPHI |
768 | 1 | equemene | ZZ( 1 ) = DTIIM*DTIIM*DPSI |
769 | 1 | equemene | ZZ( 3 ) = DTIIP*DTIIP*DPHI |
770 | 1 | equemene | ELSE |
771 | 1 | equemene | IF( ORGATI ) THEN |
772 | 1 | equemene | TEMP1 = Z( IIM1 ) / DTIIM |
773 | 1 | equemene | TEMP1 = TEMP1*TEMP1 |
774 | 1 | equemene | TEMP2 = ( D( IIM1 )-D( IIP1 ) )* |
775 | 1 | equemene | $ ( D( IIM1 )+D( IIP1 ) )*TEMP1 |
776 | 1 | equemene | C = TEMP - DTIIP*( DPSI+DPHI ) - TEMP2 |
777 | 1 | equemene | ZZ( 1 ) = Z( IIM1 )*Z( IIM1 ) |
778 | 1 | equemene | IF( DPSI.LT.TEMP1 ) THEN |
779 | 1 | equemene | ZZ( 3 ) = DTIIP*DTIIP*DPHI |
780 | 1 | equemene | ELSE |
781 | 1 | equemene | ZZ( 3 ) = DTIIP*DTIIP*( ( DPSI-TEMP1 )+DPHI ) |
782 | 1 | equemene | END IF |
783 | 1 | equemene | ELSE |
784 | 1 | equemene | TEMP1 = Z( IIP1 ) / DTIIP |
785 | 1 | equemene | TEMP1 = TEMP1*TEMP1 |
786 | 1 | equemene | TEMP2 = ( D( IIP1 )-D( IIM1 ) )* |
787 | 1 | equemene | $ ( D( IIM1 )+D( IIP1 ) )*TEMP1 |
788 | 1 | equemene | C = TEMP - DTIIM*( DPSI+DPHI ) - TEMP2 |
789 | 1 | equemene | IF( DPHI.LT.TEMP1 ) THEN |
790 | 1 | equemene | ZZ( 1 ) = DTIIM*DTIIM*DPSI |
791 | 1 | equemene | ELSE |
792 | 1 | equemene | ZZ( 1 ) = DTIIM*DTIIM*( DPSI+( DPHI-TEMP1 ) ) |
793 | 1 | equemene | END IF |
794 | 1 | equemene | ZZ( 3 ) = Z( IIP1 )*Z( IIP1 ) |
795 | 1 | equemene | END IF |
796 | 1 | equemene | END IF |
797 | 1 | equemene | DD( 1 ) = DTIIM |
798 | 1 | equemene | DD( 2 ) = DELTA( II )*WORK( II ) |
799 | 1 | equemene | DD( 3 ) = DTIIP |
800 | 1 | equemene | CALL DLAED6( NITER, ORGATI, C, DD, ZZ, W, ETA, INFO ) |
801 | 1 | equemene | IF( INFO.NE.0 ) |
802 | 1 | equemene | $ GO TO 240 |
803 | 1 | equemene | END IF |
804 | 1 | equemene | * |
805 | 1 | equemene | * Note, eta should be positive if w is negative, and |
806 | 1 | equemene | * eta should be negative otherwise. However, |
807 | 1 | equemene | * if for some reason caused by roundoff, eta*w > 0, |
808 | 1 | equemene | * we simply use one Newton step instead. This way |
809 | 1 | equemene | * will guarantee eta*w < 0. |
810 | 1 | equemene | * |
811 | 1 | equemene | IF( W*ETA.GE.ZERO ) |
812 | 1 | equemene | $ ETA = -W / DW |
813 | 1 | equemene | IF( ORGATI ) THEN |
814 | 1 | equemene | TEMP1 = WORK( I )*DELTA( I ) |
815 | 1 | equemene | TEMP = ETA - TEMP1 |
816 | 1 | equemene | ELSE |
817 | 1 | equemene | TEMP1 = WORK( IP1 )*DELTA( IP1 ) |
818 | 1 | equemene | TEMP = ETA - TEMP1 |
819 | 1 | equemene | END IF |
820 | 1 | equemene | IF( TEMP.GT.SG2UB .OR. TEMP.LT.SG2LB ) THEN |
821 | 1 | equemene | IF( W.LT.ZERO ) THEN |
822 | 1 | equemene | ETA = ( SG2UB-TAU ) / TWO |
823 | 1 | equemene | ELSE |
824 | 1 | equemene | ETA = ( SG2LB-TAU ) / TWO |
825 | 1 | equemene | END IF |
826 | 1 | equemene | END IF |
827 | 1 | equemene | * |
828 | 1 | equemene | TAU = TAU + ETA |
829 | 1 | equemene | ETA = ETA / ( SIGMA+SQRT( SIGMA*SIGMA+ETA ) ) |
830 | 1 | equemene | * |
831 | 1 | equemene | SIGMA = SIGMA + ETA |
832 | 1 | equemene | DO 200 J = 1, N |
833 | 1 | equemene | WORK( J ) = WORK( J ) + ETA |
834 | 1 | equemene | DELTA( J ) = DELTA( J ) - ETA |
835 | 1 | equemene | 200 CONTINUE |
836 | 1 | equemene | * |
837 | 1 | equemene | PREW = W |
838 | 1 | equemene | * |
839 | 1 | equemene | * Evaluate PSI and the derivative DPSI |
840 | 1 | equemene | * |
841 | 1 | equemene | DPSI = ZERO |
842 | 1 | equemene | PSI = ZERO |
843 | 1 | equemene | ERRETM = ZERO |
844 | 1 | equemene | DO 210 J = 1, IIM1 |
845 | 1 | equemene | TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) |
846 | 1 | equemene | PSI = PSI + Z( J )*TEMP |
847 | 1 | equemene | DPSI = DPSI + TEMP*TEMP |
848 | 1 | equemene | ERRETM = ERRETM + PSI |
849 | 1 | equemene | 210 CONTINUE |
850 | 1 | equemene | ERRETM = ABS( ERRETM ) |
851 | 1 | equemene | * |
852 | 1 | equemene | * Evaluate PHI and the derivative DPHI |
853 | 1 | equemene | * |
854 | 1 | equemene | DPHI = ZERO |
855 | 1 | equemene | PHI = ZERO |
856 | 1 | equemene | DO 220 J = N, IIP1, -1 |
857 | 1 | equemene | TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) |
858 | 1 | equemene | PHI = PHI + Z( J )*TEMP |
859 | 1 | equemene | DPHI = DPHI + TEMP*TEMP |
860 | 1 | equemene | ERRETM = ERRETM + PHI |
861 | 1 | equemene | 220 CONTINUE |
862 | 1 | equemene | * |
863 | 1 | equemene | TEMP = Z( II ) / ( WORK( II )*DELTA( II ) ) |
864 | 1 | equemene | DW = DPSI + DPHI + TEMP*TEMP |
865 | 1 | equemene | TEMP = Z( II )*TEMP |
866 | 1 | equemene | W = RHOINV + PHI + PSI + TEMP |
867 | 1 | equemene | ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV + |
868 | 1 | equemene | $ THREE*ABS( TEMP ) + ABS( TAU )*DW |
869 | 1 | equemene | IF( W*PREW.GT.ZERO .AND. ABS( W ).GT.ABS( PREW ) / TEN ) |
870 | 1 | equemene | $ SWTCH = .NOT.SWTCH |
871 | 1 | equemene | * |
872 | 1 | equemene | IF( W.LE.ZERO ) THEN |
873 | 1 | equemene | SG2LB = MAX( SG2LB, TAU ) |
874 | 1 | equemene | ELSE |
875 | 1 | equemene | SG2UB = MIN( SG2UB, TAU ) |
876 | 1 | equemene | END IF |
877 | 1 | equemene | * |
878 | 1 | equemene | 230 CONTINUE |
879 | 1 | equemene | * |
880 | 1 | equemene | * Return with INFO = 1, NITER = MAXIT and not converged |
881 | 1 | equemene | * |
882 | 1 | equemene | INFO = 1 |
883 | 1 | equemene | * |
884 | 1 | equemene | END IF |
885 | 1 | equemene | * |
886 | 1 | equemene | 240 CONTINUE |
887 | 1 | equemene | RETURN |
888 | 1 | equemene | * |
889 | 1 | equemene | * End of DLASD4 |
890 | 1 | equemene | * |
891 | 1 | equemene | END |