305 SUBROUTINE sstevr( JOBZ, RANGE, N, D, E, VL, VU, IL, IU, ABSTOL,
306 $ M, W, Z, LDZ, ISUPPZ, WORK, LWORK, IWORK,
315 CHARACTER JOBZ, RANGE
316 INTEGER IL, INFO, IU, LDZ, LIWORK, LWORK, M, N
320 INTEGER ISUPPZ( * ), IWORK( * )
321 REAL D( * ), E( * ), W( * ), WORK( * ), Z( LDZ, * )
328 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0, two = 2.0e+0 )
331 LOGICAL ALLEIG, INDEIG, TEST, LQUERY, VALEIG, WANTZ,
334 INTEGER I, IEEEOK, IMAX, INDIBL, INDIFL, INDISP,
335 $ indiwo, iscale, j, jj, liwmin, lwmin, nsplit
336 REAL BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, SMLNUM,
337 $ TMP1, TNRM, VLL, VUU
343 EXTERNAL lsame, ilaenv, slamch, slanst
350 INTRINSIC max, min, sqrt
357 ieeeok = ilaenv( 10,
'SSTEVR',
'N', 1, 2, 3, 4 )
359 wantz = lsame( jobz,
'V' )
360 alleig = lsame( range,
'A' )
361 valeig = lsame( range,
'V' )
362 indeig = lsame( range,
'I' )
364 lquery = ( ( lwork.EQ.-1 ) .OR. ( liwork.EQ.-1 ) )
365 lwmin = max( 1, 20*n )
366 liwmin = max(1, 10*n )
370 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
372 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
374 ELSE IF( n.LT.0 )
THEN
378 IF( n.GT.0 .AND. vu.LE.vl )
380 ELSE IF( indeig )
THEN
381 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN
383 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN
389 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
398 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
400 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
406 CALL xerbla(
'SSTEVR', -info )
408 ELSE IF( lquery )
THEN
419 IF( alleig .OR. indeig )
THEN
423 IF( vl.LT.d( 1 ) .AND. vu.GE.d( 1 ) )
THEN
435 safmin = slamch(
'Safe minimum' )
436 eps = slamch(
'Precision' )
437 smlnum = safmin / eps
438 bignum = one / smlnum
439 rmin = sqrt( smlnum )
440 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
451 tnrm = slanst(
'M', n, d, e )
452 IF( tnrm.GT.zero .AND. tnrm.LT.rmin )
THEN
455 ELSE IF( tnrm.GT.rmax )
THEN
459 IF( iscale.EQ.1 )
THEN
460 CALL sscal( n, sigma, d, 1 )
461 CALL sscal( n-1, sigma, e( 1 ), 1 )
492 IF( il.EQ.1 .AND. iu.EQ.n )
THEN
496 IF( ( alleig .OR. test ) .AND. ieeeok.EQ.1 )
THEN
497 CALL scopy( n-1, e( 1 ), 1, work( 1 ), 1 )
498 IF( .NOT.wantz )
THEN
499 CALL scopy( n, d, 1, w, 1 )
500 CALL ssterf( n, w, work, info )
502 CALL scopy( n, d, 1, work( n+1 ), 1 )
503 IF (abstol .LE. two*n*eps)
THEN
508 CALL sstemr( jobz,
'A', n, work( n+1 ), work, vl, vu, il,
509 $ iu, m, w, z, ldz, n, isuppz, tryrac,
510 $ work( 2*n+1 ), lwork-2*n, iwork, liwork, info )
528 CALL sstebz( range, order, n, vll, vuu, il, iu, abstol, d, e, m,
529 $ nsplit, w, iwork( indibl ), iwork( indisp ), work,
530 $ iwork( indiwo ), info )
533 CALL sstein( n, d, e, m, w, iwork( indibl ), iwork( indisp ),
534 $ z, ldz, work, iwork( indiwo ), iwork( indifl ),
541 IF( iscale.EQ.1 )
THEN
547 CALL sscal( imax, one / sigma, w, 1 )
558 IF( w( jj ).LT.tmp1 )
THEN
567 CALL sswap( n, z( 1, i ), 1, z( 1, j ), 1 )