133 SUBROUTINE dsyev( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO )
142 INTEGER info, lda, lwork, n
145 DOUBLE PRECISION a( lda, * ), w( * ), work( * )
151 DOUBLE PRECISION zero, one
152 parameter( zero = 0.0d0, one = 1.0d0 )
155 LOGICAL lower, lquery, wantz
156 INTEGER iinfo, imax, inde, indtau, indwrk, iscale,
158 DOUBLE PRECISION anrm, bignum, eps, rmax, rmin, safmin, sigma,
178 wantz =
lsame( jobz,
'V' )
179 lower =
lsame( uplo,
'L' )
180 lquery = ( lwork.EQ.-1 )
183 IF( .NOT.( wantz .OR.
lsame( jobz,
'N' ) ) )
THEN
185 ELSE IF( .NOT.( lower .OR.
lsame( uplo,
'U' ) ) )
THEN
187 ELSE IF( n.LT.0 )
THEN
189 ELSE IF( lda.LT.max( 1, n ) )
THEN
194 nb =
ilaenv( 1,
'DSYTRD', uplo, n, -1, -1, -1 )
195 lwkopt = max( 1, ( nb+2 )*n )
198 IF( lwork.LT.max( 1, 3*n-1 ) .AND. .NOT.lquery )
203 CALL
xerbla(
'DSYEV ', -info )
205 ELSE IF( lquery )
THEN
225 safmin =
dlamch(
'Safe minimum' )
226 eps =
dlamch(
'Precision' )
227 smlnum = safmin / eps
228 bignum = one / smlnum
229 rmin = sqrt( smlnum )
230 rmax = sqrt( bignum )
234 anrm =
dlansy(
'M', uplo, n, a, lda, work )
236 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
239 ELSE IF( anrm.GT.rmax )
THEN
244 $ CALL
dlascl( uplo, 0, 0, one, sigma, n, n, a, lda, info )
251 llwork = lwork - indwrk + 1
252 CALL
dsytrd( uplo, n, a, lda, w, work( inde ), work( indtau ),
253 $ work( indwrk ), llwork, iinfo )
258 IF( .NOT.wantz )
THEN
259 CALL
dsterf( n, w, work( inde ), info )
261 CALL
dorgtr( uplo, n, a, lda, work( indtau ), work( indwrk ),
263 CALL
dsteqr( jobz, n, w, work( inde ), a, lda, work( indtau ),
269 IF( iscale.EQ.1 )
THEN
275 CALL
dscal( imax, one / sigma, w, 1 )
subroutine dsteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
DSTEQR
LOGICAL function lsame(CA, CB)
LSAME
DOUBLE PRECISION function dlansy(NORM, UPLO, N, A, LDA, WORK)
DLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a real symmetric matrix.
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine xerbla(SRNAME, INFO)
XERBLA
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 dscal(N, DA, DX, INCX)
DSCAL
INTEGER function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
DOUBLE PRECISION function dlamch(CMACH)
DLAMCH
subroutine dsytrd(UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO)
DSYTRD
subroutine dsyev(JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO)
DSYEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices ...
subroutine dorgtr(UPLO, N, A, LDA, TAU, WORK, LWORK, INFO)
DORGTR