291 SUBROUTINE dsbgvx( JOBZ, RANGE, UPLO, N, KA, KB, AB, LDAB, BB,
292 $ LDBB, Q, LDQ, VL, VU, IL, IU, ABSTOL, M, W, Z,
293 $ LDZ, WORK, IWORK, IFAIL, INFO )
300 CHARACTER JOBZ, RANGE, UPLO
301 INTEGER IL, INFO, IU, KA, KB, LDAB, LDBB, LDQ, LDZ, M,
303 DOUBLE PRECISION ABSTOL, VL, VU
306 INTEGER IFAIL( * ), IWORK( * )
307 DOUBLE PRECISION AB( ldab, * ), BB( ldbb, * ), Q( ldq, * ),
308 $ w( * ), work( * ), z( ldz, * )
314 DOUBLE PRECISION ZERO, ONE
315 parameter( zero = 0.0d+0, one = 1.0d+0 )
318 LOGICAL ALLEIG, INDEIG, TEST, UPPER, VALEIG, WANTZ
319 CHARACTER ORDER, VECT
320 INTEGER I, IINFO, INDD, INDE, INDEE, INDIBL, INDISP,
321 $ indiwo, indwrk, itmp1, j, jj, nsplit
322 DOUBLE PRECISION TMP1
339 wantz = lsame( jobz,
'V' )
340 upper = lsame( uplo,
'U' )
341 alleig = lsame( range,
'A' )
342 valeig = lsame( range,
'V' )
343 indeig = lsame( range,
'I' )
346 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN 348 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN 350 ELSE IF( .NOT.( upper .OR. lsame( uplo,
'L' ) ) )
THEN 352 ELSE IF( n.LT.0 )
THEN 354 ELSE IF( ka.LT.0 )
THEN 356 ELSE IF( kb.LT.0 .OR. kb.GT.ka )
THEN 358 ELSE IF( ldab.LT.ka+1 )
THEN 360 ELSE IF( ldbb.LT.kb+1 )
THEN 362 ELSE IF( ldq.LT.1 .OR. ( wantz .AND. ldq.LT.n ) )
THEN 366 IF( n.GT.0 .AND. vu.LE.vl )
368 ELSE IF( indeig )
THEN 369 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN 371 ELSE IF ( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN 377 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 383 CALL xerbla(
'DSBGVX', -info )
395 CALL dpbstf( uplo, n, kb, bb, ldbb, info )
403 CALL dsbgst( jobz, uplo, n, ka, kb, ab, ldab, bb, ldbb, q, ldq,
416 CALL dsbtrd( vect, uplo, n, ka, ab, ldab, work( indd ),
417 $ work( inde ), q, ldq, work( indwrk ), iinfo )
425 IF( il.EQ.1 .AND. iu.EQ.n )
THEN 429 IF( ( alleig .OR. test ) .AND. ( abstol.LE.zero ) )
THEN 430 CALL dcopy( n, work( indd ), 1, w, 1 )
432 CALL dcopy( n-1, work( inde ), 1, work( indee ), 1 )
433 IF( .NOT.wantz )
THEN 434 CALL dsterf( n, w, work( indee ), info )
436 CALL dlacpy(
'A', n, n, q, ldq, z, ldz )
437 CALL dsteqr( jobz, n, w, work( indee ), z, ldz,
438 $ work( indwrk ), info )
463 CALL dstebz( range, order, n, vl, vu, il, iu, abstol,
464 $ work( indd ), work( inde ), m, nsplit, w,
465 $ iwork( indibl ), iwork( indisp ), work( indwrk ),
466 $ iwork( indiwo ), info )
469 CALL dstein( n, work( indd ), work( inde ), m, w,
470 $ iwork( indibl ), iwork( indisp ), z, ldz,
471 $ work( indwrk ), iwork( indiwo ), ifail, info )
477 CALL dcopy( n, z( 1, j ), 1, work( 1 ), 1 )
478 CALL dgemv(
'N', n, n, one, q, ldq, work, 1, zero,
493 IF( w( jj ).LT.tmp1 )
THEN 500 itmp1 = iwork( indibl+i-1 )
502 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
504 iwork( indibl+j-1 ) = itmp1
505 CALL dswap( n, z( 1, i ), 1, z( 1, j ), 1 )
508 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 dsbtrd(VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, WORK, INFO)
DSBTRD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dpbstf(UPLO, N, KD, AB, LDAB, INFO)
DPBSTF
subroutine dgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
DGEMV
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine dsbgst(VECT, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, X, LDX, WORK, INFO)
DSBGST
subroutine dstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
DSTEIN
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dsteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
DSTEQR
subroutine dsbgvx(JOBZ, RANGE, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, Q, LDQ, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, IWORK, IFAIL, INFO)
DSBGVX