Statistiques
| Révision :

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

Historique | Voir | Annoter | Télécharger (27,1 ko)

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