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

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>