LAPACK 3.12.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
slaed9.f
Go to the documentation of this file.
1*> \brief \b SLAED9 used by SSTEDC. Finds the roots of the secular equation and updates the eigenvectors. Used when the original matrix is dense.
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download SLAED9 + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slaed9.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slaed9.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slaed9.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* SUBROUTINE SLAED9( K, KSTART, KSTOP, N, D, Q, LDQ, RHO, DLAMBDA,
22* W, S, LDS, INFO )
23*
24* .. Scalar Arguments ..
25* INTEGER INFO, K, KSTART, KSTOP, LDQ, LDS, N
26* REAL RHO
27* ..
28* .. Array Arguments ..
29* REAL D( * ), DLAMBDA( * ), Q( LDQ, * ), S( LDS, * ),
30* $ W( * )
31* ..
32*
33*
34*> \par Purpose:
35* =============
36*>
37*> \verbatim
38*>
39*> SLAED9 finds the roots of the secular equation, as defined by the
40*> values in D, Z, and RHO, between KSTART and KSTOP. It makes the
41*> appropriate calls to SLAED4 and then stores the new matrix of
42*> eigenvectors for use in calculating the next level of Z vectors.
43*> \endverbatim
44*
45* Arguments:
46* ==========
47*
48*> \param[in] K
49*> \verbatim
50*> K is INTEGER
51*> The number of terms in the rational function to be solved by
52*> SLAED4. K >= 0.
53*> \endverbatim
54*>
55*> \param[in] KSTART
56*> \verbatim
57*> KSTART is INTEGER
58*> \endverbatim
59*>
60*> \param[in] KSTOP
61*> \verbatim
62*> KSTOP is INTEGER
63*> The updated eigenvalues Lambda(I), KSTART <= I <= KSTOP
64*> are to be computed. 1 <= KSTART <= KSTOP <= K.
65*> \endverbatim
66*>
67*> \param[in] N
68*> \verbatim
69*> N is INTEGER
70*> The number of rows and columns in the Q matrix.
71*> N >= K (delation may result in N > K).
72*> \endverbatim
73*>
74*> \param[out] D
75*> \verbatim
76*> D is REAL array, dimension (N)
77*> D(I) contains the updated eigenvalues
78*> for KSTART <= I <= KSTOP.
79*> \endverbatim
80*>
81*> \param[out] Q
82*> \verbatim
83*> Q is REAL array, dimension (LDQ,N)
84*> \endverbatim
85*>
86*> \param[in] LDQ
87*> \verbatim
88*> LDQ is INTEGER
89*> The leading dimension of the array Q. LDQ >= max( 1, N ).
90*> \endverbatim
91*>
92*> \param[in] RHO
93*> \verbatim
94*> RHO is REAL
95*> The value of the parameter in the rank one update equation.
96*> RHO >= 0 required.
97*> \endverbatim
98*>
99*> \param[in] DLAMBDA
100*> \verbatim
101*> DLAMBDA is REAL array, dimension (K)
102*> The first K elements of this array contain the old roots
103*> of the deflated updating problem. These are the poles
104*> of the secular equation.
105*> \endverbatim
106*>
107*> \param[in] W
108*> \verbatim
109*> W is REAL array, dimension (K)
110*> The first K elements of this array contain the components
111*> of the deflation-adjusted updating vector.
112*> \endverbatim
113*>
114*> \param[out] S
115*> \verbatim
116*> S is REAL array, dimension (LDS, K)
117*> Will contain the eigenvectors of the repaired matrix which
118*> will be stored for subsequent Z vector calculation and
119*> multiplied by the previously accumulated eigenvectors
120*> to update the system.
121*> \endverbatim
122*>
123*> \param[in] LDS
124*> \verbatim
125*> LDS is INTEGER
126*> The leading dimension of S. LDS >= max( 1, K ).
127*> \endverbatim
128*>
129*> \param[out] INFO
130*> \verbatim
131*> INFO is INTEGER
132*> = 0: successful exit.
133*> < 0: if INFO = -i, the i-th argument had an illegal value.
134*> > 0: if INFO = 1, an eigenvalue did not converge
135*> \endverbatim
136*
137* Authors:
138* ========
139*
140*> \author Univ. of Tennessee
141*> \author Univ. of California Berkeley
142*> \author Univ. of Colorado Denver
143*> \author NAG Ltd.
144*
145*> \ingroup laed9
146*
147*> \par Contributors:
148* ==================
149*>
150*> Jeff Rutter, Computer Science Division, University of California
151*> at Berkeley, USA
152*
153* =====================================================================
154 SUBROUTINE slaed9( K, KSTART, KSTOP, N, D, Q, LDQ, RHO, DLAMBDA,
155 $ W, S, LDS, INFO )
156*
157* -- LAPACK computational routine --
158* -- LAPACK is a software package provided by Univ. of Tennessee, --
159* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
160*
161* .. Scalar Arguments ..
162 INTEGER INFO, K, KSTART, KSTOP, LDQ, LDS, N
163 REAL RHO
164* ..
165* .. Array Arguments ..
166 REAL D( * ), DLAMBDA( * ), Q( LDQ, * ), S( LDS, * ),
167 $ w( * )
168* ..
169*
170* =====================================================================
171*
172* .. Local Scalars ..
173 INTEGER I, J
174 REAL TEMP
175* ..
176* .. External Functions ..
177 REAL SNRM2
178 EXTERNAL snrm2
179* ..
180* .. External Subroutines ..
181 EXTERNAL scopy, slaed4, xerbla
182* ..
183* .. Intrinsic Functions ..
184 INTRINSIC max, sign, sqrt
185* ..
186* .. Executable Statements ..
187*
188* Test the input parameters.
189*
190 info = 0
191*
192 IF( k.LT.0 ) THEN
193 info = -1
194 ELSE IF( kstart.LT.1 .OR. kstart.GT.max( 1, k ) ) THEN
195 info = -2
196 ELSE IF( max( 1, kstop ).LT.kstart .OR. kstop.GT.max( 1, k ) )
197 $ THEN
198 info = -3
199 ELSE IF( n.LT.k ) THEN
200 info = -4
201 ELSE IF( ldq.LT.max( 1, k ) ) THEN
202 info = -7
203 ELSE IF( lds.LT.max( 1, k ) ) THEN
204 info = -12
205 END IF
206 IF( info.NE.0 ) THEN
207 CALL xerbla( 'SLAED9', -info )
208 RETURN
209 END IF
210*
211* Quick return if possible
212*
213 IF( k.EQ.0 )
214 $ RETURN
215*
216 DO 20 j = kstart, kstop
217 CALL slaed4( k, j, dlambda, w, q( 1, j ), rho, d( j ), info )
218*
219* If the zero finder fails, the computation is terminated.
220*
221 IF( info.NE.0 )
222 $ GO TO 120
223 20 CONTINUE
224*
225 IF( k.EQ.1 .OR. k.EQ.2 ) THEN
226 DO 40 i = 1, k
227 DO 30 j = 1, k
228 s( j, i ) = q( j, i )
229 30 CONTINUE
230 40 CONTINUE
231 GO TO 120
232 END IF
233*
234* Compute updated W.
235*
236 CALL scopy( k, w, 1, s, 1 )
237*
238* Initialize W(I) = Q(I,I)
239*
240 CALL scopy( k, q, ldq+1, w, 1 )
241 DO 70 j = 1, k
242 DO 50 i = 1, j - 1
243 w( i ) = w( i )*( q( i, j )/( dlambda( i )-dlambda( j ) ) )
244 50 CONTINUE
245 DO 60 i = j + 1, k
246 w( i ) = w( i )*( q( i, j )/( dlambda( i )-dlambda( j ) ) )
247 60 CONTINUE
248 70 CONTINUE
249 DO 80 i = 1, k
250 w( i ) = sign( sqrt( -w( i ) ), s( i, 1 ) )
251 80 CONTINUE
252*
253* Compute eigenvectors of the modified rank-1 modification.
254*
255 DO 110 j = 1, k
256 DO 90 i = 1, k
257 q( i, j ) = w( i ) / q( i, j )
258 90 CONTINUE
259 temp = snrm2( k, q( 1, j ), 1 )
260 DO 100 i = 1, k
261 s( i, j ) = q( i, j ) / temp
262 100 CONTINUE
263 110 CONTINUE
264*
265 120 CONTINUE
266 RETURN
267*
268* End of SLAED9
269*
270 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
Definition scopy.f:82
subroutine slaed4(n, i, d, z, delta, rho, dlam, info)
SLAED4 used by SSTEDC. Finds a single root of the secular equation.
Definition slaed4.f:145
subroutine slaed9(k, kstart, kstop, n, d, q, ldq, rho, dlambda, w, s, lds, info)
SLAED9 used by SSTEDC. Finds the roots of the secular equation and updates the eigenvectors....
Definition slaed9.f:156