321 SUBROUTINE ssbevx_2stage( JOBZ, RANGE, UPLO, N, KD, AB, LDAB, Q,
322 $ ldq, vl, vu, il, iu, abstol, m, w, z,
323 $ ldz, work, lwork, iwork, ifail, info )
333 CHARACTER JOBZ, RANGE, UPLO
334 INTEGER IL, INFO, IU, KD, LDAB, LDQ, LDZ, M, N, LWORK
338 INTEGER IFAIL( * ), IWORK( * )
339 REAL AB( ldab, * ), Q( ldq, * ), W( * ), WORK( * ),
347 parameter ( zero = 0.0e0, one = 1.0e0 )
350 LOGICAL ALLEIG, INDEIG, LOWER, TEST, VALEIG, WANTZ,
353 INTEGER I, IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
354 $ indisp, indiwo, indwrk, iscale, itmp1, j, jj,
355 $ llwork, lwmin, lhtrd, lwtrd, ib, indhous,
357 REAL ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
358 $ sigma, smlnum, tmp1, vll, vuu
364 EXTERNAL lsame, slamch, slansb, ilaenv
372 INTRINSIC max, min, sqrt
378 wantz = lsame( jobz,
'V' )
379 alleig = lsame( range,
'A' )
380 valeig = lsame( range,
'V' )
381 indeig = lsame( range,
'I' )
382 lower = lsame( uplo,
'L' )
383 lquery = ( lwork.EQ.-1 )
386 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN
388 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
390 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
392 ELSE IF( n.LT.0 )
THEN
394 ELSE IF( kd.LT.0 )
THEN
396 ELSE IF( ldab.LT.kd+1 )
THEN
398 ELSE IF( wantz .AND. ldq.LT.max( 1, n ) )
THEN
402 IF( n.GT.0 .AND. vu.LE.vl )
404 ELSE IF( indeig )
THEN
405 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN
407 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN
413 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
422 ib = ilaenv( 18,
'SSYTRD_SB2ST', jobz, n, kd, -1, -1 )
423 lhtrd = ilaenv( 19,
'SSYTRD_SB2ST', jobz, n, kd, ib, -1 )
424 lwtrd = ilaenv( 20,
'SSYTRD_SB2ST', jobz, n, kd, ib, -1 )
425 lwmin = 2*n + lhtrd + lwtrd
429 IF( lwork.LT.lwmin .AND. .NOT.lquery )
434 CALL xerbla(
'SSBEVX_2STAGE ', -info )
436 ELSE IF( lquery )
THEN
454 IF( .NOT.( vl.LT.tmp1 .AND. vu.GE.tmp1 ) )
467 safmin = slamch(
'Safe minimum' )
468 eps = slamch(
'Precision' )
469 smlnum = safmin / eps
470 bignum = one / smlnum
471 rmin = sqrt( smlnum )
472 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
485 anrm = slansb(
'M', uplo, n, kd, ab, ldab, work )
486 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
489 ELSE IF( anrm.GT.rmax )
THEN
493 IF( iscale.EQ.1 )
THEN
495 CALL slascl(
'B', kd, kd, one, sigma, n, n, ab, ldab, info )
497 CALL slascl(
'Q', kd, kd, one, sigma, n, n, ab, ldab, info )
500 $ abstll = abstol*sigma
512 indwrk = indhous + lhtrd
513 llwork = lwork - indwrk + 1
515 CALL ssytrd_sb2st(
"N", jobz, uplo, n, kd, ab, ldab, work( indd ),
516 $ work( inde ), work( indhous ), lhtrd,
517 $ work( indwrk ), llwork, iinfo )
525 IF (il.EQ.1 .AND. iu.EQ.n)
THEN
529 IF ((alleig .OR. test) .AND. (abstol.LE.zero))
THEN
530 CALL scopy( n, work( indd ), 1, w, 1 )
532 IF( .NOT.wantz )
THEN
533 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
534 CALL ssterf( n, w, work( indee ), info )
536 CALL slacpy(
'A', n, n, q, ldq, z, ldz )
537 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
538 CALL ssteqr( jobz, n, w, work( indee ), z, ldz,
539 $ work( indwrk ), info )
563 CALL sstebz( range, order, n, vll, vuu, il, iu, abstll,
564 $ work( indd ), work( inde ), m, nsplit, w,
565 $ iwork( indibl ), iwork( indisp ), work( indwrk ),
566 $ iwork( indiwo ), info )
569 CALL sstein( n, work( indd ), work( inde ), m, w,
570 $ iwork( indibl ), iwork( indisp ), z, ldz,
571 $ work( indwrk ), iwork( indiwo ), ifail, info )
577 CALL scopy( n, z( 1, j ), 1, work( 1 ), 1 )
578 CALL sgemv(
'N', n, n, one, q, ldq, work, 1, zero,
586 IF( iscale.EQ.1 )
THEN
592 CALL sscal( imax, one / sigma, w, 1 )
603 IF( w( jj ).LT.tmp1 )
THEN
610 itmp1 = iwork( indibl+i-1 )
612 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
614 iwork( indibl+j-1 ) = itmp1
615 CALL sswap( n, z( 1, i ), 1, z( 1, j ), 1 )
618 ifail( i ) = ifail( j )
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 sstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSTEIN
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine sstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
SSTEBZ
subroutine sscal(N, SA, SX, INCX)
SSCAL
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
subroutine ssbevx_2stage(JOBZ, RANGE, UPLO, N, KD, AB, LDAB, Q, LDQ, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, IWORK, IFAIL, INFO)
SSBEVX_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER...