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, N, 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 BIGNUM, EPS, RMAX, RMIN, RTOL1, RTOL2, 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 IF( wantz .AND. alleig )
THEN
321 ELSE IF( wantz .AND. valeig )
THEN
322 CALL dlarrc(
'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 = dlanst(
'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 dscal( n, scale, d, 1 )
407 CALL dscal( 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.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 IF( iinfo.NE.0 )
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)