225 SUBROUTINE ssygvd( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK,
226 $ LWORK, IWORK, LIWORK, INFO )
234 INTEGER INFO, ITYPE, LDA, LDB, LIWORK, LWORK, N
238 REAL A( lda, * ), B( ldb, * ), W( * ), WORK( * )
245 parameter( one = 1.0e+0 )
248 LOGICAL LQUERY, UPPER, WANTZ
250 INTEGER LIOPT, LIWMIN, LOPT, LWMIN
266 wantz = lsame( jobz,
'V' )
267 upper = lsame( uplo,
'U' )
268 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
274 ELSE IF( wantz )
THEN 276 lwmin = 1 + 6*n + 2*n**2
283 IF( itype.LT.1 .OR. itype.GT.3 )
THEN 285 ELSE IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN 287 ELSE IF( .NOT.( upper .OR. lsame( uplo,
'L' ) ) )
THEN 289 ELSE IF( n.LT.0 )
THEN 291 ELSE IF( lda.LT.max( 1, n ) )
THEN 293 ELSE IF( ldb.LT.max( 1, n ) )
THEN 301 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 303 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN 309 CALL xerbla(
'SSYGVD', -info )
311 ELSE IF( lquery )
THEN 322 CALL spotrf( uplo, n, b, ldb, info )
330 CALL ssygst( itype, uplo, n, a, lda, b, ldb, info )
331 CALL ssyevd( jobz, uplo, n, a, lda, w, work, lwork, iwork, liwork,
333 lopt = int( max(
REAL( LOPT ),
REAL( WORK( 1 ) ) ) )
334 liopt = int( max(
REAL( LIOPT ),
REAL( IWORK( 1 ) ) ) )
336 IF( wantz .AND. info.EQ.0 )
THEN 340 IF( itype.EQ.1 .OR. itype.EQ.2 )
THEN 351 CALL strsm(
'Left', uplo, trans,
'Non-unit', n, n, one,
354 ELSE IF( itype.EQ.3 )
THEN 365 CALL strmm(
'Left', uplo, trans,
'Non-unit', n, n, one,
subroutine strmm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
STRMM
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 ...
subroutine strsm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
STRSM
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ssygvd(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, IWORK, LIWORK, INFO)
SSYGVD
subroutine ssygst(ITYPE, UPLO, N, A, LDA, B, LDB, INFO)
SSYGST
subroutine spotrf(UPLO, N, A, LDA, INFO)
SPOTRF