Statistiques
| Révision :

root / src / lapack / double / dlasd5.f @ 1

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