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 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