327 SUBROUTINE slarrd( RANGE, ORDER, N, VL, VU, IL, IU, GERS,
328 $ RELTOL, D, E, E2, PIVMIN, NSPLIT, ISPLIT,
329 $ M, W, WERR, WL, WU, IBLOCK, INDEXW,
330 $ WORK, IWORK, INFO )
338 CHARACTER ORDER, RANGE
339 INTEGER IL, INFO, IU, M, N, NSPLIT
340 REAL PIVMIN, RELTOL, VL, VU, WL, WU
343 INTEGER IBLOCK( * ), INDEXW( * ),
344 $ isplit( * ), iwork( * )
345 REAL D( * ), E( * ), E2( * ),
346 $ gers( * ), w( * ), werr( * ), work( * )
352 REAL ZERO, ONE, TWO, HALF, FUDGE
353 parameter( zero = 0.0e0, one = 1.0e0,
354 $ two = 2.0e0, half = one/two,
356 INTEGER ALLRNG, VALRNG, INDRNG
357 parameter( allrng = 1, valrng = 2, indrng = 3 )
360 LOGICAL NCNVRG, TOOFEW
361 INTEGER I, IB, IBEGIN, IDISCL, IDISCU, IE, IEND, IINFO,
362 $ im, in, ioff, iout, irange, itmax, itmp1,
363 $ itmp2, iw, iwoff, j, jblk, jdisc, je, jee, nb,
365 REAL ATOLI, EPS, GL, GU, RTOLI, TMP1, TMP2,
366 $ tnorm, uflow, wkill, wlu, wul
376 EXTERNAL lsame, ilaenv, slamch
382 INTRINSIC abs, int, log, max, min
396 IF( lsame( range,
'A' ) )
THEN 398 ELSE IF( lsame( range,
'V' ) )
THEN 400 ELSE IF( lsame( range,
'I' ) )
THEN 408 IF( irange.LE.0 )
THEN 410 ELSE IF( .NOT.(lsame(order,
'B').OR.lsame(order,
'E')) )
THEN 412 ELSE IF( n.LT.0 )
THEN 414 ELSE IF( irange.EQ.valrng )
THEN 417 ELSE IF( irange.EQ.indrng .AND.
418 $ ( il.LT.1 .OR. il.GT.max( 1, n ) ) )
THEN 420 ELSE IF( irange.EQ.indrng .AND.
421 $ ( iu.LT.min( n, il ) .OR. iu.GT.n ) )
THEN 439 IF( irange.EQ.indrng .AND. il.EQ.1 .AND. iu.EQ.n ) irange = 1
443 uflow = slamch(
'U' )
449 IF( (irange.EQ.allrng).OR.
450 $ ((irange.EQ.valrng).AND.(d(1).GT.vl).AND.(d(1).LE.vu)).OR.
451 $ ((irange.EQ.indrng).AND.(il.EQ.1).AND.(iu.EQ.1)) )
THEN 464 nb = ilaenv( 1,
'SSTEBZ',
' ', n, -1, -1, -1 )
471 gl = min( gl, gers( 2*i - 1))
472 gu = max( gu, gers(2*i) )
475 tnorm = max( abs( gl ), abs( gu ) )
476 gl = gl - fudge*tnorm*eps*n - fudge*two*pivmin
477 gu = gu + fudge*tnorm*eps*n + fudge*two*pivmin
490 atoli = fudge*two*uflow + fudge*two*pivmin
492 IF( irange.EQ.indrng )
THEN 497 itmax = int( ( log( tnorm+pivmin )-log( pivmin ) ) /
512 CALL slaebz( 3, itmax, n, 2, 2, nb, atoli, rtoli, pivmin,
513 $ d, e, e2, iwork( 5 ), work( n+1 ), work( n+5 ), iout,
514 $ iwork, w, iblock, iinfo )
515 IF( iinfo .NE. 0 )
THEN 520 IF( iwork( 6 ).EQ.iu )
THEN 537 IF( nwl.LT.0 .OR. nwl.GE.n .OR. nwu.LT.1 .OR. nwu.GT.n )
THEN 542 ELSEIF( irange.EQ.valrng )
THEN 546 ELSEIF( irange.EQ.allrng )
THEN 562 DO 70 jblk = 1, nsplit
565 iend = isplit( jblk )
570 IF( wl.GE.d( ibegin )-pivmin )
572 IF( wu.GE.d( ibegin )-pivmin )
574 IF( irange.EQ.allrng .OR.
575 $ ( wl.LT.d( ibegin )-pivmin
576 $ .AND. wu.GE. d( ibegin )-pivmin ) )
THEN 640 DO 40 j = ibegin, iend
641 gl = min( gl, gers( 2*j - 1))
642 gu = max( gu, gers(2*j) )
650 gl = gl - fudge*tnorm*eps*in - fudge*pivmin
651 gu = gu + fudge*tnorm*eps*in + fudge*pivmin
653 IF( irange.GT.1 )
THEN 670 CALL slaebz( 1, 0, in, in, 1, nb, atoli, rtoli, pivmin,
671 $ d( ibegin ), e( ibegin ), e2( ibegin ),
672 $ idumma, work( n+1 ), work( n+2*in+1 ), im,
673 $ iwork, w( m+1 ), iblock( m+1 ), iinfo )
674 IF( iinfo .NE. 0 )
THEN 679 nwl = nwl + iwork( 1 )
680 nwu = nwu + iwork( in+1 )
681 iwoff = m - iwork( 1 )
684 itmax = int( ( log( gu-gl+pivmin )-log( pivmin ) ) /
686 CALL slaebz( 2, itmax, in, in, 1, nb, atoli, rtoli, pivmin,
687 $ d( ibegin ), e( ibegin ), e2( ibegin ),
688 $ idumma, work( n+1 ), work( n+2*in+1 ), iout,
689 $ iwork, w( m+1 ), iblock( m+1 ), iinfo )
690 IF( iinfo .NE. 0 )
THEN 700 tmp1 = half*( work( j+n )+work( j+in+n ) )
702 tmp2 = half*abs( work( j+n )-work( j+in+n ) )
703 IF( j.GT.iout-iinfo )
THEN 710 DO 50 je = iwork( j ) + 1 + iwoff,
711 $ iwork( j+in ) + iwoff
714 indexw( je ) = je - iwoff
725 IF( irange.EQ.indrng )
THEN 726 idiscl = il - 1 - nwl
729 IF( idiscl.GT.0 )
THEN 734 IF( w( je ).LE.wlu .AND. idiscl.GT.0 )
THEN 739 werr( im ) = werr( je )
740 indexw( im ) = indexw( je )
741 iblock( im ) = iblock( je )
746 IF( idiscu.GT.0 )
THEN 751 IF( w( je ).GE.wul .AND. idiscu.GT.0 )
THEN 756 werr( im ) = werr( je )
757 indexw( im ) = indexw( je )
758 iblock( im ) = iblock( je )
765 werr( jee ) = werr( je )
766 indexw( jee ) = indexw( je )
767 iblock( jee ) = iblock( je )
772 IF( idiscl.GT.0 .OR. idiscu.GT.0 )
THEN 779 IF( idiscl.GT.0 )
THEN 781 DO 100 jdisc = 1, idiscl
784 IF( iblock( je ).NE.0 .AND.
785 $ ( w( je ).LT.wkill .OR. iw.EQ.0 ) )
THEN 793 IF( idiscu.GT.0 )
THEN 795 DO 120 jdisc = 1, idiscu
798 IF( iblock( je ).NE.0 .AND.
799 $ ( w( je ).GE.wkill .OR. iw.EQ.0 ) )
THEN 810 IF( iblock( je ).NE.0 )
THEN 813 werr( im ) = werr( je )
814 indexw( im ) = indexw( je )
815 iblock( im ) = iblock( je )
820 IF( idiscl.LT.0 .OR. idiscu.LT.0 )
THEN 825 IF(( irange.EQ.allrng .AND. m.NE.n ).OR.
826 $ ( irange.EQ.indrng .AND. m.NE.iu-il+1 ) )
THEN 834 IF( lsame(order,
'E') .AND. nsplit.GT.1 )
THEN 839 IF( w( j ).LT.tmp1 )
THEN 849 werr( ie ) = werr( je )
850 iblock( ie ) = iblock( je )
851 indexw( ie ) = indexw( je )
subroutine slarrd(RANGE, ORDER, N, VL, VU, IL, IU, GERS, RELTOL, D, E, E2, PIVMIN, NSPLIT, ISPLIT, M, W, WERR, WL, WU, IBLOCK, INDEXW, WORK, IWORK, INFO)
SLARRD computes the eigenvalues of a symmetric tridiagonal matrix to suitable accuracy.
subroutine slaebz(IJOB, NITMAX, N, MMAX, MINP, NBMIN, ABSTOL, RELTOL, PIVMIN, D, E, E2, NVAL, AB, C, MOUT, NAB, WORK, IWORK, INFO)
SLAEBZ computes the number of eigenvalues of a real symmetric tridiagonal matrix which are less than ...