Annotation of rpl/lapack/lapack/dlasd5.f, revision 1.8

1.8     ! bertrand    1: *> \brief \b DLASD5
        !             2: *
        !             3: *  =========== DOCUMENTATION ===========
        !             4: *
        !             5: * Online html documentation available at 
        !             6: *            http://www.netlib.org/lapack/explore-html/ 
        !             7: *
        !             8: *> \htmlonly
        !             9: *> Download DLASD5 + dependencies 
        !            10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlasd5.f"> 
        !            11: *> [TGZ]</a> 
        !            12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlasd5.f"> 
        !            13: *> [ZIP]</a> 
        !            14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlasd5.f"> 
        !            15: *> [TXT]</a>
        !            16: *> \endhtmlonly 
        !            17: *
        !            18: *  Definition:
        !            19: *  ===========
        !            20: *
        !            21: *       SUBROUTINE DLASD5( I, D, Z, DELTA, RHO, DSIGMA, WORK )
        !            22: * 
        !            23: *       .. Scalar Arguments ..
        !            24: *       INTEGER            I
        !            25: *       DOUBLE PRECISION   DSIGMA, RHO
        !            26: *       ..
        !            27: *       .. Array Arguments ..
        !            28: *       DOUBLE PRECISION   D( 2 ), DELTA( 2 ), WORK( 2 ), Z( 2 )
        !            29: *       ..
        !            30: *  
        !            31: *
        !            32: *> \par Purpose:
        !            33: *  =============
        !            34: *>
        !            35: *> \verbatim
        !            36: *>
        !            37: *> This subroutine computes the square root of the I-th eigenvalue
        !            38: *> of a positive symmetric rank-one modification of a 2-by-2 diagonal
        !            39: *> matrix
        !            40: *>
        !            41: *>            diag( D ) * diag( D ) +  RHO * Z * transpose(Z) .
        !            42: *>
        !            43: *> The diagonal entries in the array D are assumed to satisfy
        !            44: *>
        !            45: *>            0 <= D(i) < D(j)  for  i < j .
        !            46: *>
        !            47: *> We also assume RHO > 0 and that the Euclidean norm of the vector
        !            48: *> Z is one.
        !            49: *> \endverbatim
        !            50: *
        !            51: *  Arguments:
        !            52: *  ==========
        !            53: *
        !            54: *> \param[in] I
        !            55: *> \verbatim
        !            56: *>          I is INTEGER
        !            57: *>         The index of the eigenvalue to be computed.  I = 1 or I = 2.
        !            58: *> \endverbatim
        !            59: *>
        !            60: *> \param[in] D
        !            61: *> \verbatim
        !            62: *>          D is DOUBLE PRECISION array, dimension ( 2 )
        !            63: *>         The original eigenvalues.  We assume 0 <= D(1) < D(2).
        !            64: *> \endverbatim
        !            65: *>
        !            66: *> \param[in] Z
        !            67: *> \verbatim
        !            68: *>          Z is DOUBLE PRECISION array, dimension ( 2 )
        !            69: *>         The components of the updating vector.
        !            70: *> \endverbatim
        !            71: *>
        !            72: *> \param[out] DELTA
        !            73: *> \verbatim
        !            74: *>          DELTA is DOUBLE PRECISION array, dimension ( 2 )
        !            75: *>         Contains (D(j) - sigma_I) in its  j-th component.
        !            76: *>         The vector DELTA contains the information necessary
        !            77: *>         to construct the eigenvectors.
        !            78: *> \endverbatim
        !            79: *>
        !            80: *> \param[in] RHO
        !            81: *> \verbatim
        !            82: *>          RHO is DOUBLE PRECISION
        !            83: *>         The scalar in the symmetric updating formula.
        !            84: *> \endverbatim
        !            85: *>
        !            86: *> \param[out] DSIGMA
        !            87: *> \verbatim
        !            88: *>          DSIGMA is DOUBLE PRECISION
        !            89: *>         The computed sigma_I, the I-th updated eigenvalue.
        !            90: *> \endverbatim
        !            91: *>
        !            92: *> \param[out] WORK
        !            93: *> \verbatim
        !            94: *>          WORK is DOUBLE PRECISION array, dimension ( 2 )
        !            95: *>         WORK contains (D(j) + sigma_I) in its  j-th component.
        !            96: *> \endverbatim
        !            97: *
        !            98: *  Authors:
        !            99: *  ========
        !           100: *
        !           101: *> \author Univ. of Tennessee 
        !           102: *> \author Univ. of California Berkeley 
        !           103: *> \author Univ. of Colorado Denver 
        !           104: *> \author NAG Ltd. 
        !           105: *
        !           106: *> \date November 2011
        !           107: *
        !           108: *> \ingroup auxOTHERauxiliary
        !           109: *
        !           110: *> \par Contributors:
        !           111: *  ==================
        !           112: *>
        !           113: *>     Ren-Cang Li, Computer Science Division, University of California
        !           114: *>     at Berkeley, USA
        !           115: *>
        !           116: *  =====================================================================
1.1       bertrand  117:       SUBROUTINE DLASD5( I, D, Z, DELTA, RHO, DSIGMA, WORK )
                    118: *
1.8     ! bertrand  119: *  -- LAPACK auxiliary routine (version 3.4.0) --
1.1       bertrand  120: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
                    121: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
