1 SUBROUTINE slarrd2( RANGE, ORDER, N, VL, VU, IL, IU, GERS,
2 $ RELTOL, D, E, E2, PIVMIN, NSPLIT, ISPLIT,
3 $ M, W, WERR, WL, WU, IBLOCK, INDEXW,
4 $ WORK, IWORK, DOL, DOU, INFO )
11 CHARACTER ORDER, RANGE
12 INTEGER DOL, DOU, IL, INFO, IU, M, N, NSPLIT
13 REAL PIVMIN, RELTOL, VL, VU, WL, WU
16 INTEGER IBLOCK( * ), INDEXW( * ),
17 $ ISPLIT( * ), IWORK( * )
18 REAL D( * ), E( * ), E2( * ),
19 $ gers( * ), w( * ), werr( * ), work( * )
205 REAL ZERO, ONE, TWO, HALF, FUDGE
206 PARAMETER ( ZERO = 0.0e0, one = 1.0e0,
207 $ two = 2.0e0, half = one/two,
213 INTEGER I, IB, IBEGIN, IDISCL, IDISCU, IE, IEND, IINFO,
214 $ IM, IN, IOFF, IORDER, IOUT, IRANGE, ITMAX,
215 $ itmp1, itmp2, iw, iwoff, j, jblk, jdisc, je,
217 REAL ATOLI, EPS, GL, GU, RTOLI, SPDIAM, TMP1, TMP2,
218 $ TNORM, UFLOW, WKILL, WLU, WUL
228 EXTERNAL lsame, ilaenv, slamch
234 INTRINSIC abs, int, log,
max,
min, sqrt
242 IF( lsame( range,
'A' ) )
THEN
244 ELSE IF( lsame( range,
'V' ) )
THEN
246 ELSE IF( lsame( range, 'i
' ) ) THEN
254 IF( LSAME( ORDER, 'b
' ) ) THEN
256 ELSE IF( LSAME( ORDER, 'e
' ) ) THEN
264.LE.
IF( IRANGE0 ) THEN
266.LE.
ELSE IF( IORDER0 ) THEN
268.LT.
ELSE IF( N0 ) THEN
270.EQ.
ELSE IF( IRANGE2 ) THEN
273.EQ..AND..LT..OR..GT.
ELSE IF( IRANGE3 ( IL1 ILMAX( 1, N ) ) )
276.EQ..AND..LT..OR..GT.
ELSE IF( IRANGE3 ( IUMIN( N, IL ) IUN ) )
295.EQ..AND..EQ..AND..EQ.
IF( IRANGE3 IL1 IUN ) IRANGE = 1
299 UFLOW = SLAMCH( 'u
' )
305.EQ..OR.
IF( (IRANGE1)
306.EQ..AND..GT..AND..LE..OR.
$ ((IRANGE2)(D(1)VL)(D(1)VU))
307.EQ..AND..EQ..AND..EQ.
$ ((IRANGE3)(IL1)(IU1)) ) THEN
320 NB = ILAENV( 1, 'sstebz', ' ', N, -1, -1, -1 )
327 GL = MIN( GL, GERS( 2*I - 1))
328 GU = MAX( GU, GERS(2*I) )
331 TNORM = MAX( ABS( GL ), ABS( GU ) )
332 GL = GL - FUDGE*TNORM*EPS*N - FUDGE*TWO*PIVMIN
333 GU = GU + FUDGE*TNORM*EPS*N + FUDGE*TWO*PIVMIN
339 ATOLI = FUDGE*TWO*UFLOW + FUDGE*TWO*PIVMIN
341.EQ.
IF( IRANGE3 ) THEN
346 ITMAX = INT( ( LOG( TNORM+PIVMIN )-LOG( PIVMIN ) ) /
361 CALL SLAEBZ( 3, ITMAX, N, 2, 2, NB, ATOLI, RTOLI, PIVMIN,
362 $ D, E, E2, IWORK( 5 ), WORK( N+1 ), WORK( N+5 ), IOUT,
363 $ IWORK, W, IBLOCK, IINFO )
364.NE.
IF( IINFO 0 ) THEN
369.EQ.
IF( IWORK( 6 )IU ) THEN
386.LT..OR..GE..OR..LT..OR..GT.
IF( NWL0 NWLN NWU1 NWUN ) THEN
391.EQ.
ELSEIF( IRANGE2 ) THEN
395.EQ.
ELSEIF( IRANGE1 ) THEN
411 DO 70 JBLK = 1, NSPLIT
414 IEND = ISPLIT( JBLK )
417.EQ.
IF( IRANGE1 ) THEN
418.LT..OR..GT.
IF( (IENDDOL)(IBEGINDOU) ) THEN
432.GE.
IF( WLD( IBEGIN )-PIVMIN )
434.GE.
IF( WUD( IBEGIN )-PIVMIN )
436.EQ..OR..LT..AND..GE.
IF( IRANGE1 ( WLD( IBEGIN )-PIVMIN WU
437 $ D( IBEGIN )-PIVMIN ) ) THEN
454 DO 40 J = IBEGIN, IEND
455 GL = MIN( GL, GERS( 2*J - 1))
456 GU = MAX( GU, GERS(2*J) )
459 GL = GL - FUDGE*TNORM*EPS*IN - FUDGE*PIVMIN
460 GU = GU + FUDGE*TNORM*EPS*IN + FUDGE*PIVMIN
462.GT.
IF( IRANGE1 ) THEN
479 CALL SLAEBZ( 1, 0, IN, IN, 1, NB, ATOLI, RTOLI, PIVMIN,
480 $ D( IBEGIN ), E( IBEGIN ), E2( IBEGIN ),
481 $ IDUMMA, WORK( N+1 ), WORK( N+2*IN+1 ), IM,
482 $ IWORK, W( M+1 ), IBLOCK( M+1 ), IINFO )
483.NE.
IF( IINFO 0 ) THEN
488 NWL = NWL + IWORK( 1 )
489 NWU = NWU + IWORK( IN+1 )
490 IWOFF = M - IWORK( 1 )
493 ITMAX = INT( ( LOG( GU-GL+PIVMIN )-LOG( PIVMIN ) ) /
495 CALL SLAEBZ( 2, ITMAX, IN, IN, 1, NB, ATOLI, RTOLI, PIVMIN,
496 $ D( IBEGIN ), E( IBEGIN ), E2( IBEGIN ),
497 $ IDUMMA, WORK( N+1 ), WORK( N+2*IN+1 ), IOUT,
498 $ IWORK, W( M+1 ), IBLOCK( M+1 ), IINFO )
499.NE.
IF( IINFO 0 ) THEN
509 TMP1 = HALF*( WORK( J+N )+WORK( J+IN+N ) )
511 TMP2 = HALF*ABS( WORK( J+N )-WORK( J+IN+N ) )
512.GT.
IF( JIOUT-IINFO ) THEN
519 DO 50 JE = IWORK( J ) + 1 + IWOFF,
520 $ IWORK( J+IN ) + IWOFF
523 INDEXW( JE ) = JE - IWOFF
534.EQ.
IF( IRANGE3 ) THEN
535 IDISCL = IL - 1 - NWL
538.GT.
IF( IDISCL0 ) THEN
543.LE..AND..GT.
IF( W( JE )WLU IDISCL0 ) THEN
548 WERR( IM ) = WERR( JE )
549 INDEXW( IM ) = INDEXW( JE )
550 IBLOCK( IM ) = IBLOCK( JE )
555.GT.
IF( IDISCU0 ) THEN
560.GE..AND..GT.
IF( W( JE )WUL IDISCU0 ) THEN
565 WERR( IM ) = WERR( JE )
566 INDEXW( IM ) = INDEXW( JE )
567 IBLOCK( IM ) = IBLOCK( JE )
574 WERR( JEE ) = WERR( JE )
575 INDEXW( JEE ) = INDEXW( JE )
576 IBLOCK( JEE ) = IBLOCK( JE )
581.GT..OR..GT.
IF( IDISCL0 IDISCU0 ) THEN
588.GT.
IF( IDISCL0 ) THEN
590 DO 100 JDISC = 1, IDISCL
593.NE..AND.
IF( IBLOCK( JE )0
594.LT..OR..EQ.
$ ( W( JE )WKILL IW0 ) ) THEN
602.GT.
IF( IDISCU0 ) THEN
604 DO 120 JDISC = 1, IDISCU
607.NE..AND.
IF( IBLOCK( JE )0
608.GE..OR..EQ.
$ ( W( JE )WKILL IW0 ) ) THEN
619.NE.
IF( IBLOCK( JE )0 ) THEN
622 WERR( IM ) = WERR( JE )
623 INDEXW( IM ) = INDEXW( JE )
624 IBLOCK( IM ) = IBLOCK( JE )
629.LT..OR..LT.
IF( IDISCL0 IDISCU0 ) THEN
634.EQ..AND..NE..OR.
IF(( IRANGE1 MN )
635.EQ..AND..NE.
$ ( IRANGE3 MIU-IL+1 ) ) THEN
643.EQ..AND..GT.
IF( IORDER1 NSPLIT1 ) THEN
648.LT.
IF( W( J )TMP1 ) THEN
658 WERR( IE ) = WERR( JE )
659 IBLOCK( IE ) = IBLOCK( JE )
660 INDEXW( IE ) = INDEXW( JE )
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 ...
subroutine sstebz(range, order, n, vl, vu, il, iu, abstol, d, e, m, nsplit, w, iblock, isplit, work, iwork, info)
SSTEBZ
subroutine slarrd2(range, order, n, vl, vu, il, iu, gers, reltol, d, e, e2, pivmin, nsplit, isplit, m, w, werr, wl, wu, iblock, indexw, work, iwork, dol, dou, info)