380 SUBROUTINE ssyevr_2stage( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
381 $ IL, IU, ABSTOL, M, W, Z, LDZ, ISUPPZ, WORK,
382 $ LWORK, IWORK, LIWORK, INFO )
392 CHARACTER JOBZ, RANGE, UPLO
393 INTEGER IL, INFO, IU, LDA, LDZ, LIWORK, LWORK, M, N
397 INTEGER ISUPPZ( * ), IWORK( * )
398 REAL A( lda, * ), W( * ), WORK( * ), Z( ldz, * )
405 parameter( zero = 0.0e+0, one = 1.0e+0, two = 2.0e+0 )
408 LOGICAL ALLEIG, INDEIG, LOWER, LQUERY, VALEIG, WANTZ,
411 INTEGER I, IEEEOK, IINFO, IMAX, INDD, INDDD, INDE,
412 $ indee, indibl, indifl, indisp, indiwo, indtau,
413 $ indwk, indwkn, iscale, j, jj, liwmin,
414 $ llwork, llwrkn, lwmin, nsplit,
415 $ lhtrd, lwtrd, kd, ib, indhous
416 REAL ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
417 $ sigma, smlnum, tmp1, vll, vuu
423 EXTERNAL lsame, ilaenv, slamch, slansy
430 INTRINSIC max, min, sqrt
436 ieeeok = ilaenv( 10,
'SSYEVR',
'N', 1, 2, 3, 4 )
438 lower = lsame( uplo,
'L' )
439 wantz = lsame( jobz,
'V' )
440 alleig = lsame( range,
'A' )
441 valeig = lsame( range,
'V' )
442 indeig = lsame( range,
'I' )
444 lquery = ( ( lwork.EQ.-1 ) .OR. ( liwork.EQ.-1 ) )
446 kd = ilaenv( 17,
'SSYTRD_2STAGE', jobz, n, -1, -1, -1 )
447 ib = ilaenv( 18,
'SSYTRD_2STAGE', jobz, n, kd, -1, -1 )
448 lhtrd = ilaenv( 19,
'SSYTRD_2STAGE', jobz, n, kd, ib, -1 )
449 lwtrd = ilaenv( 20,
'SSYTRD_2STAGE', jobz, n, kd, ib, -1 )
450 lwmin = max( 26*n, 5*n + lhtrd + lwtrd )
451 liwmin = max( 1, 10*n )
454 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN 456 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN 458 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN 460 ELSE IF( n.LT.0 )
THEN 462 ELSE IF( lda.LT.max( 1, n ) )
THEN 466 IF( n.GT.0 .AND. vu.LE.vl )
468 ELSE IF( indeig )
THEN 469 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN 471 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN 477 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 479 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 481 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN 495 CALL xerbla(
'SSYEVR_2STAGE', -info )
497 ELSE IF( lquery )
THEN 511 IF( alleig .OR. indeig )
THEN 515 IF( vl.LT.a( 1, 1 ) .AND. vu.GE.a( 1, 1 ) )
THEN 530 safmin = slamch(
'Safe minimum' )
531 eps = slamch(
'Precision' )
532 smlnum = safmin / eps
533 bignum = one / smlnum
534 rmin = sqrt( smlnum )
535 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
545 anrm = slansy(
'M', uplo, n, a, lda, work )
546 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN 549 ELSE IF( anrm.GT.rmax )
THEN 553 IF( iscale.EQ.1 )
THEN 556 CALL sscal( n-j+1, sigma, a( j, j ), 1 )
560 CALL sscal( j, sigma, a( 1, j ), 1 )
564 $ abstll = abstol*sigma
592 indwk = indhous + lhtrd
593 llwork = lwork - indwk + 1
615 $ work( inde ), work( indtau ), work( indhous ),
616 $ lhtrd, work( indwk ), llwork, iinfo )
623 IF( il.EQ.1 .AND. iu.EQ.n )
THEN 627 IF( ( alleig.OR.test ) .AND. ( ieeeok.EQ.1 ) )
THEN 628 IF( .NOT.wantz )
THEN 629 CALL scopy( n, work( indd ), 1, w, 1 )
630 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
631 CALL ssterf( n, w, work( indee ), info )
633 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
634 CALL scopy( n, work( indd ), 1, work( inddd ), 1 )
636 IF (abstol .LE. two*n*eps)
THEN 641 CALL sstemr( jobz,
'A', n, work( inddd ), work( indee ),
642 $ vl, vu, il, iu, m, w, z, ldz, n, isuppz,
643 $ tryrac, work( indwk ), lwork, iwork, liwork,
651 IF( wantz .AND. info.EQ.0 )
THEN 653 llwrkn = lwork - indwkn + 1
654 CALL sormtr(
'L', uplo,
'N', n, m, a, lda,
655 $ work( indtau ), z, ldz, work( indwkn ),
679 CALL sstebz( range, order, n, vll, vuu, il, iu, abstll,
680 $ work( indd ), work( inde ), m, nsplit, w,
681 $ iwork( indibl ), iwork( indisp ), work( indwk ),
682 $ iwork( indiwo ), info )
685 CALL sstein( n, work( indd ), work( inde ), m, w,
686 $ iwork( indibl ), iwork( indisp ), z, ldz,
687 $ work( indwk ), iwork( indiwo ), iwork( indifl ),
694 llwrkn = lwork - indwkn + 1
695 CALL sormtr(
'L', uplo,
'N', n, m, a, lda, work( indtau ), z,
696 $ ldz, work( indwkn ), llwrkn, iinfo )
703 IF( iscale.EQ.1 )
THEN 709 CALL sscal( imax, one / sigma, w, 1 )
722 IF( w( jj ).LT.tmp1 )
THEN 731 CALL sswap( n, z( 1, i ), 1, z( 1, j ), 1 )
subroutine sstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
SSTEBZ
subroutine ssytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
SSYTRD_2STAGE
subroutine sormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMTR
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 ma...
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSTEIN
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine sstemr(JOBZ, RANGE, N, D, E, VL, VU, IL, IU, M, W, Z, LDZ, NZC, ISUPPZ, TRYRAC, WORK, LWORK, IWORK, LIWORK, INFO)
SSTEMR