379 $ IL, IU, ABSTOL, M, W, Z, LDZ, ISUPPZ, WORK,
380 $ LWORK, IWORK, LIWORK, INFO )
389 CHARACTER JOBZ, RANGE, UPLO
390 INTEGER IL, INFO, IU, LDA, LDZ, LIWORK, LWORK, M, N
394 INTEGER ISUPPZ( * ), IWORK( * )
395 REAL A( LDA, * ), W( * ), WORK( * ), Z( LDZ, * )
402 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0, two = 2.0e+0 )
405 LOGICAL ALLEIG, INDEIG, LOWER, LQUERY, VALEIG, WANTZ,
408 INTEGER I, IEEEOK, IINFO, IMAX, INDD, INDDD, INDE,
409 $ indee, indibl, indifl, indisp, indiwo, indtau,
410 $ indwk, indwkn, iscale, j, jj, liwmin,
411 $ llwork, llwrkn, lwmin, nsplit,
412 $ lhtrd, lwtrd, kd, ib, indhous
413 REAL ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
414 $ SIGMA, SMLNUM, TMP1, VLL, VUU
418 INTEGER ILAENV, ILAENV2STAGE
420 EXTERNAL lsame, slamch, slansy, ilaenv, ilaenv2stage
427 INTRINSIC max, min, sqrt
433 ieeeok = ilaenv( 10,
'SSYEVR',
'N', 1, 2, 3, 4 )
435 lower = lsame( uplo,
'L' )
436 wantz = lsame( jobz,
'V' )
437 alleig = lsame( range,
'A' )
438 valeig = lsame( range,
'V' )
439 indeig = lsame( range,
'I' )
441 lquery = ( ( lwork.EQ.-1 ) .OR. ( liwork.EQ.-1 ) )
443 kd = ilaenv2stage( 1,
'SSYTRD_2STAGE', jobz, n, -1, -1, -1 )
444 ib = ilaenv2stage( 2,
'SSYTRD_2STAGE', jobz, n, kd, -1, -1 )
445 lhtrd = ilaenv2stage( 3,
'SSYTRD_2STAGE', jobz, n, kd, ib, -1 )
446 lwtrd = ilaenv2stage( 4,
'SSYTRD_2STAGE', jobz, n, kd, ib, -1 )
447 lwmin = max( 26*n, 5*n + lhtrd + lwtrd )
448 liwmin = max( 1, 10*n )
451 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN
453 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
455 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
457 ELSE IF( n.LT.0 )
THEN
459 ELSE IF( lda.LT.max( 1, n ) )
THEN
463 IF( n.GT.0 .AND. vu.LE.vl )
465 ELSE IF( indeig )
THEN
466 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN
468 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN
474 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
476 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
478 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
492 CALL xerbla(
'SSYEVR_2STAGE', -info )
494 ELSE IF( lquery )
THEN
508 IF( alleig .OR. indeig )
THEN
512 IF( vl.LT.a( 1, 1 ) .AND. vu.GE.a( 1, 1 ) )
THEN
527 safmin = slamch(
'Safe minimum' )
528 eps = slamch(
'Precision' )
529 smlnum = safmin / eps
530 bignum = one / smlnum
531 rmin = sqrt( smlnum )
532 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
542 anrm = slansy(
'M', uplo, n, a, lda, work )
543 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
546 ELSE IF( anrm.GT.rmax )
THEN
550 IF( iscale.EQ.1 )
THEN
553 CALL sscal( n-j+1, sigma, a( j, j ), 1 )
557 CALL sscal( j, sigma, a( 1, j ), 1 )
561 $ abstll = abstol*sigma
589 indwk = indhous + lhtrd
590 llwork = lwork - indwk + 1
612 $ work( inde ), work( indtau ), work( indhous ),
613 $ lhtrd, work( indwk ), llwork, iinfo )
620 IF( il.EQ.1 .AND. iu.EQ.n )
THEN
624 IF( ( alleig.OR.test ) .AND. ( ieeeok.EQ.1 ) )
THEN
625 IF( .NOT.wantz )
THEN
626 CALL scopy( n, work( indd ), 1, w, 1 )
627 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
628 CALL ssterf( n, w, work( indee ), info )
630 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
631 CALL scopy( n, work( indd ), 1, work( inddd ), 1 )
633 IF (abstol .LE. two*n*eps)
THEN
638 CALL sstemr( jobz,
'A', n, work( inddd ), work( indee ),
639 $ vl, vu, il, iu, m, w, z, ldz, n, isuppz,
640 $ tryrac, work( indwk ), lwork, iwork, liwork,
648 IF( wantz .AND. info.EQ.0 )
THEN
650 llwrkn = lwork - indwkn + 1
651 CALL sormtr(
'L', uplo,
'N', n, m, a, lda,
652 $ work( indtau ), z, ldz, work( indwkn ),
676 CALL sstebz( range, order, n, vll, vuu, il, iu, abstll,
677 $ work( indd ), work( inde ), m, nsplit, w,
678 $ iwork( indibl ), iwork( indisp ), work( indwk ),
679 $ iwork( indiwo ), info )
682 CALL sstein( n, work( indd ), work( inde ), m, w,
683 $ iwork( indibl ), iwork( indisp ), z, ldz,
684 $ work( indwk ), iwork( indiwo ), iwork( indifl ),
691 llwrkn = lwork - indwkn + 1
692 CALL sormtr(
'L', uplo,
'N', n, m, a, lda, work( indtau ), z,
693 $ ldz, work( indwkn ), llwrkn, iinfo )
700 IF( iscale.EQ.1 )
THEN
706 CALL sscal( imax, one / sigma, w, 1 )
719 IF( w( jj ).LT.tmp1 )
THEN
728 CALL sswap( n, z( 1, i ), 1, z( 1, j ), 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
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 sormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMTR
subroutine sstemr(JOBZ, RANGE, N, D, E, VL, VU, IL, IU, M, W, Z, LDZ, NZC, ISUPPZ, TRYRAC, WORK, LWORK, IWORK, LIWORK, INFO)
SSTEMR
subroutine sstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSTEIN
subroutine ssytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
SSYTRD_2STAGE
subroutine ssyevr_2stage(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, ISUPPZ, WORK, LWORK, IWORK, LIWORK, INFO)
SSYEVR_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY mat...
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine sscal(N, SA, SX, INCX)
SSCAL