334 SUBROUTINE zstemr( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
335 $ M, W, Z, LDZ, NZC, ISUPPZ, TRYRAC, WORK, LWORK,
336 $ IWORK, LIWORK, INFO )
343 CHARACTER JOBZ, RANGE
345 INTEGER IL, INFO, IU, LDZ, NZC, LIWORK, LWORK, M, N
346 DOUBLE PRECISION VL, VU
349 INTEGER ISUPPZ( * ), IWORK( * )
350 DOUBLE PRECISION D( * ), E( * ), W( * ), WORK( * )
351 COMPLEX*16 Z( LDZ, * )
357 DOUBLE PRECISION ZERO, ONE, FOUR, MINRGP
358 PARAMETER ( ZERO = 0.0d0, one = 1.0d0,
363 LOGICAL ALLEIG, INDEIG, LQUERY, VALEIG, WANTZ, ZQUERY,
365 INTEGER I, IBEGIN, IEND, IFIRST, IIL, IINDBL, IINDW,
366 $ IINDWK, IINFO, IINSPL, IIU, ILAST, IN, INDD,
367 $ inde2, inderr, indgp, indgrs, indwrk, itmp,
368 $ itmp2, j, jblk, jj, liwmin, lwmin, nsplit,
369 $ nzcmin, offset, wbegin, wend
370 DOUBLE PRECISION BIGNUM, CS, EPS, PIVMIN, R1, R2, RMAX, RMIN,
371 $ RTOL1, RTOL2, SAFMIN, SCALE, SMLNUM, SN,
372 $ thresh, tmp, tnrm, wl, wu
377 DOUBLE PRECISION DLAMCH, DLANST
378 EXTERNAL lsame, dlamch, dlanst
386 INTRINSIC max, min, sqrt
394 wantz = lsame( jobz,
'V' )
395 alleig = lsame( range,
'A' )
396 valeig = lsame( range,
'V' )
397 indeig = lsame( range,
'I' )
399 lquery = ( ( lwork.EQ.-1 ).OR.( liwork.EQ.-1 ) )
400 zquery = ( nzc.EQ.-1 )
427 ELSEIF( indeig )
THEN
434 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
436 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
438 ELSE IF( n.LT.0 )
THEN
440 ELSE IF( valeig .AND. n.GT.0 .AND. wu.LE.wl )
THEN
442 ELSE IF( indeig .AND. ( iil.LT.1 .OR. iil.GT.n ) )
THEN
444 ELSE IF( indeig .AND. ( iiu.LT.iil .OR. iiu.GT.n ) )
THEN
446 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
448 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
450 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
456 safmin = dlamch(
'Safe minimum' )
457 eps = dlamch(
'Precision' )
458 smlnum = safmin / eps
459 bignum = one / smlnum
460 rmin = sqrt( smlnum )
461 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
467 IF( wantz .AND. alleig )
THEN
469 ELSE IF( wantz .AND. valeig )
THEN
470 CALL dlarrc(
'T', n, vl, vu, d, e, safmin,
471 $ nzcmin, itmp, itmp2, info )
472 ELSE IF( wantz .AND. indeig )
THEN
478 IF( zquery .AND. info.EQ.0 )
THEN
480 ELSE IF( nzc.LT.nzcmin .AND. .NOT.zquery )
THEN
487 CALL xerbla(
'ZSTEMR', -info )
490 ELSE IF( lquery .OR. zquery )
THEN
501 IF( alleig .OR. indeig )
THEN
505 IF( wl.LT.d( 1 ) .AND. wu.GE.d( 1 ) )
THEN
510 IF( wantz.AND.(.NOT.zquery) )
THEN
519 IF( .NOT.wantz )
THEN
520 CALL dlae2( d(1), e(1), d(2), r1, r2 )
521 ELSE IF( wantz.AND.(.NOT.zquery) )
THEN
522 CALL dlaev2( d(1), e(1), d(2), r1, r2, cs, sn )
534 $ (valeig.AND.(r2.GT.wl).AND.
536 $ (indeig.AND.(iil.EQ.1)) )
THEN
539 IF( wantz.AND.(.NOT.zquery) )
THEN
563 $ (valeig.AND.(r1.GT.wl).AND.
565 $ (indeig.AND.(iiu.EQ.2)) )
THEN
568 IF( wantz.AND.(.NOT.zquery) )
THEN
614 tnrm = dlanst(
'M', n, d, e )
615 IF( tnrm.GT.zero .AND. tnrm.LT.rmin )
THEN
617 ELSE IF( tnrm.GT.rmax )
THEN
620 IF( scale.NE.one )
THEN
621 CALL dscal( n, scale, d, 1 )
622 CALL dscal( n-1, scale, e, 1 )
642 CALL dlarrr( n, d, e, iinfo )
658 CALL dcopy(n,d,1,work(indd),1)
662 work( inde2+j-1 ) = e(j)**2
666 IF( .NOT.wantz )
THEN
676 rtol2 = max( sqrt(eps)*5.0d-3, four * eps )
678 CALL dlarre( range, n, wl, wu, iil, iiu, d, e,
679 $ work(inde2), rtol1, rtol2, thresh, nsplit,
680 $ iwork( iinspl ), m, w, work( inderr ),
681 $ work( indgp ), iwork( iindbl ),
682 $ iwork( iindw ), work( indgrs ), pivmin,
683 $ work( indwrk ), iwork( iindwk ), iinfo )
684 IF( iinfo.NE.0 )
THEN
685 info = 10 + abs( iinfo )
698 CALL zlarrv( n, wl, wu, d, e,
699 $ pivmin, iwork( iinspl ), m,
700 $ 1, m, minrgp, rtol1, rtol2,
701 $ w, work( inderr ), work( indgp ), iwork( iindbl ),
702 $ iwork( iindw ), work( indgrs ), z, ldz,
703 $ isuppz, work( indwrk ), iwork( iindwk ), iinfo )
704 IF( iinfo.NE.0 )
THEN
705 info = 20 + abs( iinfo )
715 itmp = iwork( iindbl+j-1 )
716 w( j ) = w( j ) + e( iwork( iinspl+itmp-1 ) )
726 DO 39 jblk = 1, iwork( iindbl+m-1 )
727 iend = iwork( iinspl+jblk-1 )
728 in = iend - ibegin + 1
733 IF( iwork( iindbl+wend ).EQ.jblk )
THEN
738 IF( wend.LT.wbegin )
THEN
743 offset = iwork(iindw+wbegin-1)-1
744 ifirst = iwork(iindw+wbegin-1)
745 ilast = iwork(iindw+wend-1)
748 $ work(indd+ibegin-1), work(inde2+ibegin-1),
749 $ ifirst, ilast, rtol2, offset, w(wbegin),
750 $ work( inderr+wbegin-1 ),
751 $ work( indwrk ), iwork( iindwk ), pivmin,
760 IF( scale.NE.one )
THEN
761 CALL dscal( m, one / scale, w, 1 )
768 IF( nsplit.GT.1 .OR. n.EQ.2 )
THEN
769 IF( .NOT. wantz )
THEN
770 CALL dlasrt(
'I', m, w, iinfo )
771 IF( iinfo.NE.0 )
THEN
780 IF( w( jj ).LT.tmp )
THEN
789 CALL zswap( n, z( 1, i ), 1, z( 1, j ), 1 )
790 itmp = isuppz( 2*i-1 )
791 isuppz( 2*i-1 ) = isuppz( 2*j-1 )
792 isuppz( 2*j-1 ) = itmp
794 isuppz( 2*i ) = isuppz( 2*j )
subroutine dlarre(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)
DLARRE given the tridiagonal matrix T, sets small off-diagonal elements to zero and for each unreduce...
subroutine zlarrv(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)
ZLARRV computes the eigenvectors of the tridiagonal matrix T = L D LT given L, D and the eigenvalues ...