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, 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 )
462 CALL dstebz( range, order, n, vl, vu, il, iu, abstol,
463 $ work( indd ), work( inde ), m, nsplit, w,
464 $ iwork( 1 ), iwork( indisp ), work( indwrk ),
465 $ iwork( indiwo ), info )
468 CALL dstein( n, work( indd ), work( inde ), m, w,
469 $ iwork( 1 ), iwork( indisp ), z, ldz,
470 $ work( indwrk ), iwork( indiwo ), ifail, info )
476 CALL dcopy( n, z( 1, j ), 1, work( 1 ), 1 )
477 CALL dgemv(
'N', n, n, one, q, ldq, work, 1, zero,
492 IF( w( jj ).LT.tmp1 )
THEN
499 itmp1 = iwork( 1 + i-1 )
501 iwork( 1 + i-1 ) = iwork( 1 + j-1 )
503 iwork( 1 + j-1 ) = itmp1
504 CALL dswap( n, z( 1, i ), 1, z( 1, j ), 1 )
507 ifail( i ) = ifail( j )
subroutine xerbla(srname, info)
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 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 dsbtrd(vect, uplo, n, kd, ab, ldab, d, e, q, ldq, work, info)
DSBTRD
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 dstebz(range, order, n, vl, vu, il, iu, abstol, d, e, m, nsplit, w, iblock, isplit, work, iwork, info)
DSTEBZ
subroutine dstein(n, d, e, m, w, iblock, isplit, z, ldz, work, iwork, ifail, info)
DSTEIN
subroutine dsteqr(compz, n, d, e, z, ldz, work, info)
DSTEQR
subroutine dsterf(n, d, e, info)
DSTERF
subroutine dswap(n, dx, incx, dy, incy)
DSWAP