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 =
max( real( lopt ), real( work( 1 ) ) )
334 liopt =
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 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
subroutine strsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
STRSM
subroutine strmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
STRMM