320 $ LDQ, VL, VU, IL, IU, ABSTOL, M, W, Z,
321 $ LDZ, WORK, LWORK, IWORK, IFAIL, INFO )
330 CHARACTER JOBZ, RANGE, UPLO
331 INTEGER IL, INFO, IU, KD, LDAB, LDQ, LDZ, M, N, LWORK
335 INTEGER IFAIL( * ), IWORK( * )
336 REAL AB( LDAB, * ), Q( LDQ, * ), W( * ), WORK( * ),
344 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
347 LOGICAL ALLEIG, INDEIG, LOWER, TEST, VALEIG, WANTZ,
350 INTEGER I, IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
351 $ indisp, indiwo, indwrk, iscale, itmp1, j, jj,
352 $ llwork, lwmin, lhtrd, lwtrd, ib, indhous,
354 REAL ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
355 $ SIGMA, SMLNUM, TMP1, VLL, VUU
361 EXTERNAL lsame, slamch, slansb, ilaenv2stage
369 INTRINSIC max, min, sqrt
375 wantz = lsame( jobz,
'V' )
376 alleig = lsame( range,
'A' )
377 valeig = lsame( range,
'V' )
378 indeig = lsame( range,
'I' )
379 lower = lsame( uplo,
'L' )
380 lquery = ( lwork.EQ.-1 )
383 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN
385 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
387 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
389 ELSE IF( n.LT.0 )
THEN
391 ELSE IF( kd.LT.0 )
THEN
393 ELSE IF( ldab.LT.kd+1 )
THEN
395 ELSE IF( wantz .AND. ldq.LT.max( 1, n ) )
THEN
399 IF( n.GT.0 .AND. vu.LE.vl )
401 ELSE IF( indeig )
THEN
402 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN
404 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN
410 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
419 ib = ilaenv2stage( 2,
'SSYTRD_SB2ST', jobz,
421 lhtrd = ilaenv2stage( 3,
'SSYTRD_SB2ST', jobz,
423 lwtrd = ilaenv2stage( 4,
'SSYTRD_SB2ST', jobz,
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 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 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 sstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSTEIN
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 ...
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine sgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
SGEMV
subroutine ssytrd_sb2st(STAGE1, VECT, UPLO, N, KD, AB, LDAB, D, E, HOUS, LHOUS, WORK, LWORK, INFO)
SSYTRD_SB2ST reduces a real symmetric band matrix A to real symmetric tridiagonal form T