![]() |
LAPACK
3.4.1
LAPACK: Linear Algebra PACKage
|
00001 *> \brief \b DLAED5 00002 * 00003 * =========== DOCUMENTATION =========== 00004 * 00005 * Online html documentation available at 00006 * http://www.netlib.org/lapack/explore-html/ 00007 * 00008 *> \htmlonly 00009 *> Download DLAED5 + dependencies 00010 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlaed5.f"> 00011 *> [TGZ]</a> 00012 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlaed5.f"> 00013 *> [ZIP]</a> 00014 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlaed5.f"> 00015 *> [TXT]</a> 00016 *> \endhtmlonly 00017 * 00018 * Definition: 00019 * =========== 00020 * 00021 * SUBROUTINE DLAED5( I, D, Z, DELTA, RHO, DLAM ) 00022 * 00023 * .. Scalar Arguments .. 00024 * INTEGER I 00025 * DOUBLE PRECISION DLAM, RHO 00026 * .. 00027 * .. Array Arguments .. 00028 * DOUBLE PRECISION D( 2 ), DELTA( 2 ), Z( 2 ) 00029 * .. 00030 * 00031 * 00032 *> \par Purpose: 00033 * ============= 00034 *> 00035 *> \verbatim 00036 *> 00037 *> This subroutine computes the I-th eigenvalue of a symmetric rank-one 00038 *> modification of a 2-by-2 diagonal matrix 00039 *> 00040 *> diag( D ) + RHO * Z * transpose(Z) . 00041 *> 00042 *> The diagonal elements in the array D are assumed to satisfy 00043 *> 00044 *> D(i) < D(j) for i < j . 00045 *> 00046 *> We also assume RHO > 0 and that the Euclidean norm of the vector 00047 *> Z is one. 00048 *> \endverbatim 00049 * 00050 * Arguments: 00051 * ========== 00052 * 00053 *> \param[in] I 00054 *> \verbatim 00055 *> I is INTEGER 00056 *> The index of the eigenvalue to be computed. I = 1 or I = 2. 00057 *> \endverbatim 00058 *> 00059 *> \param[in] D 00060 *> \verbatim 00061 *> D is DOUBLE PRECISION array, dimension (2) 00062 *> The original eigenvalues. We assume D(1) < D(2). 00063 *> \endverbatim 00064 *> 00065 *> \param[in] Z 00066 *> \verbatim 00067 *> Z is DOUBLE PRECISION array, dimension (2) 00068 *> The components of the updating vector. 00069 *> \endverbatim 00070 *> 00071 *> \param[out] DELTA 00072 *> \verbatim 00073 *> DELTA is DOUBLE PRECISION array, dimension (2) 00074 *> The vector DELTA contains the information necessary 00075 *> to construct the eigenvectors. 00076 *> \endverbatim 00077 *> 00078 *> \param[in] RHO 00079 *> \verbatim 00080 *> RHO is DOUBLE PRECISION 00081 *> The scalar in the symmetric updating formula. 00082 *> \endverbatim 00083 *> 00084 *> \param[out] DLAM 00085 *> \verbatim 00086 *> DLAM is DOUBLE PRECISION 00087 *> The computed lambda_I, the I-th updated eigenvalue. 00088 *> \endverbatim 00089 * 00090 * Authors: 00091 * ======== 00092 * 00093 *> \author Univ. of Tennessee 00094 *> \author Univ. of California Berkeley 00095 *> \author Univ. of Colorado Denver 00096 *> \author NAG Ltd. 00097 * 00098 *> \date November 2011 00099 * 00100 *> \ingroup auxOTHERcomputational 00101 * 00102 *> \par Contributors: 00103 * ================== 00104 *> 00105 *> Ren-Cang Li, Computer Science Division, University of California 00106 *> at Berkeley, USA 00107 *> 00108 * ===================================================================== 00109 SUBROUTINE DLAED5( I, D, Z, DELTA, RHO, DLAM ) 00110 * 00111 * -- LAPACK computational routine (version 3.4.0) -- 00112 * -- LAPACK is a software package provided by Univ. of Tennessee, -- 00113 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 00114 * November 2011 00115 * 00116 * .. Scalar Arguments .. 00117 INTEGER I 00118 DOUBLE PRECISION DLAM, RHO 00119 * .. 00120 * .. Array Arguments .. 00121 DOUBLE PRECISION D( 2 ), DELTA( 2 ), Z( 2 ) 00122 * .. 00123 * 00124 * ===================================================================== 00125 * 00126 * .. Parameters .. 00127 DOUBLE PRECISION ZERO, ONE, TWO, FOUR 00128 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0, 00129 $ FOUR = 4.0D0 ) 00130 * .. 00131 * .. Local Scalars .. 00132 DOUBLE PRECISION B, C, DEL, TAU, TEMP, W 00133 * .. 00134 * .. Intrinsic Functions .. 00135 INTRINSIC ABS, SQRT 00136 * .. 00137 * .. Executable Statements .. 00138 * 00139 DEL = D( 2 ) - D( 1 ) 00140 IF( I.EQ.1 ) THEN 00141 W = ONE + TWO*RHO*( Z( 2 )*Z( 2 )-Z( 1 )*Z( 1 ) ) / DEL 00142 IF( W.GT.ZERO ) THEN 00143 B = DEL + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) 00144 C = RHO*Z( 1 )*Z( 1 )*DEL 00145 * 00146 * B > ZERO, always 00147 * 00148 TAU = TWO*C / ( B+SQRT( ABS( B*B-FOUR*C ) ) ) 00149 DLAM = D( 1 ) + TAU 00150 DELTA( 1 ) = -Z( 1 ) / TAU 00151 DELTA( 2 ) = Z( 2 ) / ( DEL-TAU ) 00152 ELSE 00153 B = -DEL + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) 00154 C = RHO*Z( 2 )*Z( 2 )*DEL 00155 IF( B.GT.ZERO ) THEN 00156 TAU = -TWO*C / ( B+SQRT( B*B+FOUR*C ) ) 00157 ELSE 00158 TAU = ( B-SQRT( B*B+FOUR*C ) ) / TWO 00159 END IF 00160 DLAM = D( 2 ) + TAU 00161 DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) 00162 DELTA( 2 ) = -Z( 2 ) / TAU 00163 END IF 00164 TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) 00165 DELTA( 1 ) = DELTA( 1 ) / TEMP 00166 DELTA( 2 ) = DELTA( 2 ) / TEMP 00167 ELSE 00168 * 00169 * Now I=2 00170 * 00171 B = -DEL + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) 00172 C = RHO*Z( 2 )*Z( 2 )*DEL 00173 IF( B.GT.ZERO ) THEN 00174 TAU = ( B+SQRT( B*B+FOUR*C ) ) / TWO 00175 ELSE 00176 TAU = TWO*C / ( -B+SQRT( B*B+FOUR*C ) ) 00177 END IF 00178 DLAM = D( 2 ) + TAU 00179 DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) 00180 DELTA( 2 ) = -Z( 2 ) / TAU 00181 TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) 00182 DELTA( 1 ) = DELTA( 1 ) / TEMP 00183 DELTA( 2 ) = DELTA( 2 ) / TEMP 00184 END IF 00185 RETURN 00186 * 00187 * End OF DLAED5 00188 * 00189 END