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 slasrt(ID, N, D, INFO)
SLASRT sorts numbers in increasing or decreasing order.
subroutine slarrr(N, D, E, INFO)
SLARRR performs tests to decide whether the symmetric tridiagonal matrix T warrants expensive computa...
subroutine xerbla(SRNAME, INFO)
XERBLA
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 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 sswap(N, SX, INCX, SY, INCY)
SSWAP
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 slae2(A, B, C, RT1, RT2)
SLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix.
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine sscal(N, SA, SX, INCX)
SSCAL
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 slaev2(A, B, C, RT1, RT2, CS1, SN1)
SLAEV2 computes the eigenvalues and eigenvectors of a 2-by-2 symmetric/Hermitian matrix.
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...