291 SUBROUTINE ssbgvx( 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,
306 INTEGER IFAIL( * ), IWORK( * )
307 REAL AB( LDAB, * ), BB( LDBB, * ), Q( LDQ, * ),
308 $ w( * ), work( * ), z( ldz, * )
315 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+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
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(
'SSBGVX', -info )
395 CALL spbstf( uplo, n, kb, bb, ldbb, info )
403 CALL ssbgst( jobz, uplo, n, ka, kb, ab, ldab, bb, ldbb, q, ldq,
416 CALL ssbtrd( 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 scopy( n, work( indd ), 1, w, 1 )
432 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
433 IF( .NOT.wantz )
THEN
434 CALL ssterf( n, w, work( indee ), info )
436 CALL slacpy(
'A', n, n, q, ldq, z, ldz )
437 CALL ssteqr( jobz, n, w, work( indee ), z, ldz,
438 $ work( indwrk ), info )
463 CALL sstebz( 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 sstein( n, work( indd ), work( inde ), m, w,
470 $ iwork( indibl ), iwork( indisp ), z, ldz,
471 $ work( indwrk ), iwork( indiwo ), ifail, info )
477 CALL scopy( n, z( 1, j ), 1, work( 1 ), 1 )
478 CALL sgemv(
'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 sswap( n, z( 1, i ), 1, z( 1, j ), 1 )
508 ifail( i ) = ifail( j )
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ssteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
SSTEQR
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine sstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
SSTEBZ
subroutine spbstf(UPLO, N, KD, AB, LDAB, INFO)
SPBSTF
subroutine ssbtrd(VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, WORK, INFO)
SSBTRD
subroutine sstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSTEIN
subroutine ssbgst(VECT, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, X, LDX, WORK, INFO)
SSBGST
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 sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine sgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
SGEMV