224 $ WORK, LWORK, INFO )
234 INTEGER INFO, ITYPE, LDA, LDB, LWORK, N
237 REAL A( LDA, * ), B( LDB, * ), W( * ), WORK( * )
244 PARAMETER ( ONE = 1.0e+0 )
247 LOGICAL LQUERY, UPPER, WANTZ
249 INTEGER NEIG, LWMIN, LHTRD, LWTRD, KD, IB
255 EXTERNAL lsame, ilaenv2stage, sroundup_lwork
269 wantz = lsame( jobz,
'V' )
270 upper = lsame( uplo,
'U' )
271 lquery = ( lwork.EQ.-1 )
274 IF( itype.LT.1 .OR. itype.GT.3 )
THEN
276 ELSE IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN
278 ELSE IF( .NOT.( upper .OR. lsame( uplo,
'L' ) ) )
THEN
280 ELSE IF( n.LT.0 )
THEN
282 ELSE IF( lda.LT.max( 1, n ) )
THEN
284 ELSE IF( ldb.LT.max( 1, n ) )
THEN
289 kd = ilaenv2stage( 1,
'SSYTRD_2STAGE', jobz, n, -1, -1,
291 ib = ilaenv2stage( 2,
'SSYTRD_2STAGE', jobz, n, kd, -1,
293 lhtrd = ilaenv2stage( 3,
'SSYTRD_2STAGE', jobz, n, kd, ib,
295 lwtrd = ilaenv2stage( 4,
'SSYTRD_2STAGE', jobz, n, kd, ib,
297 lwmin = 2*n + lhtrd + lwtrd
298 work( 1 ) = real( lwmin )
300 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
306 CALL xerbla(
'SSYGV_2STAGE ', -info )
308 ELSE IF( lquery )
THEN
319 CALL spotrf( uplo, n, b, ldb, info )
327 CALL ssygst( itype, uplo, n, a, lda, b, ldb, info )
328 CALL ssyev_2stage( jobz, uplo, n, a, lda, w, work, lwork,
338 IF( itype.EQ.1 .OR. itype.EQ.2 )
THEN
349 CALL strsm(
'Left', uplo, trans,
'Non-unit', n, neig,
353 ELSE IF( itype.EQ.3 )
THEN
364 CALL strmm(
'Left', uplo, trans,
'Non-unit', n, neig,
370 work( 1 ) = sroundup_lwork(lwmin)
subroutine ssyev_2stage(jobz, uplo, n, a, lda, w, work, lwork, info)
SSYEV_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matr...
subroutine ssygst(itype, uplo, n, a, lda, b, ldb, info)
SSYGST
subroutine ssygv_2stage(itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, info)
SSYGV_2STAGE
subroutine strmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
STRMM
subroutine strsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
STRSM