Annotation of rpl/lapack/lapack/dlasq4.f, revision 1.6

1.1       bertrand    1:       SUBROUTINE DLASQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN,
                      2:      $                   DN1, DN2, TAU, TTYPE, G )
                      3: *
                      4: *  -- LAPACK routine (version 3.2)                                    --
                      5: *
                      6: *  -- Contributed by Osni Marques of the Lawrence Berkeley National   --
                      7: *  -- Laboratory and Beresford Parlett of the Univ. of California at  --
                      8: *  -- Berkeley                                                        --
                      9: *  -- November 2008                                                   --
                     10: *
                     11: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
                     12: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
                     13: *
                     14: *     .. Scalar Arguments ..
                     15:       INTEGER            I0, N0, N0IN, PP, TTYPE
                     16:       DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, TAU
                     17: *     ..
                     18: *     .. Array Arguments ..
                     19:       DOUBLE PRECISION   Z( * )
                     20: *     ..
                     21: *
                     22: *  Purpose
                     23: *  =======
                     24: *
                     25: *  DLASQ4 computes an approximation TAU to the smallest eigenvalue
                     26: *  using values of d from the previous transform.
                     27: *
                     28: *  I0    (input) INTEGER
                     29: *        First index.
                     30: *
                     31: *  N0    (input) INTEGER
                     32: *        Last index.
                     33: *
                     34: *  Z     (input) DOUBLE PRECISION array, dimension ( 4*N )
                     35: *        Z holds the qd array.
                     36: *
                     37: *  PP    (input) INTEGER
                     38: *        PP=0 for ping, PP=1 for pong.
                     39: *
                     40: *  NOIN  (input) INTEGER
                     41: *        The value of N0 at start of EIGTEST.
                     42: *
                     43: *  DMIN  (input) DOUBLE PRECISION
                     44: *        Minimum value of d.
                     45: *
                     46: *  DMIN1 (input) DOUBLE PRECISION
                     47: *        Minimum value of d, excluding D( N0 ).
                     48: *
                     49: *  DMIN2 (input) DOUBLE PRECISION
                     50: *        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
                     51: *
                     52: *  DN    (input) DOUBLE PRECISION
                     53: *        d(N)
                     54: *
                     55: *  DN1   (input) DOUBLE PRECISION
                     56: *        d(N-1)
                     57: *
                     58: *  DN2   (input) DOUBLE PRECISION
                     59: *        d(N-2)
                     60: *
                     61: *  TAU   (output) DOUBLE PRECISION
                     62: *        This is the shift.
                     63: *
                     64: *  TTYPE (output) INTEGER
                     65: *        Shift type.
                     66: *
                     67: *  G     (input/output) REAL
                     68: *        G is passed as an argument in order to save its value between
                     69: *        calls to DLASQ4.
                     70: *
                     71: *  Further Details
                     72: *  ===============
                     73: *  CNST1 = 9/16
                     74: *
                     75: *  =====================================================================
                     76: *
                     77: *     .. Parameters ..
                     78:       DOUBLE PRECISION   CNST1, CNST2, CNST3
                     79:       PARAMETER          ( CNST1 = 0.5630D0, CNST2 = 1.010D0,
                     80:      $                   CNST3 = 1.050D0 )
                     81:       DOUBLE PRECISION   QURTR, THIRD, HALF, ZERO, ONE, TWO, HUNDRD
                     82:       PARAMETER          ( QURTR = 0.250D0, THIRD = 0.3330D0,
                     83:      $                   HALF = 0.50D0, ZERO = 0.0D0, ONE = 1.0D0,
                     84:      $                   TWO = 2.0D0, HUNDRD = 100.0D0 )
                     85: *     ..
                     86: *     .. Local Scalars ..
                     87:       INTEGER            I4, NN, NP
                     88:       DOUBLE PRECISION   A2, B1, B2, GAM, GAP1, GAP2, S
                     89: *     ..
                     90: *     .. Intrinsic Functions ..
                     91:       INTRINSIC          MAX, MIN, SQRT
                     92: *     ..
                     93: *     .. Executable Statements ..
                     94: *
                     95: *     A negative DMIN forces the shift to take that absolute value
                     96: *     TTYPE records the type of shift.
                     97: *
                     98:       IF( DMIN.LE.ZERO ) THEN
                     99:          TAU = -DMIN
                    100:          TTYPE = -1
                    101:          RETURN
                    102:       END IF
                    103: *       
                    104:       NN = 4*N0 + PP
                    105:       IF( N0IN.EQ.N0 ) THEN
                    106: *
                    107: *        No eigenvalues deflated.
                    108: *
                    109:          IF( DMIN.EQ.DN .OR. DMIN.EQ.DN1 ) THEN
                    110: *
                    111:             B1 = SQRT( Z( NN-3 ) )*SQRT( Z( NN-5 ) )
                    112:             B2 = SQRT( Z( NN-7 ) )*SQRT( Z( NN-9 ) )
                    113:             A2 = Z( NN-7 ) + Z( NN-5 )
                    114: *
                    115: *           Cases 2 and 3.
                    116: *
                    117:             IF( DMIN.EQ.DN .AND. DMIN1.EQ.DN1 ) THEN
                    118:                GAP2 = DMIN2 - A2 - DMIN2*QURTR
                    119:                IF( GAP2.GT.ZERO .AND. GAP2.GT.B2 ) THEN
                    120:                   GAP1 = A2 - DN - ( B2 / GAP2 )*B2
                    121:                ELSE
                    122:                   GAP1 = A2 - DN - ( B1+B2 )
                    123:                END IF
                    124:                IF( GAP1.GT.ZERO .AND. GAP1.GT.B1 ) THEN
                    125:                   S = MAX( DN-( B1 / GAP1 )*B1, HALF*DMIN )
                    126:                   TTYPE = -2
                    127:                ELSE
                    128:                   S = ZERO
                    129:                   IF( DN.GT.B1 )
                    130:      $               S = DN - B1
                    131:                   IF( A2.GT.( B1+B2 ) )
                    132:      $               S = MIN( S, A2-( B1+B2 ) )
                    133:                   S = MAX( S, THIRD*DMIN )
                    134:                   TTYPE = -3
                    135:                END IF
                    136:             ELSE
                    137: *
                    138: *              Case 4.
                    139: *
                    140:                TTYPE = -4
                    141:                S = QURTR*DMIN
                    142:                IF( DMIN.EQ.DN ) THEN
                    143:                   GAM = DN
                    144:                   A2 = ZERO
                    145:                   IF( Z( NN-5 ) .GT. Z( NN-7 ) )
                    146:      $               RETURN
                    147:                   B2 = Z( NN-5 ) / Z( NN-7 )
                    148:                   NP = NN - 9
                    149:                ELSE
                    150:                   NP = NN - 2*PP
                    151:                   B2 = Z( NP-2 )
                    152:                   GAM = DN1
                    153:                   IF( Z( NP-4 ) .GT. Z( NP-2 ) )
                    154:      $               RETURN
                    155:                   A2 = Z( NP-4 ) / Z( NP-2 )
                    156:                   IF( Z( NN-9 ) .GT. Z( NN-11 ) )
                    157:      $               RETURN
                    158:                   B2 = Z( NN-9 ) / Z( NN-11 )
                    159:                   NP = NN - 13
                    160:                END IF
                    161: *
                    162: *              Approximate contribution to norm squared from I < NN-1.
                    163: *
                    164:                A2 = A2 + B2
                    165:                DO 10 I4 = NP, 4*I0 - 1 + PP, -4
                    166:                   IF( B2.EQ.ZERO )
                    167:      $               GO TO 20
                    168:                   B1 = B2
                    169:                   IF( Z( I4 ) .GT. Z( I4-2 ) )
                    170:      $               RETURN
                    171:                   B2 = B2*( Z( I4 ) / Z( I4-2 ) )
                    172:                   A2 = A2 + B2
                    173:                   IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) 
                    174:      $               GO TO 20
                    175:    10          CONTINUE
                    176:    20          CONTINUE
                    177:                A2 = CNST3*A2
                    178: *
                    179: *              Rayleigh quotient residual bound.
                    180: *
                    181:                IF( A2.LT.CNST1 )
                    182:      $            S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 )
                    183:             END IF
                    184:          ELSE IF( DMIN.EQ.DN2 ) THEN
                    185: *
                    186: *           Case 5.
                    187: *
                    188:             TTYPE = -5
                    189:             S = QURTR*DMIN
                    190: *
                    191: *           Compute contribution to norm squared from I > NN-2.
                    192: *
                    193:             NP = NN - 2*PP
                    194:             B1 = Z( NP-2 )
                    195:             B2 = Z( NP-6 )
                    196:             GAM = DN2
                    197:             IF( Z( NP-8 ).GT.B2 .OR. Z( NP-4 ).GT.B1 )
                    198:      $         RETURN
                    199:             A2 = ( Z( NP-8 ) / B2 )*( ONE+Z( NP-4 ) / B1 )
                    200: *
                    201: *           Approximate contribution to norm squared from I < NN-2.
                    202: *
                    203:             IF( N0-I0.GT.2 ) THEN
                    204:                B2 = Z( NN-13 ) / Z( NN-15 )
                    205:                A2 = A2 + B2
                    206:                DO 30 I4 = NN - 17, 4*I0 - 1 + PP, -4
                    207:                   IF( B2.EQ.ZERO )
                    208:      $               GO TO 40
                    209:                   B1 = B2
                    210:                   IF( Z( I4 ) .GT. Z( I4-2 ) )
                    211:      $               RETURN
                    212:                   B2 = B2*( Z( I4 ) / Z( I4-2 ) )
                    213:                   A2 = A2 + B2
                    214:                   IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) 
                    215:      $               GO TO 40
                    216:    30          CONTINUE
                    217:    40          CONTINUE
                    218:                A2 = CNST3*A2
                    219:             END IF
                    220: *
                    221:             IF( A2.LT.CNST1 )
                    222:      $         S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 )
                    223:          ELSE
                    224: *
                    225: *           Case 6, no information to guide us.
                    226: *
                    227:             IF( TTYPE.EQ.-6 ) THEN
                    228:                G = G + THIRD*( ONE-G )
                    229:             ELSE IF( TTYPE.EQ.-18 ) THEN
                    230:                G = QURTR*THIRD
                    231:             ELSE
                    232:                G = QURTR
                    233:             END IF
                    234:             S = G*DMIN
                    235:             TTYPE = -6
                    236:          END IF
                    237: *
                    238:       ELSE IF( N0IN.EQ.( N0+1 ) ) THEN
                    239: *
                    240: *        One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN.
                    241: *
                    242:          IF( DMIN1.EQ.DN1 .AND. DMIN2.EQ.DN2 ) THEN 
                    243: *
                    244: *           Cases 7 and 8.
                    245: *
                    246:             TTYPE = -7
                    247:             S = THIRD*DMIN1
                    248:             IF( Z( NN-5 ).GT.Z( NN-7 ) )
                    249:      $         RETURN
                    250:             B1 = Z( NN-5 ) / Z( NN-7 )
                    251:             B2 = B1
                    252:             IF( B2.EQ.ZERO )
                    253:      $         GO TO 60
                    254:             DO 50 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4
                    255:                A2 = B1
                    256:                IF( Z( I4 ).GT.Z( I4-2 ) )
                    257:      $            RETURN
                    258:                B1 = B1*( Z( I4 ) / Z( I4-2 ) )
                    259:                B2 = B2 + B1
                    260:                IF( HUNDRD*MAX( B1, A2 ).LT.B2 ) 
                    261:      $            GO TO 60
                    262:    50       CONTINUE
                    263:    60       CONTINUE
                    264:             B2 = SQRT( CNST3*B2 )
                    265:             A2 = DMIN1 / ( ONE+B2**2 )
                    266:             GAP2 = HALF*DMIN2 - A2
                    267:             IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN
                    268:                S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) )
                    269:             ELSE 
                    270:                S = MAX( S, A2*( ONE-CNST2*B2 ) )
                    271:                TTYPE = -8
                    272:             END IF
                    273:          ELSE
                    274: *
                    275: *           Case 9.
                    276: *
                    277:             S = QURTR*DMIN1
                    278:             IF( DMIN1.EQ.DN1 )
                    279:      $         S = HALF*DMIN1
                    280:             TTYPE = -9
                    281:          END IF
                    282: *
                    283:       ELSE IF( N0IN.EQ.( N0+2 ) ) THEN
                    284: *
                    285: *        Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN.
                    286: *
                    287: *        Cases 10 and 11.
                    288: *
                    289:          IF( DMIN2.EQ.DN2 .AND. TWO*Z( NN-5 ).LT.Z( NN-7 ) ) THEN 
                    290:             TTYPE = -10
                    291:             S = THIRD*DMIN2
                    292:             IF( Z( NN-5 ).GT.Z( NN-7 ) )
                    293:      $         RETURN
                    294:             B1 = Z( NN-5 ) / Z( NN-7 )
                    295:             B2 = B1
                    296:             IF( B2.EQ.ZERO )
                    297:      $         GO TO 80
                    298:             DO 70 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4
                    299:                IF( Z( I4 ).GT.Z( I4-2 ) )
                    300:      $            RETURN
                    301:                B1 = B1*( Z( I4 ) / Z( I4-2 ) )
                    302:                B2 = B2 + B1
                    303:                IF( HUNDRD*B1.LT.B2 )
                    304:      $            GO TO 80
                    305:    70       CONTINUE
                    306:    80       CONTINUE
                    307:             B2 = SQRT( CNST3*B2 )
                    308:             A2 = DMIN2 / ( ONE+B2**2 )
                    309:             GAP2 = Z( NN-7 ) + Z( NN-9 ) -
                    310:      $             SQRT( Z( NN-11 ) )*SQRT( Z( NN-9 ) ) - A2
                    311:             IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN
                    312:                S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) )
                    313:             ELSE 
                    314:                S = MAX( S, A2*( ONE-CNST2*B2 ) )
                    315:             END IF
                    316:          ELSE
                    317:             S = QURTR*DMIN2
                    318:             TTYPE = -11
                    319:          END IF
                    320:       ELSE IF( N0IN.GT.( N0+2 ) ) THEN
                    321: *
                    322: *        Case 12, more than two eigenvalues deflated. No information.
                    323: *
                    324:          S = ZERO 
                    325:          TTYPE = -12
                    326:       END IF
                    327: *
                    328:       TAU = S
                    329:       RETURN
                    330: *
                    331: *     End of DLASQ4
                    332: *
                    333:       END

CVSweb interface <joel.bertrand@systella.fr>