297 SUBROUTINE zhbgvx( JOBZ, RANGE, UPLO, N, KA, KB, AB, LDAB, BB,
298 $ LDBB, Q, LDQ, VL, VU, IL, IU, ABSTOL, M, W, Z,
299 $ LDZ, WORK, RWORK, IWORK, IFAIL, INFO )
306 CHARACTER JOBZ, RANGE, UPLO
307 INTEGER IL, INFO, IU, KA, KB, LDAB, LDBB, LDQ, LDZ, M,
309 DOUBLE PRECISION ABSTOL, VL, VU
312 INTEGER IFAIL( * ), IWORK( * )
313 DOUBLE PRECISION RWORK( * ), W( * )
314 COMPLEX*16 AB( ldab, * ), BB( ldbb, * ), Q( ldq, * ),
315 $ work( * ), z( ldz, * )
321 DOUBLE PRECISION ZERO
322 parameter( zero = 0.0d+0 )
323 COMPLEX*16 CZERO, CONE
324 parameter( czero = ( 0.0d+0, 0.0d+0 ),
325 $ cone = ( 1.0d+0, 0.0d+0 ) )
328 LOGICAL ALLEIG, INDEIG, TEST, UPPER, VALEIG, WANTZ
329 CHARACTER ORDER, VECT
330 INTEGER I, IINFO, INDD, INDE, INDEE, INDIBL, INDISP,
331 $ indiwk, indrwk, indwrk, itmp1, j, jj, nsplit
332 DOUBLE PRECISION TMP1
350 wantz = lsame( jobz,
'V' )
351 upper = lsame( uplo,
'U' )
352 alleig = lsame( range,
'A' )
353 valeig = lsame( range,
'V' )
354 indeig = lsame( range,
'I' )
357 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN 359 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN 361 ELSE IF( .NOT.( upper .OR. lsame( uplo,
'L' ) ) )
THEN 363 ELSE IF( n.LT.0 )
THEN 365 ELSE IF( ka.LT.0 )
THEN 367 ELSE IF( kb.LT.0 .OR. kb.GT.ka )
THEN 369 ELSE IF( ldab.LT.ka+1 )
THEN 371 ELSE IF( ldbb.LT.kb+1 )
THEN 373 ELSE IF( ldq.LT.1 .OR. ( wantz .AND. ldq.LT.n ) )
THEN 377 IF( n.GT.0 .AND. vu.LE.vl )
379 ELSE IF( indeig )
THEN 380 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN 382 ELSE IF ( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN 388 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 394 CALL xerbla(
'ZHBGVX', -info )
406 CALL zpbstf( uplo, n, kb, bb, ldbb, info )
414 CALL zhbgst( jobz, uplo, n, ka, kb, ab, ldab, bb, ldbb, q, ldq,
415 $ work, rwork, iinfo )
429 CALL zhbtrd( vect, uplo, n, ka, ab, ldab, rwork( indd ),
430 $ rwork( inde ), q, ldq, work( indwrk ), iinfo )
438 IF( il.EQ.1 .AND. iu.EQ.n )
THEN 442 IF( ( alleig .OR. test ) .AND. ( abstol.LE.zero ) )
THEN 443 CALL dcopy( n, rwork( indd ), 1, w, 1 )
445 CALL dcopy( n-1, rwork( inde ), 1, rwork( indee ), 1 )
446 IF( .NOT.wantz )
THEN 447 CALL dsterf( n, w, rwork( indee ), info )
449 CALL zlacpy(
'A', n, n, q, ldq, z, ldz )
450 CALL zsteqr( jobz, n, w, rwork( indee ), z, ldz,
451 $ rwork( indrwk ), info )
476 CALL dstebz( range, order, n, vl, vu, il, iu, abstol,
477 $ rwork( indd ), rwork( inde ), m, nsplit, w,
478 $ iwork( indibl ), iwork( indisp ), rwork( indrwk ),
479 $ iwork( indiwk ), info )
482 CALL zstein( n, rwork( indd ), rwork( inde ), m, w,
483 $ iwork( indibl ), iwork( indisp ), z, ldz,
484 $ rwork( indrwk ), iwork( indiwk ), ifail, info )
490 CALL zcopy( n, z( 1, j ), 1, work( 1 ), 1 )
491 CALL zgemv(
'N', n, n, cone, q, ldq, work, 1, czero,
506 IF( w( jj ).LT.tmp1 )
THEN 513 itmp1 = iwork( indibl+i-1 )
515 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
517 iwork( indibl+j-1 ) = itmp1
518 CALL zswap( n, z( 1, i ), 1, z( 1, j ), 1 )
521 ifail( i ) = ifail( j )
subroutine dstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
DSTEBZ
subroutine zsteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
ZSTEQR
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 zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
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
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine zstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
ZSTEIN
subroutine zgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
ZGEMV
subroutine zhbgvx(JOBZ, RANGE, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, Q, LDQ, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, RWORK, IWORK, IFAIL, INFO)
ZHBGVX
subroutine zswap(N, ZX, INCX, ZY, INCY)
ZSWAP