LAPACK 3.12.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
sstevd.f
Go to the documentation of this file.
1*> \brief <b> SSTEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrices</b>
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download SSTEVD + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/sstevd.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/sstevd.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/sstevd.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* SUBROUTINE SSTEVD( JOBZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK,
22* LIWORK, INFO )
23*
24* .. Scalar Arguments ..
25* CHARACTER JOBZ
26* INTEGER INFO, LDZ, LIWORK, LWORK, N
27* ..
28* .. Array Arguments ..
29* INTEGER IWORK( * )
30* REAL D( * ), E( * ), WORK( * ), Z( LDZ, * )
31* ..
32*
33*
34*> \par Purpose:
35* =============
36*>
37*> \verbatim
38*>
39*> SSTEVD computes all eigenvalues and, optionally, eigenvectors of a
40*> real symmetric tridiagonal matrix. If eigenvectors are desired, it
41*> uses a divide and conquer algorithm.
42*>
43*> \endverbatim
44*
45* Arguments:
46* ==========
47*
48*> \param[in] JOBZ
49*> \verbatim
50*> JOBZ is CHARACTER*1
51*> = 'N': Compute eigenvalues only;
52*> = 'V': Compute eigenvalues and eigenvectors.
53*> \endverbatim
54*>
55*> \param[in] N
56*> \verbatim
57*> N is INTEGER
58*> The order of the matrix. N >= 0.
59*> \endverbatim
60*>
61*> \param[in,out] D
62*> \verbatim
63*> D is REAL array, dimension (N)
64*> On entry, the n diagonal elements of the tridiagonal matrix
65*> A.
66*> On exit, if INFO = 0, the eigenvalues in ascending order.
67*> \endverbatim
68*>
69*> \param[in,out] E
70*> \verbatim
71*> E is REAL array, dimension (N-1)
72*> On entry, the (n-1) subdiagonal elements of the tridiagonal
73*> matrix A, stored in elements 1 to N-1 of E.
74*> On exit, the contents of E are destroyed.
75*> \endverbatim
76*>
77*> \param[out] Z
78*> \verbatim
79*> Z is REAL array, dimension (LDZ, N)
80*> If JOBZ = 'V', then if INFO = 0, Z contains the orthonormal
81*> eigenvectors of the matrix A, with the i-th column of Z
82*> holding the eigenvector associated with D(i).
83*> If JOBZ = 'N', then Z is not referenced.
84*> \endverbatim
85*>
86*> \param[in] LDZ
87*> \verbatim
88*> LDZ is INTEGER
89*> The leading dimension of the array Z. LDZ >= 1, and if
90*> JOBZ = 'V', LDZ >= max(1,N).
91*> \endverbatim
92*>
93*> \param[out] WORK
94*> \verbatim
95*> WORK is REAL array,
96*> dimension (LWORK)
97*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
98*> \endverbatim
99*>
100*> \param[in] LWORK
101*> \verbatim
102*> LWORK is INTEGER
103*> The dimension of the array WORK.
104*> If JOBZ = 'N' or N <= 1 then LWORK must be at least 1.
105*> If JOBZ = 'V' and N > 1 then LWORK must be at least
106*> ( 1 + 4*N + N**2 ).
107*>
108*> If LWORK = -1, then a workspace query is assumed; the routine
109*> only calculates the optimal sizes of the WORK and IWORK
110*> arrays, returns these values as the first entries of the WORK
111*> and IWORK arrays, and no error message related to LWORK or
112*> LIWORK is issued by XERBLA.
113*> \endverbatim
114*>
115*> \param[out] IWORK
116*> \verbatim
117*> IWORK is INTEGER array, dimension (MAX(1,LIWORK))
118*> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
119*> \endverbatim
120*>
121*> \param[in] LIWORK
122*> \verbatim
123*> LIWORK is INTEGER
124*> The dimension of the array IWORK.
125*> If JOBZ = 'N' or N <= 1 then LIWORK must be at least 1.
126*> If JOBZ = 'V' and N > 1 then LIWORK must be at least 3+5*N.
127*>
128*> If LIWORK = -1, then a workspace query is assumed; the
129*> routine only calculates the optimal sizes of the WORK and
130*> IWORK arrays, returns these values as the first entries of
131*> the WORK and IWORK arrays, and no error message related to
132*> LWORK or LIWORK is issued by XERBLA.
133*> \endverbatim
134*>
135*> \param[out] INFO
136*> \verbatim
137*> INFO is INTEGER
138*> = 0: successful exit
139*> < 0: if INFO = -i, the i-th argument had an illegal value
140*> > 0: if INFO = i, the algorithm failed to converge; i
141*> off-diagonal elements of E did not converge to zero.
142*> \endverbatim
143*
144* Authors:
145* ========
146*
147*> \author Univ. of Tennessee
148*> \author Univ. of California Berkeley
149*> \author Univ. of Colorado Denver
150*> \author NAG Ltd.
151*
152*> \ingroup stevd
153*
154* =====================================================================
155 SUBROUTINE sstevd( JOBZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK,
156 $ LIWORK, INFO )
157*
158* -- LAPACK driver routine --
159* -- LAPACK is a software package provided by Univ. of Tennessee, --
160* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
161*
162* .. Scalar Arguments ..
163 CHARACTER JOBZ
164 INTEGER INFO, LDZ, LIWORK, LWORK, N
165* ..
166* .. Array Arguments ..
167 INTEGER IWORK( * )
168 REAL D( * ), E( * ), WORK( * ), Z( LDZ, * )
169* ..
170*
171* =====================================================================
172*
173* .. Parameters ..
174 REAL ZERO, ONE
175 parameter( zero = 0.0e0, one = 1.0e0 )
176* ..
177* .. Local Scalars ..
178 LOGICAL LQUERY, WANTZ
179 INTEGER ISCALE, LIWMIN, LWMIN
180 REAL BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, SMLNUM,
181 $ tnrm
182* ..
183* .. External Functions ..
184 LOGICAL LSAME
185 REAL SLAMCH, SLANST, SROUNDUP_LWORK
186 EXTERNAL lsame, slamch, slanst, sroundup_lwork
187* ..
188* .. External Subroutines ..
189 EXTERNAL sscal, sstedc, ssterf, xerbla
190* ..
191* .. Intrinsic Functions ..
192 INTRINSIC sqrt
193* ..
194* .. Executable Statements ..
195*
196* Test the input parameters.
197*
198 wantz = lsame( jobz, 'V' )
199 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
200*
201 info = 0
202 liwmin = 1
203 lwmin = 1
204 IF( n.GT.1 .AND. wantz ) THEN
205 lwmin = 1 + 4*n + n**2
206 liwmin = 3 + 5*n
207 END IF
208*
209 IF( .NOT.( wantz .OR. lsame( jobz, 'N' ) ) ) THEN
210 info = -1
211 ELSE IF( n.LT.0 ) THEN
212 info = -2
213 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) ) THEN
214 info = -6
215 END IF
216*
217 IF( info.EQ.0 ) THEN
218 work( 1 ) = sroundup_lwork(lwmin)
219 iwork( 1 ) = liwmin
220*
221 IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
222 info = -8
223 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery ) THEN
224 info = -10
225 END IF
226 END IF
227*
228 IF( info.NE.0 ) THEN
229 CALL xerbla( 'SSTEVD', -info )
230 RETURN
231 ELSE IF( lquery ) THEN
232 RETURN
233 END IF
234*
235* Quick return if possible
236*
237 IF( n.EQ.0 )
238 $ RETURN
239*
240 IF( n.EQ.1 ) THEN
241 IF( wantz )
242 $ z( 1, 1 ) = one
243 RETURN
244 END IF
245*
246* Get machine constants.
247*
248 safmin = slamch( 'Safe minimum' )
249 eps = slamch( 'Precision' )
250 smlnum = safmin / eps
251 bignum = one / smlnum
252 rmin = sqrt( smlnum )
253 rmax = sqrt( bignum )
254*
255* Scale matrix to allowable range, if necessary.
256*
257 iscale = 0
258 tnrm = slanst( 'M', n, d, e )
259 IF( tnrm.GT.zero .AND. tnrm.LT.rmin ) THEN
260 iscale = 1
261 sigma = rmin / tnrm
262 ELSE IF( tnrm.GT.rmax ) THEN
263 iscale = 1
264 sigma = rmax / tnrm
265 END IF
266 IF( iscale.EQ.1 ) THEN
267 CALL sscal( n, sigma, d, 1 )
268 CALL sscal( n-1, sigma, e( 1 ), 1 )
269 END IF
270*
271* For eigenvalues only, call SSTERF. For eigenvalues and
272* eigenvectors, call SSTEDC.
273*
274 IF( .NOT.wantz ) THEN
275 CALL ssterf( n, d, e, info )
276 ELSE
277 CALL sstedc( 'I', n, d, e, z, ldz, work, lwork, iwork, liwork,
278 $ info )
279 END IF
280*
281* If matrix was scaled, then rescale eigenvalues appropriately.
282*
283 IF( iscale.EQ.1 )
284 $ CALL sscal( n, one / sigma, d, 1 )
285*
286 work( 1 ) = sroundup_lwork(lwmin)
287 iwork( 1 ) = liwmin
288*
289 RETURN
290*
291* End of SSTEVD
292*
293 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine sscal(n, sa, sx, incx)
SSCAL
Definition sscal.f:79
subroutine sstedc(compz, n, d, e, z, ldz, work, lwork, iwork, liwork, info)
SSTEDC
Definition sstedc.f:182
subroutine ssterf(n, d, e, info)
SSTERF
Definition ssterf.f:86
subroutine sstevd(jobz, n, d, e, z, ldz, work, lwork, iwork, liwork, info)
SSTEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrice...
Definition sstevd.f:157