1 SUBROUTINE sstegr2( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
2 $ M, W, Z, LDZ, NZC, ISUPPZ, WORK, LWORK, IWORK,
3 $ LIWORK, DOL, DOU, ZOFFSET, INFO )
11 INTEGER DOL, DOU, IL, INFO, IU,
12 $ ldz, nzc, liwork, lwork, m, n, zoffset
17 INTEGER ISUPPZ( * ), IWORK( * )
18 REAL D( * ), E( * ), W( * ), WORK( * )
188 REAL ZERO, ONE, FOUR, MINRGP
189 PARAMETER ( ZERO = 0.0e0, one = 1.0e0,
194 LOGICAL ALLEIG, INDEIG, LQUERY, VALEIG, WANTZ, ZQUERY
195 INTEGER I, IIL, IINDBL, IINDW, IINDWK, IINFO, IINSPL,
196 $ iiu, inde2, inderr, indgp, indgrs, indwrk,
197 $ itmp, itmp2, j, jj, liwmin, lwmin, nsplit,
199 REAL BIGNUM, EPS, PIVMIN, RMAX, RMIN, RTOL1, RTOL2,
200 $ SAFMIN, SCALE, SMLNUM, , TMP, TNRM, WL,
206 EXTERNAL lsame, slamch, slanst
213 INTRINSIC max,
min, real, sqrt
219 wantz = lsame( jobz,
'V' )
220 alleig = lsame( range,
'A' )
221 valeig = lsame( range,
'V' )
222 indeig = lsame( range,
'I' )
224 lquery = ( ( lwork.EQ.-1 ).OR.( liwork.EQ.-1 ) )
225 zquery = ( nzc.EQ.-1 )
250 ELSEIF( indeig )
THEN
257 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
259 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
261 ELSE IF( n.LT.0 )
THEN
263 ELSE IF( valeig .AND. n.GT.0 .AND. wu.LE.wl )
THEN
265 ELSE IF( indeig .AND. ( iil.LT.1 .OR. iil.GT.n ) )
THEN
267 ELSE IF( indeig .AND. ( iiu.LT.iil .OR. iiu.GT.n ) )
THEN
269 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
271 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
273 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
279 safmin = slamch(
'Safe minimum' )
280 eps = slamch(
'Precision' )
281 smlnum = safmin / eps
282 bignum = one / smlnum
283 rmin = sqrt( smlnum )
284 rmax =
min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
290 IF( wantz .AND. alleig )
THEN
294 ELSE IF( wantz .AND. valeig )
THEN
295 CALL slarrc(
'T', n, vl, vu, d, e, safmin,
296 $ nzcmin, itmp, itmp2, info )
299 ELSE IF( wantz .AND. indeig )
THEN
305 IF( zquery .AND. info.EQ.0 )
THEN
307 ELSE IF( nzc.LT.nzcmin .AND. .NOT.zquery )
THEN
313 IF ( dol.LT.1 .OR. dol.GT.nzcmin )
THEN
316 IF ( dou.LT.1 .OR. dou.GT.nzcmin .OR. dou.LT.dol)
THEN
328 ELSE IF( lquery .OR. zquery )
THEN
339 IF( alleig .OR. indeig )
THEN
343 IF( wl.LT.d( 1 ) .AND. wu.GE.d( 1 ) )
THEN
367 tnrm = slanst(
'M', n, d, e )
368 IF( tnrm.GT.zero .AND. tnrm.LT.rmin )
THEN
370 ELSE IF( tnrm.GT.rmax )
THEN
373 IF( scale.NE.one )
THEN
374 CALL sscal( n, scale, d, 1 )
375 CALL sscal( n-1, scale, e, 1 )
403 work( inde2+j-1 ) = e(j)**2
407 IF( .NOT.wantz )
THEN
417 rtol2 =
max( sqrt(eps)*5.0e-3, four * eps )
419 CALL slarre2( range, n, wl, wu, iil, iiu, d, e,
420 $ work(inde2), rtol1, rtol2, thresh, nsplit,
421 $ iwork( iinspl ), m, dol, dou,
423 $ work( indgp ), iwork( iindbl ),
424 $ iwork( iindw ), work( indgrs ), pivmin,
425 $ work( indwrk ), iwork( iindwk ), iinfo )
426 IF( iinfo.NE.0 )
THEN
427 info = 100 + abs( iinfo )
440 CALL slarrv( n, wl, wu, d, e,
441 $ pivmin, iwork( iinspl ), m,
442 $ dol, dou, minrgp, rtol1, rtol2,
443 $ w, work( inderr ), work( indgp ), iwork( iindbl ),
444 $ iwork( iindw ), work( indgrs ), z, ldz,
445 $ isuppz, work( indwrk ), iwork( iindwk ), iinfo )
446 IF( iinfo.NE.0 )
THEN
447 info = 200 + abs( iinfo )
457 itmp = iwork( iindbl+j-1 )
458 w( j ) = w( j ) + e( iwork( iinspl+itmp-1 ) )
466 IF( scale.NE.one )
THEN
467 CALL sscal( m, one / scale, w, 1 )
473 IF( dol.NE.1 .OR. dou.NE.m )
THEN
481 IF( nsplit.GT.1 )
THEN
482 IF( .NOT. wantz )
THEN
483 CALL slasrt(
'I', dou - dol +1, w(dol), iinfo )
484 IF( iinfo.NE.0 )
THEN
489 DO 60 j = dol, dou - 1
493 IF( w( jj ).LT.tmp )
THEN
502 CALL sswap( n, z( 1, i-zoffset ),
503 $ 1, z( 1, j-zoffset ), 1 )
504 itmp = isuppz( 2*i-1 )
505 isuppz( 2*i-1 ) = isuppz( 2*j-1 )
506 isuppz( 2*j-1 ) = itmp
508 isuppz( 2*i ) = isuppz( 2*j )
subroutine slarrv(n, vl, vu, d, l, pivmin, isplit, m, dol, dou, minrgp, rtol1, rtol2, w, werr, wgap, iblock, indexw, gers, z, ldz, isuppz, work, iwork, info)
SLARRV computes the eigenvectors of the tridiagonal matrix T = L D LT given L, D and the eigenvalues ...
subroutine slarre2(range, n, vl, vu, il, iu, d, e, e2, rtol1, rtol2, spltol, nsplit, isplit, m, dol, dou, w, werr, wgap, iblock, indexw, gers, pivmin, work, iwork, info)
subroutine sstegr2(jobz, range, n, d, e, vl, vu, il, iu, m, w, z, ldz, nzc, isuppz, work, lwork, iwork, liwork, dol, dou, zoffset, info)