176 SUBROUTINE sspevd( JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, LWORK,
177 $ IWORK, LIWORK, INFO )
185 INTEGER INFO, LDZ, LIWORK, LWORK, N
189 REAL AP( * ), W( * ), WORK( * ), Z( LDZ, * )
196 parameter( zero = 0.0e+0, one = 1.0e+0 )
199 LOGICAL LQUERY, WANTZ
200 INTEGER IINFO, INDE, INDTAU, INDWRK, ISCALE, LIWMIN,
202 REAL ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
208 EXTERNAL lsame, slamch, slansp
220 wantz = lsame( jobz,
'V' )
221 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
224 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
226 ELSE IF( .NOT.( lsame( uplo,
'U' ) .OR. lsame( uplo,
'L' ) ) )
229 ELSE IF( n.LT.0 )
THEN
231 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
242 lwmin = 1 + 6*n + n**2
251 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
253 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
259 CALL xerbla(
'SSPEVD', -info )
261 ELSE IF( lquery )
THEN
279 safmin = slamch(
'Safe minimum' )
280 eps = slamch(
'Precision' )
281 smlnum = safmin / eps
282 bignum = one / smlnum
283 rmin = sqrt( smlnum )
284 rmax = sqrt( bignum )
288 anrm = slansp(
'M', uplo, n, ap, work )
290 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
293 ELSE IF( anrm.GT.rmax )
THEN
297 IF( iscale.EQ.1 )
THEN
298 CALL sscal( ( n*( n+1 ) ) / 2, sigma, ap, 1 )
305 CALL ssptrd( uplo, n, ap, w, work( inde ), work( indtau ), iinfo )
312 IF( .NOT.wantz )
THEN
313 CALL ssterf( n, w, work( inde ), info )
316 llwork = lwork - indwrk + 1
317 CALL sstedc(
'I', n, w, work( inde ), z, ldz, work( indwrk ),
318 $ llwork, iwork, liwork, info )
319 CALL sopmtr(
'L', uplo,
'N', n, n, ap, work( indtau ), z, ldz,
320 $ work( indwrk ), iinfo )
326 $
CALL sscal( n, one / sigma, w, 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
SSTEDC
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine ssptrd(UPLO, N, AP, D, E, TAU, INFO)
SSPTRD
subroutine sopmtr(SIDE, UPLO, TRANS, M, N, AP, TAU, C, LDC, WORK, INFO)
SOPMTR
subroutine sspevd(JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
SSPEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrice...
subroutine sscal(N, SA, SX, INCX)
SSCAL