325 SUBROUTINE dlarrd( RANGE, ORDER, N, VL, VU, IL, IU, GERS,
326 $ RELTOL, D, E, E2, PIVMIN, NSPLIT, ISPLIT,
327 $ M, W, WERR, WL, WU, IBLOCK, INDEXW,
328 $ WORK, IWORK, INFO )
335 CHARACTER ORDER, RANGE
336 INTEGER IL, INFO, IU, M, N, NSPLIT
337 DOUBLE PRECISION PIVMIN, RELTOL, VL, VU, WL, WU
340 INTEGER IBLOCK( * ), INDEXW( * ),
341 $ ISPLIT( * ), IWORK( * )
342 DOUBLE PRECISION D( * ), E( * ), E2( * ),
343 $ gers( * ), w( * ), werr( * ), work( * )
349 DOUBLE PRECISION ZERO, ONE, TWO, HALF, FUDGE
350 PARAMETER ( ZERO = 0.0d0, one = 1.0d0,
351 $ two = 2.0d0, half = one/two,
353 INTEGER ALLRNG, VALRNG, INDRNG
354 PARAMETER ( ALLRNG = 1, valrng = 2, indrng
357 LOGICAL NCNVRG, TOOFEW
358 INTEGER I, IB, IBEGIN, IDISCL, IDISCU, IE,
362 DOUBLE PRECISION , EPS, TMP2,
363 $ TNORM, UFLOW, WKILL, WLU, WUL
373 EXTERNAL lsame, ilaenv,
dlamch
379 INTRINSIC abs, int, log,
max,
min
393 IF( lsame( range, 'a
' ) ) THEN
395 ELSE IF( LSAME( RANGE, 'v
' ) ) THEN
397 ELSE IF( LSAME( RANGE, 'i
' ) ) THEN
405.LE.
IF( IRANGE0 ) THEN
407.NOT.
ELSE IF( (LSAME(ORDER,'b.OR.
')LSAME(ORDER,'e
')) ) THEN
409.LT.
ELSE IF( N0 ) THEN
411.EQ.
ELSE IF( IRANGEVALRNG ) THEN
414.EQ..AND.
ELSE IF( IRANGEINDRNG
415.LT..OR..GT.
$ ( IL1 ILMAX( 1, N ) ) ) THEN
417.EQ..AND.
ELSE IF( IRANGEINDRNG
418.LT..OR..GT.
$ ( IUMIN( N, IL ) IUN ) ) THEN
436.EQ..AND..EQ..AND..EQ.
IF( IRANGEINDRNG IL1 IUN ) IRANGE = 1
440 UFLOW = DLAMCH( 'u
' )
446.EQ..OR.
IF( (IRANGEALLRNG)
447.EQ..AND..GT..AND..LE..OR.
$ ((IRANGEVALRNG)(D(1)VL)(D(1)VU))
448.EQ..AND..EQ..AND..EQ.
$ ((IRANGEINDRNG)(IL1)(IU1)) ) THEN
461 NB = ILAENV( 1, 'dstebz', ' ', N, -1, -1, -1 )
468 GL = MIN( GL, GERS( 2*I - 1))
469 GU = MAX( GU, GERS(2*I) )
472 TNORM = MAX( ABS( GL ), ABS( GU ) )
473 GL = GL - FUDGE*TNORM*EPS*N - FUDGE*TWO*PIVMIN
474 GU = GU + FUDGE*TNORM*EPS*N + FUDGE*TWO*PIVMIN
487 ATOLI = FUDGE*TWO*UFLOW + FUDGE*TWO*PIVMIN
489.EQ.
IF( IRANGEINDRNG ) THEN
494 ITMAX = INT( ( LOG( TNORM+PIVMIN )-LOG( PIVMIN ) ) /
509 CALL DLAEBZ( 3, ITMAX, N, 2, 2, NB, ATOLI, RTOLI, PIVMIN,
510 $ D, E, E2, IWORK( 5 ), WORK( N+1 ), WORK( N+5 ), IOUT,
511 $ IWORK, W, IBLOCK, IINFO )
512.NE.
IF( IINFO 0 ) THEN
517.EQ.
IF( IWORK( 6 )IU ) THEN
534.LT..OR..GE..OR..LT..OR..GT.
IF( NWL0 NWLN NWU1 NWUN ) THEN
539.EQ.
ELSEIF( IRANGEVALRNG ) THEN
543.EQ.
ELSEIF( IRANGEALLRNG ) THEN
559 DO 70 JBLK = 1, NSPLIT
562 IEND = ISPLIT( JBLK )
567.GE.
IF( WLD( IBEGIN )-PIVMIN )
569.GE.
IF( WUD( IBEGIN )-PIVMIN )
571.EQ..OR.
IF( IRANGEALLRNG
572.LT.
$ ( WLD( IBEGIN )-PIVMIN
573.AND..GE.
$ WU D( IBEGIN )-PIVMIN ) ) THEN
637 DO 40 J = IBEGIN, IEND
638 GL = MIN( GL, GERS( 2*J - 1))
639 GU = MAX( GU, GERS(2*J) )
647 GL = GL - FUDGE*TNORM*EPS*IN - FUDGE*PIVMIN
648 GU = GU + FUDGE*TNORM*EPS*IN + FUDGE*PIVMIN
650.GT.
IF( IRANGE1 ) THEN
667 CALL DLAEBZ( 1, 0, IN, IN, 1, NB, ATOLI, RTOLI, PIVMIN,
668 $ D( IBEGIN ), E( IBEGIN ), E2( IBEGIN ),
669 $ IDUMMA, WORK( N+1 ), WORK( N+2*IN+1 ), IM,
670 $ IWORK, W( M+1 ), IBLOCK( M+1 ), IINFO )
671.NE.
IF( IINFO 0 ) THEN
676 NWL = NWL + IWORK( 1 )
677 NWU = NWU + IWORK( IN+1 )
678 IWOFF = M - IWORK( 1 )
681 ITMAX = INT( ( LOG( GU-GL+PIVMIN )-LOG( PIVMIN ) ) /
683 CALL DLAEBZ( 2, ITMAX, IN, IN, 1, NB, ATOLI, RTOLI, PIVMIN,
684 $ D( IBEGIN ), E( IBEGIN ), E2( IBEGIN ),
685 $ IDUMMA, WORK( N+1 ), WORK( N+2*IN+1 ), IOUT,
686 $ IWORK, W( M+1 ), IBLOCK( M+1 ), IINFO )
687.NE.
IF( IINFO 0 ) THEN
697 TMP1 = HALF*( WORK( J+N )+WORK( J+IN+N ) )
699 TMP2 = HALF*ABS( WORK( J+N )-WORK( J+IN+N ) )
700.GT.
IF( JIOUT-IINFO ) THEN
707 DO 50 JE = IWORK( J ) + 1 + IWOFF,
708 $ IWORK( J+IN ) + IWOFF
711 INDEXW( JE ) = JE - IWOFF
722.EQ.
IF( IRANGEINDRNG ) THEN
723 IDISCL = IL - 1 - NWL
726.GT.
IF( IDISCL0 ) THEN
731.LE..AND..GT.
IF( W( JE )WLU IDISCL0 ) THEN
736 WERR( IM ) = WERR( JE )
737 INDEXW( IM ) = INDEXW( JE )
738 IBLOCK( IM ) = IBLOCK( JE )
743.GT.
IF( IDISCU0 ) THEN
748.GE..AND..GT.
IF( W( JE )WUL IDISCU0 ) THEN
753 WERR( IM ) = WERR( JE )
754 INDEXW( IM ) = INDEXW( JE )
755 IBLOCK( IM ) = IBLOCK( JE )
762 WERR( JEE ) = WERR( JE )
763 INDEXW( JEE ) = INDEXW( JE )
764 IBLOCK( JEE ) = IBLOCK( JE )
769.GT..OR..GT.
IF( IDISCL0 IDISCU0 ) THEN
776.GT.
IF( IDISCL0 ) THEN
778 DO 100 JDISC = 1, IDISCL
781.NE..AND.
IF( IBLOCK( JE )0
782.LT..OR..EQ.
$ ( W( JE )WKILL IW0 ) ) THEN
790.GT.
IF( IDISCU0 ) THEN
792 DO 120 JDISC = 1, IDISCU
795.NE..AND.
IF( IBLOCK( JE )0
796.GE..OR..EQ.
$ ( W( JE )WKILL IW0 ) ) THEN
807.NE.
IF( IBLOCK( JE )0 ) THEN
810 WERR( IM ) = WERR( JE )
811 INDEXW( IM ) = INDEXW( JE )
812 IBLOCK( IM ) = IBLOCK( JE )
817.LT..OR..LT.
IF( IDISCL0 IDISCU0 ) THEN
822.EQ..AND..NE..OR.
IF(( IRANGEALLRNG MN )
823.EQ..AND..NE.
$ ( IRANGEINDRNG MIU-IL+1 ) ) THEN
831 IF( LSAME(ORDER,'e.AND..GT.
') NSPLIT1 ) THEN
836.LT.
IF( W( J )TMP1 ) THEN
846 WERR( IE ) = WERR( JE )
847 IBLOCK( IE ) = IBLOCK( JE )
848 INDEXW( IE ) = INDEXW( JE )
subroutine dlarrd(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)
DLARRD computes the eigenvalues of a symmetric tridiagonal matrix to suitable accuracy.
subroutine dlaebz(ijob, nitmax, n, mmax, minp, nbmin, abstol, reltol, pivmin, d, e, e2, nval, ab, c, mout, nab, work, iwork, info)
DLAEBZ computes the number of eigenvalues of a real symmetric tridiagonal matrix which are less than ...
subroutine dstebz(range, order, n, vl, vu, il, iu, abstol, d, e, m, nsplit, w, iblock, isplit, work, iwork, info)
DSTEBZ