root / src / lapack / double / dlasd5.f @ 2
Historique | Voir | Annoter | Télécharger (5,1 ko)
1 | 1 | equemene | SUBROUTINE DLASD5( I, D, Z, DELTA, RHO, DSIGMA, WORK ) |
---|---|---|---|
2 | 1 | equemene | * |
3 | 1 | equemene | * -- LAPACK auxiliary routine (version 3.2) -- |
4 | 1 | equemene | * -- LAPACK is a software package provided by Univ. of Tennessee, -- |
5 | 1 | equemene | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
6 | 1 | equemene | * November 2006 |
7 | 1 | equemene | * |
8 | 1 | equemene | * .. Scalar Arguments .. |
9 | 1 | equemene | INTEGER I |
10 | 1 | equemene | DOUBLE PRECISION DSIGMA, RHO |
11 | 1 | equemene | * .. |
12 | 1 | equemene | * .. Array Arguments .. |
13 | 1 | equemene | DOUBLE PRECISION D( 2 ), DELTA( 2 ), WORK( 2 ), Z( 2 ) |
14 | 1 | equemene | * .. |
15 | 1 | equemene | * |
16 | 1 | equemene | * Purpose |
17 | 1 | equemene | * ======= |
18 | 1 | equemene | * |
19 | 1 | equemene | * This subroutine computes the square root of the I-th eigenvalue |
20 | 1 | equemene | * of a positive symmetric rank-one modification of a 2-by-2 diagonal |
21 | 1 | equemene | * matrix |
22 | 1 | equemene | * |
23 | 1 | equemene | * diag( D ) * diag( D ) + RHO * Z * transpose(Z) . |
24 | 1 | equemene | * |
25 | 1 | equemene | * The diagonal entries in the array D are assumed to satisfy |
26 | 1 | equemene | * |
27 | 1 | equemene | * 0 <= D(i) < D(j) for i < j . |
28 | 1 | equemene | * |
29 | 1 | equemene | * We also assume RHO > 0 and that the Euclidean norm of the vector |
30 | 1 | equemene | * Z is one. |
31 | 1 | equemene | * |
32 | 1 | equemene | * Arguments |
33 | 1 | equemene | * ========= |
34 | 1 | equemene | * |
35 | 1 | equemene | * I (input) INTEGER |
36 | 1 | equemene | * The index of the eigenvalue to be computed. I = 1 or I = 2. |
37 | 1 | equemene | * |
38 | 1 | equemene | * D (input) DOUBLE PRECISION array, dimension ( 2 ) |
39 | 1 | equemene | * The original eigenvalues. We assume 0 <= D(1) < D(2). |
40 | 1 | equemene | * |
41 | 1 | equemene | * Z (input) DOUBLE PRECISION array, dimension ( 2 ) |
42 | 1 | equemene | * The components of the updating vector. |
43 | 1 | equemene | * |
44 | 1 | equemene | * DELTA (output) DOUBLE PRECISION array, dimension ( 2 ) |
45 | 1 | equemene | * Contains (D(j) - sigma_I) in its j-th component. |
46 | 1 | equemene | * The vector DELTA contains the information necessary |
47 | 1 | equemene | * to construct the eigenvectors. |
48 | 1 | equemene | * |
49 | 1 | equemene | * RHO (input) DOUBLE PRECISION |
50 | 1 | equemene | * The scalar in the symmetric updating formula. |
51 | 1 | equemene | * |
52 | 1 | equemene | * DSIGMA (output) DOUBLE PRECISION |
53 | 1 | equemene | * The computed sigma_I, the I-th updated eigenvalue. |
54 | 1 | equemene | * |
55 | 1 | equemene | * WORK (workspace) DOUBLE PRECISION array, dimension ( 2 ) |
56 | 1 | equemene | * WORK contains (D(j) + sigma_I) in its j-th component. |
57 | 1 | equemene | * |
58 | 1 | equemene | * Further Details |
59 | 1 | equemene | * =============== |
60 | 1 | equemene | * |
61 | 1 | equemene | * Based on contributions by |
62 | 1 | equemene | * Ren-Cang Li, Computer Science Division, University of California |
63 | 1 | equemene | * at Berkeley, USA |
64 | 1 | equemene | * |
65 | 1 | equemene | * ===================================================================== |
66 | 1 | equemene | * |
67 | 1 | equemene | * .. Parameters .. |
68 | 1 | equemene | DOUBLE PRECISION ZERO, ONE, TWO, THREE, FOUR |
69 | 1 | equemene | PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0, |
70 | 1 | equemene | $ THREE = 3.0D+0, FOUR = 4.0D+0 ) |
71 | 1 | equemene | * .. |
72 | 1 | equemene | * .. Local Scalars .. |
73 | 1 | equemene | DOUBLE PRECISION B, C, DEL, DELSQ, TAU, W |
74 | 1 | equemene | * .. |
75 | 1 | equemene | * .. Intrinsic Functions .. |
76 | 1 | equemene | INTRINSIC ABS, SQRT |
77 | 1 | equemene | * .. |
78 | 1 | equemene | * .. Executable Statements .. |
79 | 1 | equemene | * |
80 | 1 | equemene | DEL = D( 2 ) - D( 1 ) |
81 | 1 | equemene | DELSQ = DEL*( D( 2 )+D( 1 ) ) |
82 | 1 | equemene | IF( I.EQ.1 ) THEN |
83 | 1 | equemene | W = ONE + FOUR*RHO*( Z( 2 )*Z( 2 ) / ( D( 1 )+THREE*D( 2 ) )- |
84 | 1 | equemene | $ Z( 1 )*Z( 1 ) / ( THREE*D( 1 )+D( 2 ) ) ) / DEL |
85 | 1 | equemene | IF( W.GT.ZERO ) THEN |
86 | 1 | equemene | B = DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) |
87 | 1 | equemene | C = RHO*Z( 1 )*Z( 1 )*DELSQ |
88 | 1 | equemene | * |
89 | 1 | equemene | * B > ZERO, always |
90 | 1 | equemene | * |
91 | 1 | equemene | * The following TAU is DSIGMA * DSIGMA - D( 1 ) * D( 1 ) |
92 | 1 | equemene | * |
93 | 1 | equemene | TAU = TWO*C / ( B+SQRT( ABS( B*B-FOUR*C ) ) ) |
94 | 1 | equemene | * |
95 | 1 | equemene | * The following TAU is DSIGMA - D( 1 ) |
96 | 1 | equemene | * |
97 | 1 | equemene | TAU = TAU / ( D( 1 )+SQRT( D( 1 )*D( 1 )+TAU ) ) |
98 | 1 | equemene | DSIGMA = D( 1 ) + TAU |
99 | 1 | equemene | DELTA( 1 ) = -TAU |
100 | 1 | equemene | DELTA( 2 ) = DEL - TAU |
101 | 1 | equemene | WORK( 1 ) = TWO*D( 1 ) + TAU |
102 | 1 | equemene | WORK( 2 ) = ( D( 1 )+TAU ) + D( 2 ) |
103 | 1 | equemene | * DELTA( 1 ) = -Z( 1 ) / TAU |
104 | 1 | equemene | * DELTA( 2 ) = Z( 2 ) / ( DEL-TAU ) |
105 | 1 | equemene | ELSE |
106 | 1 | equemene | B = -DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) |
107 | 1 | equemene | C = RHO*Z( 2 )*Z( 2 )*DELSQ |
108 | 1 | equemene | * |
109 | 1 | equemene | * The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) |
110 | 1 | equemene | * |
111 | 1 | equemene | IF( B.GT.ZERO ) THEN |
112 | 1 | equemene | TAU = -TWO*C / ( B+SQRT( B*B+FOUR*C ) ) |
113 | 1 | equemene | ELSE |
114 | 1 | equemene | TAU = ( B-SQRT( B*B+FOUR*C ) ) / TWO |
115 | 1 | equemene | END IF |
116 | 1 | equemene | * |
117 | 1 | equemene | * The following TAU is DSIGMA - D( 2 ) |
118 | 1 | equemene | * |
119 | 1 | equemene | TAU = TAU / ( D( 2 )+SQRT( ABS( D( 2 )*D( 2 )+TAU ) ) ) |
120 | 1 | equemene | DSIGMA = D( 2 ) + TAU |
121 | 1 | equemene | DELTA( 1 ) = -( DEL+TAU ) |
122 | 1 | equemene | DELTA( 2 ) = -TAU |
123 | 1 | equemene | WORK( 1 ) = D( 1 ) + TAU + D( 2 ) |
124 | 1 | equemene | WORK( 2 ) = TWO*D( 2 ) + TAU |
125 | 1 | equemene | * DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) |
126 | 1 | equemene | * DELTA( 2 ) = -Z( 2 ) / TAU |
127 | 1 | equemene | END IF |
128 | 1 | equemene | * TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) |
129 | 1 | equemene | * DELTA( 1 ) = DELTA( 1 ) / TEMP |
130 | 1 | equemene | * DELTA( 2 ) = DELTA( 2 ) / TEMP |
131 | 1 | equemene | ELSE |
132 | 1 | equemene | * |
133 | 1 | equemene | * Now I=2 |
134 | 1 | equemene | * |
135 | 1 | equemene | B = -DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) |
136 | 1 | equemene | C = RHO*Z( 2 )*Z( 2 )*DELSQ |
137 | 1 | equemene | * |
138 | 1 | equemene | * The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) |
139 | 1 | equemene | * |
140 | 1 | equemene | IF( B.GT.ZERO ) THEN |
141 | 1 | equemene | TAU = ( B+SQRT( B*B+FOUR*C ) ) / TWO |
142 | 1 | equemene | ELSE |
143 | 1 | equemene | TAU = TWO*C / ( -B+SQRT( B*B+FOUR*C ) ) |
144 | 1 | equemene | END IF |
145 | 1 | equemene | * |
146 | 1 | equemene | * The following TAU is DSIGMA - D( 2 ) |
147 | 1 | equemene | * |
148 | 1 | equemene | TAU = TAU / ( D( 2 )+SQRT( D( 2 )*D( 2 )+TAU ) ) |
149 | 1 | equemene | DSIGMA = D( 2 ) + TAU |
150 | 1 | equemene | DELTA( 1 ) = -( DEL+TAU ) |
151 | 1 | equemene | DELTA( 2 ) = -TAU |
152 | 1 | equemene | WORK( 1 ) = D( 1 ) + TAU + D( 2 ) |
153 | 1 | equemene | WORK( 2 ) = TWO*D( 2 ) + TAU |
154 | 1 | equemene | * DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) |
155 | 1 | equemene | * DELTA( 2 ) = -Z( 2 ) / TAU |
156 | 1 | equemene | * TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) |
157 | 1 | equemene | * DELTA( 1 ) = DELTA( 1 ) / TEMP |
158 | 1 | equemene | * DELTA( 2 ) = DELTA( 2 ) / TEMP |
159 | 1 | equemene | END IF |
160 | 1 | equemene | RETURN |
161 | 1 | equemene | * |
162 | 1 | equemene | * End of DLASD5 |
163 | 1 | equemene | * |
164 | 1 | equemene | END |