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 )