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 ...