227 SUBROUTINE ssygvd( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK,
228 $ LWORK, IWORK, LIWORK, INFO )
237 INTEGER INFO, ITYPE, LDA, LDB, LIWORK, LWORK, N
241 REAL A( lda, * ), B( ldb, * ), W( * ), WORK( * )
248 parameter( one = 1.0e+0 )
251 LOGICAL LQUERY, UPPER, WANTZ
253 INTEGER LIOPT, LIWMIN, LOPT, LWMIN
269 wantz = lsame( jobz,
'V' )
270 upper = lsame( uplo,
'U' )
271 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
277 ELSE IF( wantz )
THEN 279 lwmin = 1 + 6*n + 2*n**2
286 IF( itype.LT.1 .OR. itype.GT.3 )
THEN 288 ELSE IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN 290 ELSE IF( .NOT.( upper .OR. lsame( uplo,
'L' ) ) )
THEN 292 ELSE IF( n.LT.0 )
THEN 294 ELSE IF( lda.LT.max( 1, n ) )
THEN 296 ELSE IF( ldb.LT.max( 1, n ) )
THEN 304 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 306 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN 312 CALL xerbla(
'SSYGVD', -info )
314 ELSE IF( lquery )
THEN 325 CALL spotrf( uplo, n, b, ldb, info )
333 CALL ssygst( itype, uplo, n, a, lda, b, ldb, info )
334 CALL ssyevd( jobz, uplo, n, a, lda, w, work, lwork, iwork, liwork,
336 lopt = max(
REAL( LOPT ),
REAL( WORK( 1 ) ) )
337 liopt = max(
REAL( LIOPT ),
REAL( IWORK( 1 ) ) )
339 IF( wantz .AND. info.EQ.0 )
THEN 343 IF( itype.EQ.1 .OR. itype.EQ.2 )
THEN 354 CALL strsm(
'Left', uplo, trans,
'Non-unit', n, n, one,
357 ELSE IF( itype.EQ.3 )
THEN 368 CALL strmm(
'Left', uplo, trans,
'Non-unit', n, n, one,
subroutine strsm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
STRSM
subroutine spotrf(UPLO, N, A, LDA, INFO)
SPOTRF
subroutine strmm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
STRMM
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ssygst(ITYPE, UPLO, N, A, LDA, B, LDB, INFO)
SSYGST
subroutine ssygvd(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, IWORK, LIWORK, INFO)
SSYGVD
subroutine ssyevd(JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK, LIWORK, INFO)
SSYEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices ...