Annotation of rpl/lapack/lapack/dlasq5.f, revision 1.5

1.1       bertrand    1:       SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
                      2:      $                   DNM1, DNM2, IEEE )
                      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:       LOGICAL            IEEE
                     16:       INTEGER            I0, N0, PP
                     17:       DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU
                     18: *     ..
                     19: *     .. Array Arguments ..
                     20:       DOUBLE PRECISION   Z( * )
                     21: *     ..
                     22: *
                     23: *  Purpose
                     24: *  =======
                     25: *
                     26: *  DLASQ5 computes one dqds transform in ping-pong form, one
                     27: *  version for IEEE machines another for non IEEE machines.
                     28: *
                     29: *  Arguments
                     30: *  =========
                     31: *
                     32: *  I0    (input) INTEGER
                     33: *        First index.
                     34: *
                     35: *  N0    (input) INTEGER
                     36: *        Last index.
                     37: *
                     38: *  Z     (input) DOUBLE PRECISION array, dimension ( 4*N )
                     39: *        Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
                     40: *        an extra argument.
                     41: *
                     42: *  PP    (input) INTEGER
                     43: *        PP=0 for ping, PP=1 for pong.
                     44: *
                     45: *  TAU   (input) DOUBLE PRECISION
                     46: *        This is the shift.
                     47: *
                     48: *  DMIN  (output) DOUBLE PRECISION
                     49: *        Minimum value of d.
                     50: *
                     51: *  DMIN1 (output) DOUBLE PRECISION
                     52: *        Minimum value of d, excluding D( N0 ).
                     53: *
                     54: *  DMIN2 (output) DOUBLE PRECISION
                     55: *        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
                     56: *
                     57: *  DN    (output) DOUBLE PRECISION
                     58: *        d(N0), the last value of d.
                     59: *
                     60: *  DNM1  (output) DOUBLE PRECISION
                     61: *        d(N0-1).
                     62: *
                     63: *  DNM2  (output) DOUBLE PRECISION
                     64: *        d(N0-2).
                     65: *
                     66: *  IEEE  (input) LOGICAL
                     67: *        Flag for IEEE or non IEEE arithmetic.
                     68: *
                     69: *  =====================================================================
                     70: *
                     71: *     .. Parameter ..
                     72:       DOUBLE PRECISION   ZERO
                     73:       PARAMETER          ( ZERO = 0.0D0 )
                     74: *     ..
                     75: *     .. Local Scalars ..
                     76:       INTEGER            J4, J4P2
                     77:       DOUBLE PRECISION   D, EMIN, TEMP
                     78: *     ..
                     79: *     .. Intrinsic Functions ..
                     80:       INTRINSIC          MIN
                     81: *     ..
                     82: *     .. Executable Statements ..
                     83: *
                     84:       IF( ( N0-I0-1 ).LE.0 )
                     85:      $   RETURN
                     86: *
                     87:       J4 = 4*I0 + PP - 3
                     88:       EMIN = Z( J4+4 ) 
                     89:       D = Z( J4 ) - TAU
                     90:       DMIN = D
                     91:       DMIN1 = -Z( J4 )
                     92: *
                     93:       IF( IEEE ) THEN
                     94: *
                     95: *        Code for IEEE arithmetic.
                     96: *
                     97:          IF( PP.EQ.0 ) THEN
                     98:             DO 10 J4 = 4*I0, 4*( N0-3 ), 4
                     99:                Z( J4-2 ) = D + Z( J4-1 ) 
                    100:                TEMP = Z( J4+1 ) / Z( J4-2 )
                    101:                D = D*TEMP - TAU
                    102:                DMIN = MIN( DMIN, D )
                    103:                Z( J4 ) = Z( J4-1 )*TEMP
                    104:                EMIN = MIN( Z( J4 ), EMIN )
                    105:    10       CONTINUE
                    106:          ELSE
                    107:             DO 20 J4 = 4*I0, 4*( N0-3 ), 4
                    108:                Z( J4-3 ) = D + Z( J4 ) 
                    109:                TEMP = Z( J4+2 ) / Z( J4-3 )
                    110:                D = D*TEMP - TAU
                    111:                DMIN = MIN( DMIN, D )
                    112:                Z( J4-1 ) = Z( J4 )*TEMP
                    113:                EMIN = MIN( Z( J4-1 ), EMIN )
                    114:    20       CONTINUE
                    115:          END IF
                    116: *
                    117: *        Unroll last two steps. 
                    118: *
                    119:          DNM2 = D
                    120:          DMIN2 = DMIN
                    121:          J4 = 4*( N0-2 ) - PP
                    122:          J4P2 = J4 + 2*PP - 1
                    123:          Z( J4-2 ) = DNM2 + Z( J4P2 )
                    124:          Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
                    125:          DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
                    126:          DMIN = MIN( DMIN, DNM1 )
                    127: *
                    128:          DMIN1 = DMIN
                    129:          J4 = J4 + 4
                    130:          J4P2 = J4 + 2*PP - 1
                    131:          Z( J4-2 ) = DNM1 + Z( J4P2 )
                    132:          Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
                    133:          DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
                    134:          DMIN = MIN( DMIN, DN )
                    135: *
                    136:       ELSE
                    137: *
                    138: *        Code for non IEEE arithmetic.
                    139: *
                    140:          IF( PP.EQ.0 ) THEN
                    141:             DO 30 J4 = 4*I0, 4*( N0-3 ), 4
                    142:                Z( J4-2 ) = D + Z( J4-1 ) 
                    143:                IF( D.LT.ZERO ) THEN
                    144:                   RETURN
                    145:                ELSE 
                    146:                   Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
                    147:                   D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
                    148:                END IF
                    149:                DMIN = MIN( DMIN, D )
                    150:                EMIN = MIN( EMIN, Z( J4 ) )
                    151:    30       CONTINUE
                    152:          ELSE
                    153:             DO 40 J4 = 4*I0, 4*( N0-3 ), 4
                    154:                Z( J4-3 ) = D + Z( J4 ) 
                    155:                IF( D.LT.ZERO ) THEN
                    156:                   RETURN
                    157:                ELSE 
                    158:                   Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
                    159:                   D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
                    160:                END IF
                    161:                DMIN = MIN( DMIN, D )
                    162:                EMIN = MIN( EMIN, Z( J4-1 ) )
                    163:    40       CONTINUE
                    164:          END IF
                    165: *
                    166: *        Unroll last two steps. 
                    167: *
                    168:          DNM2 = D
                    169:          DMIN2 = DMIN
                    170:          J4 = 4*( N0-2 ) - PP
                    171:          J4P2 = J4 + 2*PP - 1
                    172:          Z( J4-2 ) = DNM2 + Z( J4P2 )
                    173:          IF( DNM2.LT.ZERO ) THEN
                    174:             RETURN
                    175:          ELSE
                    176:             Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
                    177:             DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
                    178:          END IF
                    179:          DMIN = MIN( DMIN, DNM1 )
                    180: *
                    181:          DMIN1 = DMIN
                    182:          J4 = J4 + 4
                    183:          J4P2 = J4 + 2*PP - 1
                    184:          Z( J4-2 ) = DNM1 + Z( J4P2 )
                    185:          IF( DNM1.LT.ZERO ) THEN
                    186:             RETURN
                    187:          ELSE
                    188:             Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
                    189:             DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
                    190:          END IF
                    191:          DMIN = MIN( DMIN, DN )
                    192: *
                    193:       END IF
                    194: *
                    195:       Z( J4+2 ) = DN
                    196:       Z( 4*N0-PP ) = EMIN
                    197:       RETURN
                    198: *
                    199: *     End of DLASQ5
                    200: *
                    201:       END

CVSweb interface <joel.bertrand@systella.fr>