Statistiques
| Révision :

root / src / lapack / double / dlasd4.f @ 1

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