225 SUBROUTINE dsygvd( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK,
226 $ LWORK, IWORK, LIWORK, INFO )
234 INTEGER INFO, ITYPE, LDA, LDB, , LWORK, N
238 DOUBLE PRECISION( LDB, * ), W( * ), WORK( * )
245 parameter( one = 1.0d+0 )
248 LOGICAL LQUERY, , WANTZ
250 INTEGER LIOPT, LIWMIN, LOPT,
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(
'DSYGVD', -info )
311 ELSE IF( lquery )
THEN
322 CALL dpotrf( uplo, n, b, ldb, info )
330 CALL dsygst( itype, uplo, n, a, lda, b, ldb, info )
331 CALL dsyevd( jobz, uplo, n, a, lda, w, work, lwork, iwork, liwork,
333 lopt =
max( dble( lopt ), dble( work( 1 ) ) )
334 liopt =
max( dble( liopt ), dble( iwork( 1 ) ) )
336 IF( wantz .AND. info.EQ.0 )
THEN
340 IF( itype.EQ.1 .OR. itype.EQ.2 )
THEN
351 CALL dtrsm(
'Left', uplo, trans,
'Non-unit', n, n, one,
354 ELSE IF( itype.EQ.3 )
THEN
365 CALL dtrmm(
'Left', uplo, trans,
'Non-unit', n, n, one,
subroutine dsygst(itype, uplo, n, a, lda, b, ldb, info)
DSYGST
subroutine dsyevd(jobz, uplo, n, a, lda, w, work, lwork, iwork, liwork, info)
DSYEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices
subroutine dsygvd(itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, iwork, liwork, info)
DSYGVD
subroutine dtrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
DTRMM
subroutine dtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
DTRSM