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 dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
DGEMV
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 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 dsterf(N, D, E, INFO)
DSTERF
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine dstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
DSTEBZ
subroutine dpbstf(UPLO, N, KD, AB, LDAB, INFO)
DPBSTF
subroutine dsbtrd(VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, WORK, INFO)
DSBTRD
subroutine xerbla(SRNAME, INFO)
XERBLA