249 SUBROUTINE zhbgvd( JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W,
250 $ Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK,
259 INTEGER INFO, KA, KB, LDAB, LDBB, LDZ, LIWORK, LRWORK,
264 DOUBLE PRECISION RWORK( * ), W( * )
265 COMPLEX*16 AB( ldab, * ), BB( ldbb, * ), WORK( * ),
272 COMPLEX*16 CONE, CZERO
273 parameter( cone = ( 1.0d+0, 0.0d+0 ),
274 $ czero = ( 0.0d+0, 0.0d+0 ) )
277 LOGICAL LQUERY, UPPER, WANTZ
279 INTEGER IINFO, INDE, INDWK2, INDWRK, LIWMIN, LLRWK,
280 $ llwk2, lrwmin, lwmin
294 wantz = lsame( jobz,
'V' )
295 upper = lsame( uplo,
'U' )
296 lquery = ( lwork.EQ.-1 .OR. lrwork.EQ.-1 .OR. liwork.EQ.-1 )
303 ELSE IF( wantz )
THEN 305 lrwmin = 1 + 5*n + 2*n**2
312 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN 314 ELSE IF( .NOT.( upper .OR. lsame( uplo,
'L' ) ) )
THEN 316 ELSE IF( n.LT.0 )
THEN 318 ELSE IF( ka.LT.0 )
THEN 320 ELSE IF( kb.LT.0 .OR. kb.GT.ka )
THEN 322 ELSE IF( ldab.LT.ka+1 )
THEN 324 ELSE IF( ldbb.LT.kb+1 )
THEN 326 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 335 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 337 ELSE IF( lrwork.LT.lrwmin .AND. .NOT.lquery )
THEN 339 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN 345 CALL xerbla(
'ZHBGVD', -info )
347 ELSE IF( lquery )
THEN 358 CALL zpbstf( uplo, n, kb, bb, ldbb, info )
369 llwk2 = lwork - indwk2 + 2
370 llrwk = lrwork - indwrk + 2
371 CALL zhbgst( jobz, uplo, n, ka, kb, ab, ldab, bb, ldbb, z, ldz,
372 $ work, rwork, iinfo )
381 CALL zhbtrd( vect, uplo, n, ka, ab, ldab, w, rwork( inde ), z,
386 IF( .NOT.wantz )
THEN 387 CALL dsterf( n, w, rwork( inde ), info )
389 CALL zstedc(
'I', n, w, rwork( inde ), work, n, work( indwk2 ),
390 $ llwk2, rwork( indwrk ), llrwk, iwork, liwork,
392 CALL zgemm(
'N',
'N', n, n, n, cone, z, ldz, work, n, czero,
393 $ work( indwk2 ), n )
394 CALL zlacpy(
'A', n, n, work( indwk2 ), n, z, ldz )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zhbtrd(VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, WORK, INFO)
ZHBTRD
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine zhbgvd(JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZHBGVD
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine zstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZSTEDC
subroutine zpbstf(UPLO, N, KD, AB, LDAB, INFO)
ZPBSTF
subroutine zhbgst(VECT, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, X, LDX, WORK, RWORK, INFO)
ZHBGST