293 SUBROUTINE dsbgvx( JOBZ, RANGE, UPLO, N, KA, KB, AB, LDAB, BB,
294 $ LDBB, Q, LDQ, VL, VU, IL, IU, ABSTOL, M, W, Z,
295 $ LDZ, WORK, IWORK, IFAIL, INFO )
303 CHARACTER JOBZ, RANGE, UPLO
304 INTEGER IL, INFO, IU, KA, KB, LDAB, LDBB, LDQ, LDZ, M,
306 DOUBLE PRECISION ABSTOL, VL, VU
309 INTEGER IFAIL( * ), IWORK( * )
310 DOUBLE PRECISION AB( ldab, * ), BB( ldbb, * ), Q( ldq, * ),
311 $ w( * ), work( * ), z( ldz, * )
317 DOUBLE PRECISION ZERO, ONE
318 parameter( zero = 0.0d+0, one = 1.0d+0 )
321 LOGICAL ALLEIG, INDEIG, TEST, UPPER, VALEIG, WANTZ
322 CHARACTER ORDER, VECT
323 INTEGER I, IINFO, INDD, INDE, INDEE, INDIBL, INDISP,
324 $ indiwo, indwrk, itmp1, j, jj, nsplit
325 DOUBLE PRECISION TMP1
342 wantz = lsame( jobz,
'V' )
343 upper = lsame( uplo,
'U' )
344 alleig = lsame( range,
'A' )
345 valeig = lsame( range,
'V' )
346 indeig = lsame( range,
'I' )
349 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN 351 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN 353 ELSE IF( .NOT.( upper .OR. lsame( uplo,
'L' ) ) )
THEN 355 ELSE IF( n.LT.0 )
THEN 357 ELSE IF( ka.LT.0 )
THEN 359 ELSE IF( kb.LT.0 .OR. kb.GT.ka )
THEN 361 ELSE IF( ldab.LT.ka+1 )
THEN 363 ELSE IF( ldbb.LT.kb+1 )
THEN 365 ELSE IF( ldq.LT.1 .OR. ( wantz .AND. ldq.LT.n ) )
THEN 369 IF( n.GT.0 .AND. vu.LE.vl )
371 ELSE IF( indeig )
THEN 372 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN 374 ELSE IF ( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN 380 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 386 CALL xerbla(
'DSBGVX', -info )
398 CALL dpbstf( uplo, n, kb, bb, ldbb, info )
406 CALL dsbgst( jobz, uplo, n, ka, kb, ab, ldab, bb, ldbb, q, ldq,
419 CALL dsbtrd( vect, uplo, n, ka, ab, ldab, work( indd ),
420 $ work( inde ), q, ldq, work( indwrk ), iinfo )
428 IF( il.EQ.1 .AND. iu.EQ.n )
THEN 432 IF( ( alleig .OR. test ) .AND. ( abstol.LE.zero ) )
THEN 433 CALL dcopy( n, work( indd ), 1, w, 1 )
435 CALL dcopy( n-1, work( inde ), 1, work( indee ), 1 )
436 IF( .NOT.wantz )
THEN 437 CALL dsterf( n, w, work( indee ), info )
439 CALL dlacpy(
'A', n, n, q, ldq, z, ldz )
440 CALL dsteqr( jobz, n, w, work( indee ), z, ldz,
441 $ work( indwrk ), info )
466 CALL dstebz( range, order, n, vl, vu, il, iu, abstol,
467 $ work( indd ), work( inde ), m, nsplit, w,
468 $ iwork( indibl ), iwork( indisp ), work( indwrk ),
469 $ iwork( indiwo ), info )
472 CALL dstein( n, work( indd ), work( inde ), m, w,
473 $ iwork( indibl ), iwork( indisp ), z, ldz,
474 $ work( indwrk ), iwork( indiwo ), ifail, info )
480 CALL dcopy( n, z( 1, j ), 1, work( 1 ), 1 )
481 CALL dgemv(
'N', n, n, one, q, ldq, work, 1, zero,
496 IF( w( jj ).LT.tmp1 )
THEN 503 itmp1 = iwork( indibl+i-1 )
505 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
507 iwork( indibl+j-1 ) = itmp1
508 CALL dswap( n, z( 1, i ), 1, z( 1, j ), 1 )
511 ifail( i ) = ifail( j )
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dsteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
DSTEQR
subroutine dstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
DSTEIN
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
DGEMV
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine dpbstf(UPLO, N, KD, AB, LDAB, INFO)
DPBSTF
subroutine xerbla(SRNAME, INFO)
XERBLA
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
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 dsbgst(VECT, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, X, LDX, WORK, INFO)
DSBGST