1 SUBROUTINE dstegr2a( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
2 $ M, W, Z, LDZ, NZC, WORK, LWORK, IWORK,
3 $ LIWORK, DOL, DOU, NEEDIL, NEEDIU,
4 $ INDERR, NSPLIT, PIVMIN, SCALE, WL, WU,
15 INTEGER DOL, DOU, IL, INDERR, INFO, IU, LDZ, LIWORK,
16 $ LWORK, M, , NEEDIL, NEEDIU, NSPLIT, NZC
17 DOUBLE PRECISION PIVMIN, SCALE, VL, VU, WL, WU
22 DOUBLE PRECISION D( * ), E( * ), W( * ), WORK( * )
23 DOUBLE PRECISION Z( LDZ, * )
216 DOUBLE PRECISION ZERO, ONE, FOUR, MINRGP
217 PARAMETER ( ZERO = 0.0d0, one = 1.0d0,
222 LOGICAL ALLEIG, INDEIG, LQUERY, VALEIG, WANTZ, ZQUERY
223 INTEGER IIL, IINDBL, IINDW, IINDWK, IINFO, IINSPL, IIU,
224 $ INDE2, INDGP, INDGRS, INDSDM, INDWRK, ITMP,
225 $ ITMP2, J, LIWMIN, LWMIN, NZCMIN
226 DOUBLE PRECISION , EPS, , RMIN, RTOL1, , SAFMIN,
227 $ smlnum, thresh, tnrm
231 DOUBLE PRECISION DLAMCH, DLANST
232 EXTERNAL LSAME, DLAMCH, DLANST
238 INTRINSIC dble,
max,
min, sqrt
244 wantz = lsame( jobz,
'V' )
245 alleig = lsame( range,
'A' )
246 valeig = lsame( range,
'V' )
247 indeig = lsame( range,
'I' )
249 lquery = ( ( lwork.EQ.-1 ).OR.( liwork.EQ.-1 ) )
250 zquery = ( nzc.EQ.-1 )
277 ELSEIF( indeig )
THEN
284 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
286 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
288 ELSE IF( n.LT.0 )
THEN
290 ELSE IF( valeig .AND. n.GT.0 .AND. wu.LE.wl )
THEN
292 ELSE IF( indeig .AND. ( iil.LT.1 .OR. iil.GT.n ) )
THEN
294 ELSE IF( indeig .AND. ( iiu.LT.iil .OR. iiu.GT.n ) )
THEN
296 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
298 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
300 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
306 safmin = dlamch( 'safe minimum
' )
307 EPS = DLAMCH( 'precision
' )
308 SMLNUM = SAFMIN / EPS
309 BIGNUM = ONE / SMLNUM
310 RMIN = SQRT( SMLNUM )
311 RMAX = MIN( SQRT( BIGNUM ), ONE / SQRT( SQRT( SAFMIN ) ) )
317.AND.
IF( WANTZ ALLEIG ) THEN
321.AND.
ELSE IF( WANTZ VALEIG ) THEN
322 CALL DLARRC( 't
', N, VL, VU, D, E, SAFMIN,
323 $ NZCMIN, ITMP, ITMP2, INFO )
326.AND.
ELSE IF( WANTZ INDEIG ) THEN
332.AND..EQ.
IF( ZQUERY INFO0 ) THEN
334.LT..AND..NOT.
ELSE IF( NZCNZCMIN ZQUERY ) THEN
340.LT..OR..GT.
IF ( DOL1 DOLNZCMIN ) THEN
343.LT..OR..GT..OR..LT.
IF ( DOU1 DOUNZCMIN DOUDOL) THEN
355.OR.
ELSE IF( LQUERY ZQUERY ) THEN
370.OR.
IF( ALLEIG INDEIG ) THEN
374.LT..AND..GE.
IF( WLD( 1 ) WUD( 1 ) ) THEN
399 TNRM = DLANST( 'm
', N, D, E )
400.GT..AND..LT.
IF( TNRMZERO TNRMRMIN ) THEN
402.GT.
ELSE IF( TNRMRMAX ) THEN
405.NE.
IF( SCALEONE ) THEN
406 CALL DSCAL( N, SCALE, D, 1 )
407 CALL DSCAL( N-1, SCALE, E, 1 )
428 WORK( INDE2+J-1 ) = E(J)**2
432.NOT.
IF( WANTZ ) THEN
440 RTOL1 = FOUR*SQRT(EPS)
441 RTOL2 = MAX( SQRT(EPS)*5.0D-3, FOUR * EPS )
443 CALL DLARRE2A( RANGE, N, WL, WU, IIL, IIU, D, E,
444 $ WORK(INDE2), RTOL1, RTOL2, THRESH, NSPLIT,
445 $ IWORK( IINSPL ), M, DOL, DOU, NEEDIL, NEEDIU,
447 $ WORK( INDGP ), IWORK( IINDBL ),
448 $ IWORK( IINDW ), WORK( INDGRS ),
449 $ WORK( INDSDM ), PIVMIN,
450 $ WORK( INDWRK ), IWORK( IINDWK ),
452.NE.
IF( IINFO0 ) THEN
453 INFO = 100 + ABS( IINFO )
subroutine dlarre2a(range, n, vl, vu, il, iu, d, e, e2, rtol1, rtol2, spltol, nsplit, isplit, m, dol, dou, needil, neediu, w, werr, wgap, iblock, indexw, gers, sdiam, pivmin, work, iwork, minrgp, info)
subroutine dstegr2a(jobz, range, n, d, e, vl, vu, il, iu, m, w, z, ldz, nzc, work, lwork, iwork, liwork, dol, dou, needil, neediu, inderr, nsplit, pivmin, scale, wl, wu, info)
subroutine dlarrc(jobt, n, vl, vu, d, e, pivmin, eigcnt, lcnt, rcnt, info)
DLARRC computes the number of eigenvalues of the symmetric tridiagonal matrix.