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( * ), ( 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.GT..AND..LT.
IF( ANRMZERO ANRMRMIN ) THEN
293.GT.
ELSE IF( ANRMRMAX ) THEN
297.EQ.
IF( ISCALE1 ) THEN
298 CALL DSCAL( ( N*( N+1 ) ) / 2, SIGMA, AP, 1 )
305 CALL DSPTRD( UPLO, N, AP, W, WORK( INDE ), WORK( INDTAU ), IINFO )
312.NOT.
IF( 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 dsterf(n, d, e, info)
DSTERF
subroutine dstedc(compz, n, d, e, z, ldz, work, lwork, iwork, liwork, info)
DSTEDC
subroutine xerbla(srname, info)
XERBLA
subroutine dsptrd(uplo, n, ap, d, e, tau, info)
DSPTRD
subroutine dopmtr(side, uplo, trans, m, n, ap, tau, c, ldc, work, info)
DOPMTR
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 matrice...
subroutine dscal(n, da, dx, incx)
DSCAL