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 )