293 SUBROUTINE ssbgvx( 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,
309 INTEGER IFAIL( * ), IWORK( * )
310 REAL AB( ldab, * ), BB( ldbb, * ), Q( ldq, * ),
311 $ w( * ), work( * ), z( ldz, * )
318 parameter ( zero = 0.0e+0, one = 1.0e+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
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(
'SSBGVX', -info )
398 CALL spbstf( uplo, n, kb, bb, ldbb, info )
406 CALL ssbgst( jobz, uplo, n, ka, kb, ab, ldab, bb, ldbb, q, ldq,
419 CALL ssbtrd( 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 scopy( n, work( indd ), 1, w, 1 )
435 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
436 IF( .NOT.wantz )
THEN
437 CALL ssterf( n, w, work( indee ), info )
439 CALL slacpy(
'A', n, n, q, ldq, z, ldz )
440 CALL ssteqr( jobz, n, w, work( indee ), z, ldz,
441 $ work( indwrk ), info )
466 CALL sstebz( 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 sstein( n, work( indd ), work( inde ), m, w,
473 $ iwork( indibl ), iwork( indisp ), z, ldz,
474 $ work( indwrk ), iwork( indiwo ), ifail, info )
480 CALL scopy( n, z( 1, j ), 1, work( 1 ), 1 )
481 CALL sgemv(
'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 sswap( n, z( 1, i ), 1, z( 1, j ), 1 )
511 ifail( i ) = ifail( j )
subroutine spbstf(UPLO, N, KD, AB, LDAB, INFO)
SPBSTF
subroutine ssteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
SSTEQR
subroutine sgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
SGEMV
subroutine ssbgst(VECT, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, X, LDX, WORK, INFO)
SSBGST
subroutine sstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSTEIN
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ssbtrd(VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, WORK, INFO)
SSBTRD
subroutine ssbgvx(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)
SSBGVX
subroutine sstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
SSTEBZ
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY