File:  [local] / rpl / lapack / lapack / dlasq4.f
Revision 1.8: download - view: text, annotated - select for diffs - revision graph
Fri Jul 22 07:38:08 2011 UTC (12 years, 9 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_3, rpl-4_1_2, rpl-4_1_1, HEAD
En route vers la 4.4.1.

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

CVSweb interface <joel.bertrand@systella.fr>