318 SUBROUTINE sstemr( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
319 $ M, W, Z, LDZ, NZC, ISUPPZ, TRYRAC, WORK, LWORK,
320 $ IWORK, LIWORK, INFO )
327 CHARACTER JOBZ, RANGE
329 INTEGER IL, INFO, IU, LDZ, NZC, LIWORK, LWORK, M, N
333 INTEGER ISUPPZ( * ), IWORK( * )
334 REAL D( * ), E( * ), W( * ), WORK( * )
341 REAL ZERO, ONE, FOUR, MINRGP
342 PARAMETER ( ZERO = 0.0e0, one = 1.0e0,
347 LOGICAL ALLEIG, INDEIG, LQUERY, VALEIG, WANTZ, ZQUERY
348 INTEGER I, IBEGIN, IEND, IFIRST, IIL, IINDBL, IINDW,
349 $ iindwk, iinfo, iinspl, iiu, ilast, in, indd,
350 $ inde2, inderr, indgp, indgrs, indwrk, itmp,
351 $ itmp2, j, jblk, jj, liwmin, lwmin, nsplit,
352 $ nzcmin, offset, wbegin, wend
353 REAL BIGNUM, CS, EPS, PIVMIN, R1, R2, RMAX, RMIN,
354 $ RTOL1, RTOL2, SAFMIN, SCALE, SMLNUM, SN,
355 $ thresh, tmp, tnrm, wl, wu
361 EXTERNAL lsame, slamch, slanst
368 INTRINSIC max, min, sqrt
374 wantz = lsame( jobz,
'V' )
375 alleig = lsame( range,
'A' )
376 valeig = lsame( range,
'V' )
377 indeig = lsame( range,
'I' )
379 lquery = ( ( lwork.EQ.-1 ).OR.( liwork.EQ.-1 ) )
380 zquery = ( nzc.EQ.-1 )
406 ELSEIF( indeig )
THEN
413 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
415 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
417 ELSE IF( n.LT.0 )
THEN
419 ELSE IF( valeig .AND. n.GT.0 .AND. wu.LE.wl )
THEN
421 ELSE IF( indeig .AND. ( iil.LT.1 .OR. iil.GT.n ) )
THEN
423 ELSE IF( indeig .AND. ( iiu.LT.iil .OR. iiu.GT.n ) )
THEN
425 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
427 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
429 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
435 safmin = slamch(
'Safe minimum' )
436 eps = slamch(
'Precision' )
437 smlnum = safmin / eps
438 bignum = one / smlnum
439 rmin = sqrt( smlnum )
440 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
446 IF( wantz .AND. alleig )
THEN
448 ELSE IF( wantz .AND. valeig )
THEN
449 CALL slarrc(
'T', n, vl, vu, d, e, safmin,
450 $ nzcmin, itmp, itmp2, info )
451 ELSE IF( wantz .AND. indeig )
THEN
457 IF( zquery .AND. info.EQ.0 )
THEN
459 ELSE IF( nzc.LT.nzcmin .AND. .NOT.zquery )
THEN
466 CALL xerbla(
'SSTEMR', -info )
469 ELSE IF( lquery .OR. zquery )
THEN
480 IF( alleig .OR. indeig )
THEN
484 IF( wl.LT.d( 1 ) .AND. wu.GE.d( 1 ) )
THEN
489 IF( wantz.AND.(.NOT.zquery) )
THEN
498 IF( .NOT.wantz )
THEN
499 CALL slae2( d(1), e(1), d(2), r1, r2 )
500 ELSE IF( wantz.AND.(.NOT.zquery) )
THEN
501 CALL slaev2( d(1), e(1), d(2), r1, r2, cs, sn )
504 $ (valeig.AND.(r2.GT.wl).AND.
506 $ (indeig.AND.(iil.EQ.1)) )
THEN
509 IF( wantz.AND.(.NOT.zquery) )
THEN
528 $ (valeig.AND.(r1.GT.wl).AND.
530 $ (indeig.AND.(iiu.EQ.2)) )
THEN
533 IF( wantz.AND.(.NOT.zquery) )
THEN
574 tnrm = slanst(
'M', n, d, e )
575 IF( tnrm.GT.zero .AND. tnrm.LT.rmin )
THEN
577 ELSE IF( tnrm.GT.rmax )
THEN
580 IF( scale.NE.one )
THEN
581 CALL sscal( n, scale, d, 1 )
582 CALL sscal( n-1, scale, e, 1 )
602 CALL slarrr( n, d, e, iinfo )
618 CALL scopy(n,d,1,work(indd),1)
622 work( inde2+j-1 ) = e(j)**2
626 IF( .NOT.wantz )
THEN
635 rtol1 = max( sqrt(eps)*5.0e-2, four * eps )
636 rtol2 = max( sqrt(eps)*5.0e-3, four * eps )
638 CALL slarre( range, n, wl, wu, iil, iiu, d, e,
639 $ work(inde2), rtol1, rtol2, thresh, nsplit,
640 $ iwork( iinspl ), m, w, work( inderr ),
641 $ work( indgp ), iwork( iindbl ),
642 $ iwork( iindw ), work( indgrs ), pivmin,
643 $ work( indwrk ), iwork( iindwk ), iinfo )
644 IF( iinfo.NE.0 )
THEN
645 info = 10 + abs( iinfo )
658 CALL slarrv( n, wl, wu, d, e,
659 $ pivmin, iwork( iinspl ), m,
660 $ 1, m, minrgp, rtol1, rtol2,
661 $ w, work( inderr ), work( indgp ), iwork( iindbl ),
662 $ iwork( iindw ), work( indgrs ), z, ldz,
663 $ isuppz, work( indwrk ), iwork( iindwk ), iinfo )
664 IF( iinfo.NE.0 )
THEN
665 info = 20 + abs( iinfo )
675 itmp = iwork( iindbl+j-1 )
676 w( j ) = w( j ) + e( iwork( iinspl+itmp-1 ) )
686 DO 39 jblk = 1, iwork( iindbl+m-1 )
687 iend = iwork( iinspl+jblk-1 )
688 in = iend - ibegin + 1
693 IF( iwork( iindbl+wend ).EQ.jblk )
THEN
698 IF( wend.LT.wbegin )
THEN
703 offset = iwork(iindw+wbegin-1)-1
704 ifirst = iwork(iindw+wbegin-1)
705 ilast = iwork(iindw+wend-1)
708 $ work(indd+ibegin-1), work(inde2+ibegin-1),
709 $ ifirst, ilast, rtol2, offset, w(wbegin),
710 $ work( inderr+wbegin-1 ),
711 $ work( indwrk ), iwork( iindwk ), pivmin,
720 IF( scale.NE.one )
THEN
721 CALL sscal( m, one / scale, w, 1 )
728 IF( nsplit.GT.1 .OR. n.EQ.2 )
THEN
729 IF( .NOT. wantz )
THEN
730 CALL slasrt(
'I', m, w, iinfo )
731 IF( iinfo.NE.0 )
THEN
740 IF( w( jj ).LT.tmp )
THEN
749 CALL sswap( n, z( 1, i ), 1, z( 1, j ), 1 )
750 itmp = isuppz( 2*i-1 )
751 isuppz( 2*i-1 ) = isuppz( 2*j-1 )
752 isuppz( 2*j-1 ) = itmp
754 isuppz( 2*i ) = isuppz( 2*j )
subroutine slarrr(N, D, E, INFO)
SLARRR performs tests to decide whether the symmetric tridiagonal matrix T warrants expensive computa...
subroutine slarrc(JOBT, N, VL, VU, D, E, PIVMIN, EIGCNT, LCNT, RCNT, INFO)
SLARRC computes the number of eigenvalues of the symmetric tridiagonal matrix.
subroutine slarre(RANGE, N, VL, VU, IL, IU, D, E, E2, RTOL1, RTOL2, SPLTOL, NSPLIT, ISPLIT, M, W, WERR, WGAP, IBLOCK, INDEXW, GERS, PIVMIN, WORK, IWORK, INFO)
SLARRE given the tridiagonal matrix T, sets small off-diagonal elements to zero and for each unreduce...
subroutine slarrj(N, D, E2, IFIRST, ILAST, RTOL, OFFSET, W, WERR, WORK, IWORK, PIVMIN, SPDIAM, INFO)
SLARRJ performs refinement of the initial estimates of the eigenvalues of the matrix T.
subroutine slae2(A, B, C, RT1, RT2)
SLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix.
subroutine slaev2(A, B, C, RT1, RT2, CS1, SN1)
SLAEV2 computes the eigenvalues and eigenvectors of a 2-by-2 symmetric/Hermitian matrix.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slasrt(ID, N, D, INFO)
SLASRT sorts numbers in increasing or decreasing order.
subroutine slarrv(N, VL, VU, D, L, PIVMIN, ISPLIT, M, DOL, DOU, MINRGP, RTOL1, RTOL2, W, WERR, WGAP, IBLOCK, INDEXW, GERS, Z, LDZ, ISUPPZ, WORK, IWORK, INFO)
SLARRV computes the eigenvectors of the tridiagonal matrix T = L D LT given L, D and the eigenvalues ...
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 sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine sscal(N, SA, SX, INCX)
SSCAL