1.8     ! bertrand  122: *     November 2011
1.1       bertrand  123: *
                    124: *     .. Scalar Arguments ..
                    125:       INTEGER            I
                    126:       DOUBLE PRECISION   DSIGMA, RHO
                    127: *     ..
                    128: *     .. Array Arguments ..
                    129:       DOUBLE PRECISION   D( 2 ), DELTA( 2 ), WORK( 2 ), Z( 2 )
                    130: *     ..
                    131: *
                    132: *  =====================================================================
                    133: *
                    134: *     .. Parameters ..
                    135:       DOUBLE PRECISION   ZERO, ONE, TWO, THREE, FOUR
                    136:       PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0,
                    137:      $                   THREE = 3.0D+0, FOUR = 4.0D+0 )
                    138: *     ..
                    139: *     .. Local Scalars ..
                    140:       DOUBLE PRECISION   B, C, DEL, DELSQ, TAU, W
                    141: *     ..
                    142: *     .. Intrinsic Functions ..
                    143:       INTRINSIC          ABS, SQRT
                    144: *     ..
                    145: *     .. Executable Statements ..
                    146: *
                    147:       DEL = D( 2 ) - D( 1 )
                    148:       DELSQ = DEL*( D( 2 )+D( 1 ) )
                    149:       IF( I.EQ.1 ) THEN
                    150:          W = ONE + FOUR*RHO*( Z( 2 )*Z( 2 ) / ( D( 1 )+THREE*D( 2 ) )-
                    151:      $       Z( 1 )*Z( 1 ) / ( THREE*D( 1 )+D( 2 ) ) ) / DEL
                    152:          IF( W.GT.ZERO ) THEN
                    153:             B = DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) )
                    154:             C = RHO*Z( 1 )*Z( 1 )*DELSQ
                    155: *
                    156: *           B > ZERO, always
                    157: *
                    158: *           The following TAU is DSIGMA * DSIGMA - D( 1 ) * D( 1 )
                    159: *
                    160:             TAU = TWO*C / ( B+SQRT( ABS( B*B-FOUR*C ) ) )
                    161: *
                    162: *           The following TAU is DSIGMA - D( 1 )
                    163: *
                    164:             TAU = TAU / ( D( 1 )+SQRT( D( 1 )*D( 1 )+TAU ) )
                    165:             DSIGMA = D( 1 ) + TAU
                    166:             DELTA( 1 ) = -TAU
                    167:             DELTA( 2 ) = DEL - TAU
                    168:             WORK( 1 ) = TWO*D( 1 ) + TAU
                    169:             WORK( 2 ) = ( D( 1 )+TAU ) + D( 2 )
                    170: *           DELTA( 1 ) = -Z( 1 ) / TAU
                    171: *           DELTA( 2 ) = Z( 2 ) / ( DEL-TAU )
                    172:          ELSE
                    173:             B = -DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) )
                    174:             C = RHO*Z( 2 )*Z( 2 )*DELSQ
                    175: *
                    176: *           The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 )
                    177: *
                    178:             IF( B.GT.ZERO ) THEN
                    179:                TAU = -TWO*C / ( B+SQRT( B*B+FOUR*C ) )
                    180:             ELSE
                    181:                TAU = ( B-SQRT( B*B+FOUR*C ) ) / TWO
                    182:             END IF
                    183: *
                    184: *           The following TAU is DSIGMA - D( 2 )
                    185: *
                    186:             TAU = TAU / ( D( 2 )+SQRT( ABS( D( 2 )*D( 2 )+TAU ) ) )
                    187:             DSIGMA = D( 2 ) + TAU
                    188:             DELTA( 1 ) = -( DEL+TAU )
                    189:             DELTA( 2 ) = -TAU
                    190:             WORK( 1 ) = D( 1 ) + TAU + D( 2 )
                    191:             WORK( 2 ) = TWO*D( 2 ) + TAU
                    192: *           DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU )
                    193: *           DELTA( 2 ) = -Z( 2 ) / TAU
                    194:          END IF
                    195: *        TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) )
                    196: *        DELTA( 1 ) = DELTA( 1 ) / TEMP
                    197: *        DELTA( 2 ) = DELTA( 2 ) / TEMP
                    198:       ELSE
                    199: *
                    200: *        Now I=2
                    201: *
                    202:          B = -DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) )
                    203:          C = RHO*Z( 2 )*Z( 2 )*DELSQ
                    204: *
                    205: *        The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 )
                    206: *
                    207:          IF( B.GT.ZERO ) THEN
                    208:             TAU = ( B+SQRT( B*B+FOUR*C ) ) / TWO
                    209:          ELSE
                    210:             TAU = TWO*C / ( -B+SQRT( B*B+FOUR*C ) )
                    211:          END IF
                    212: *
                    213: *        The following TAU is DSIGMA - D( 2 )
                    214: *
                    215:          TAU = TAU / ( D( 2 )+SQRT( D( 2 )*D( 2 )+TAU ) )
                    216:          DSIGMA = D( 2 ) + TAU
                    217:          DELTA( 1 ) = -( DEL+TAU )
                    218:          DELTA( 2 ) = -TAU
                    219:          WORK( 1 ) = D( 1 ) + TAU + D( 2 )
                    220:          WORK( 2 ) = TWO*D( 2 ) + TAU
                    221: *        DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU )
                    222: *        DELTA( 2 ) = -Z( 2 ) / TAU
                    223: *        TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) )
                    224: *        DELTA( 1 ) = DELTA( 1 ) / TEMP
                    225: *        DELTA( 2 ) = DELTA( 2 ) / TEMP
                    226:       END IF
                    227:       RETURN
                    228: *
                    229: *     End of DLASD5
                    230: *
                    231:       END

CVSweb interface <joel.bertrand@systella.fr>