131 SUBROUTINE ssyev( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO )
139 INTEGER INFO, LDA, LWORK, N
142 REAL A( LDA, * ), W( * ), WORK( * )
149 parameter( zero = 0.0e0, one = 1.0e0 )
152 LOGICAL LOWER, LQUERY, WANTZ
153 INTEGER IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE,
155 REAL ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
162 EXTERNAL ilaenv, lsame, slamch, slansy
175 wantz = lsame( jobz,
'V' )
176 lower = lsame( uplo, 'l
' )
177.EQ.
LQUERY = ( LWORK-1 )
180.NOT..OR.
IF( ( WANTZ LSAME( JOBZ, 'n
' ) ) ) THEN
182.NOT..OR.
ELSE IF( ( LOWER LSAME( UPLO, 'u
' ) ) ) THEN
184.LT.
ELSE IF( N0 ) THEN
186.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
191 NB = ILAENV( 1, 'ssytrd', UPLO, N, -1, -1, -1 )
192 LWKOPT = MAX( 1, ( NB+2 )*N )
195.LT..AND..NOT.
IF( LWORKMAX( 1, 3*N-1 ) LQUERY )
200 CALL XERBLA( 'ssyev ', -INFO )
202 ELSE IF( LQUERY ) THEN
222 SAFMIN = SLAMCH( 'safe minimum
' )
223 EPS = SLAMCH( 'precision
' )
224 SMLNUM = SAFMIN / EPS
225 BIGNUM = ONE / SMLNUM
226 RMIN = SQRT( SMLNUM )
227 RMAX = SQRT( BIGNUM )
231 ANRM = SLANSY( 'm
', UPLO, N, A, LDA, WORK )
233.GT..AND..LT.
IF( ANRMZERO ANRMRMIN ) THEN
236.GT.
ELSE IF( ANRMRMAX ) THEN
241 $ CALL SLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO )
248 LLWORK = LWORK - INDWRK + 1
249 CALL SSYTRD( UPLO, N, A, LDA, W, WORK( INDE ), WORK( INDTAU ),
250 $ WORK( INDWRK ), LLWORK, IINFO )
255.NOT.
IF( WANTZ ) THEN
256 CALL SSTERF( N, W, WORK( INDE ), INFO )
258 CALL SORGTR( UPLO, N, A, LDA, WORK( INDTAU ), WORK( INDWRK ),
260 CALL SSTEQR( JOBZ, N, W, WORK( INDE ), A, LDA, WORK( INDTAU ),
266.EQ.
IF( ISCALE1 ) THEN
272 CALL SSCAL( IMAX, ONE / SIGMA, W, 1 )
subroutine slascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine ssteqr(compz, n, d, e, z, ldz, work, info)
SSTEQR
subroutine ssterf(n, d, e, info)
SSTERF
subroutine xerbla(srname, info)
XERBLA
subroutine sorgtr(uplo, n, a, lda, tau, work, lwork, info)
SORGTR
subroutine ssytrd(uplo, n, a, lda, d, e, tau, work, lwork, info)
SSYTRD
subroutine ssyev(jobz, uplo, n, a, lda, w, work, lwork, info)
SSYEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices
subroutine sscal(n, sa, sx, incx)
SSCAL