1 SUBROUTINE sstegr2a( 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, N, NEEDIL, NEEDIU, NSPLIT, NZC
17 REAL PIVMIN, SCALE, VL, VU, WL, WU
22 REAL D( * ), E( * ), W( * ), WORK( * )
216 REAL ZERO, ONE, FOUR, MINRGP
217 PARAMETER ( ZERO = 0.0e0, one = 1.0e0,
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 REAL BIGNUM, EPS, RMAX, RMIN, RTOL1, RTOL2, SAFMIN,
227 $ smlnum, thresh, tnrm
232 EXTERNAL LSAME, SLAMCH, SLANST
238 INTRINSIC max,
min, real, 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 = slamch(
'Safe minimum' )
307 eps = slamch(
'Precision' )
308 smlnum = safmin / eps
309 bignum = one / smlnum
310 rmin = sqrt( smlnum )
311 rmax =
min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
317 IF( wantz .AND. alleig )
THEN
321 ELSE IF( wantz .AND. valeig )
THEN
322 CALL slarrc(
'T', n, vl, vu, d, e, safmin,
323 $ nzcmin, itmp, itmp2, info )
326 ELSE IF( wantz .AND. indeig )
THEN
332 IF( zquery .AND. info.EQ.0 )
THEN
334 ELSE IF( nzc.LT.nzcmin .AND. .NOT.zquery )
THEN
340 IF ( dol.LT.1 .OR. dol.GT.nzcmin )
THEN
343 IF ( dou.LT.1 .OR. dou.GT.nzcmin .OR. dou.LT.dol)
THEN
355 ELSE IF( lquery .OR. zquery )
THEN
370 IF( alleig .OR. indeig )
THEN
374 IF( wl.LT.d( 1 ) .AND. wu.GE.d( 1 ) )
THEN
399 tnrm = slanst(
'M', n, d, e )
400 IF( tnrm.GT.zero .AND. tnrm.LT.rmin )
THEN
402 ELSE IF( tnrm.GT.rmax )
THEN
405 IF( scale.NE.one )
THEN
406 CALL sscal( n, scale, d, 1 )
407 CALL sscal( n-1, scale, e, 1 )
428 work( inde2+j-1 ) = e(j)**2
432 IF( .NOT.wantz )
THEN
440 rtol1 = four*sqrt(eps)
441 rtol2 =
max( sqrt(eps)*5.0e-3, four * eps )
443 CALL slarre2a( 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 IF( iinfo.NE.0 )
THEN
453 info = 100 + abs( iinfo )
subroutine slarre2a(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 sstegr2a(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)