183 SUBROUTINE dsyevd( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK,
192 INTEGER INFO, LDA, LIWORK, LWORK, N
196 DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * )
202 DOUBLE PRECISION ZERO, ONE
203 parameter( zero = 0.0d+0, one = 1.0d+0 )
207 LOGICAL LOWER, LQUERY, WANTZ
208 INTEGER IINFO, INDE, INDTAU, INDWK2, INDWRK, ISCALE,
209 $ liopt, liwmin, llwork, llwrk2, lopt, lwmin
210 DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
216 DOUBLE PRECISION DLAMCH, DLANSY
217 EXTERNAL lsame, dlamch, dlansy, ilaenv
230 wantz = lsame( jobz,
'V' )
231 lower = lsame( uplo,
'L' )
232 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
235 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
237 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
239 ELSE IF( n.LT.0 )
THEN
241 ELSE IF( lda.LT.
max( 1, n ) )
THEN
254 lwmin = 1 + 6*n + 2*n**2
259 lopt =
max( lwmin, 2*n +
260 $ ilaenv( 1,
'DSYTRD', uplo, n, -1, -1, -1 ) )
266 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
268 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
274 CALL xerbla(
'DSYEVD', -info )
276 ELSE IF( lquery )
THEN
294 safmin = dlamch(
'Safe minimum' )
295 eps = dlamch( 'precision
' )
296 SMLNUM = SAFMIN / EPS
297 BIGNUM = ONE / SMLNUM
298 RMIN = SQRT( SMLNUM )
299 RMAX = SQRT( BIGNUM )
303 ANRM = DLANSY( 'm
', UPLO, N, A, LDA, WORK )
305.GT..AND..LT.
IF( ANRMZERO ANRMRMIN ) THEN
308.GT.
ELSE IF( ANRMRMAX ) THEN
313 $ CALL DLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO )
320 LLWORK = LWORK - INDWRK + 1
321 INDWK2 = INDWRK + N*N
322 LLWRK2 = LWORK - INDWK2 + 1
324 CALL DSYTRD( UPLO, N, A, LDA, W, WORK( INDE ), WORK( INDTAU ),
325 $ WORK( INDWRK ), LLWORK, IINFO )
332.NOT.
IF( WANTZ ) THEN
333 CALL DSTERF( N, W, WORK( INDE ), INFO )
335 CALL DSTEDC( 'i
', N, W, WORK( INDE ), WORK( INDWRK ), N,
336 $ WORK( INDWK2 ), LLWRK2, IWORK, LIWORK, INFO )
337 CALL DORMTR( 'l
', UPLO, 'n
', N, N, A, LDA, WORK( INDTAU ),
338 $ WORK( INDWRK ), N, WORK( INDWK2 ), LLWRK2, IINFO )
339 CALL DLACPY( 'a
', N, N, WORK( INDWRK ), N, A, LDA )
345 $ CALL DSCAL( N, ONE / SIGMA, W, 1 )
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
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 dormtr(side, uplo, trans, m, n, a, lda, tau, c, ldc, work, lwork, info)
DORMTR
subroutine dsytrd(uplo, n, a, lda, d, e, tau, work, lwork, info)
DSYTRD
subroutine dsyevd(jobz, uplo, n, a, lda, w, work, lwork, iwork, liwork, info)
DSYEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices
subroutine dscal(n, da, dx, incx)
DSCAL