176 SUBROUTINE dspevd( JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, LWORK,
177 $ IWORK, LIWORK, INFO )
185 INTEGER INFO, LDZ, LIWORK, LWORK, N
189 DOUBLE PRECISION AP( * ), W( * ), WORK( * ), Z( ldz, * )
195 DOUBLE PRECISION ZERO, ONE
196 parameter( zero = 0.0d+0, one = 1.0d+0 )
199 LOGICAL LQUERY, WANTZ
200 INTEGER IINFO, INDE, INDTAU, INDWRK, ISCALE, LIWMIN,
202 DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
207 DOUBLE PRECISION DLAMCH, DLANSP
208 EXTERNAL lsame, dlamch, dlansp
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(
'DSPEVD', -info )
261 ELSE IF( lquery )
THEN 279 safmin = dlamch(
'Safe minimum' )
280 eps = dlamch(
'Precision' )
281 smlnum = safmin / eps
282 bignum = one / smlnum
283 rmin = sqrt( smlnum )
284 rmax = sqrt( bignum )
288 anrm = dlansp(
'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 dscal( ( n*( n+1 ) ) / 2, sigma, ap, 1 )
305 CALL dsptrd( uplo, n, ap, w, work( inde ), work( indtau ), iinfo )
312 IF( .NOT.wantz )
THEN 313 CALL dsterf( n, w, work( inde ), info )
316 llwork = lwork - indwrk + 1
317 CALL dstedc(
'I', n, w, work( inde ), z, ldz, work( indwrk ),
318 $ llwork, iwork, liwork, info )
319 CALL dopmtr(
'L', uplo,
'N', n, n, ap, work( indtau ), z, ldz,
320 $ work( indwrk ), iinfo )
326 $
CALL dscal( n, one / sigma, w, 1 )
subroutine dopmtr(SIDE, UPLO, TRANS, M, N, AP, TAU, C, LDC, WORK, INFO)
DOPMTR
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dspevd(JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
DSPEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matric...
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
DSTEDC
subroutine dsptrd(UPLO, N, AP, D, E, TAU, INFO)
DSPTRD