Annotation of rpl/lapack/lapack/dlaed4.f, revision 1.1

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

CVSweb interface <joel.bertrand@systella.fr>