301 SUBROUTINE sstevr( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
303 $ M, W, Z, LDZ, ISUPPZ, WORK, LWORK, IWORK,
311 CHARACTER JOBZ, RANGE
312 INTEGER IL, INFO, IU, LDZ, LIWORK, LWORK, M, N
316 INTEGER ISUPPZ( * ), IWORK( * )
317 REAL D( * ), E( * ), W( * ), WORK( * ), Z( LDZ, * )
324 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0, two = 2.0e+0 )
327 LOGICAL ALLEIG, INDEIG, TEST, LQUERY, VALEIG, WANTZ,
330 INTEGER I, IEEEOK, IMAX, INDIBL, INDIFL, INDISP,
331 $ INDIWO, ISCALE, J, JJ, LIWMIN, LWMIN, NSPLIT
332 REAL BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, SMLNUM,
333 $ tmp1, tnrm, vll, vuu
338 REAL SLAMCH, SLANST, SROUNDUP_LWORK
339 EXTERNAL lsame, ilaenv, slamch, slanst,
348 INTRINSIC max, min, sqrt
355 ieeeok = ilaenv( 10,
'SSTEVR',
'N', 1, 2, 3, 4 )
357 wantz = lsame( jobz,
'V' )
358 alleig = lsame( range,
'A' )
359 valeig = lsame( range,
'V' )
360 indeig = lsame( range,
'I' )
362 lquery = ( ( lwork.EQ.-1 ) .OR. ( liwork.EQ.-1 ) )
363 lwmin = max( 1, 20*n )
364 liwmin = max(1, 10*n )
368 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
370 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
372 ELSE IF( n.LT.0 )
THEN
376 IF( n.GT.0 .AND. vu.LE.vl )
378 ELSE IF( indeig )
THEN
379 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN
381 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN
387 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
393 work( 1 ) = sroundup_lwork(lwmin)
396 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
398 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
404 CALL xerbla(
'SSTEVR', -info )
406 ELSE IF( lquery )
THEN
417 IF( alleig .OR. indeig )
THEN
421 IF( vl.LT.d( 1 ) .AND. vu.GE.d( 1 ) )
THEN
433 safmin = slamch(
'Safe minimum' )
434 eps = slamch(
'Precision' )
435 smlnum = safmin / eps
436 bignum = one / smlnum
437 rmin = sqrt( smlnum )
438 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
449 tnrm = slanst(
'M', n, d, e )
450 IF( tnrm.GT.zero .AND. tnrm.LT.rmin )
THEN
453 ELSE IF( tnrm.GT.rmax )
THEN
457 IF( iscale.EQ.1 )
THEN
458 CALL sscal( n, sigma, d, 1 )
459 CALL sscal( n-1, sigma, e( 1 ), 1 )
490 IF( il.EQ.1 .AND. iu.EQ.n )
THEN
494 IF( ( alleig .OR. test ) .AND. ieeeok.EQ.1 )
THEN
495 CALL scopy( n-1, e( 1 ), 1, work( 1 ), 1 )
496 IF( .NOT.wantz )
THEN
497 CALL scopy( n, d, 1, w, 1 )
498 CALL ssterf( n, w, work, info )
500 CALL scopy( n, d, 1, work( n+1 ), 1 )
501 IF (abstol .LE. two*real( n )*eps)
THEN
506 CALL sstemr( jobz,
'A', n, work( n+1 ), work, vl, vu, il,
507 $ iu, m, w, z, ldz, n, isuppz, tryrac,
508 $ work( 2*n+1 ), lwork-2*n, iwork, liwork, info )
526 CALL sstebz( range, order, n, vll, vuu, il, iu, abstol, d, e,
528 $ nsplit, w, iwork( indibl ), iwork( indisp ), work,
529 $ iwork( indiwo ), info )
532 CALL sstein( n, d, e, m, w, iwork( indibl ),
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 )
576 work( 1 ) = sroundup_lwork(lwmin)
subroutine sstemr(jobz, range, n, d, e, vl, vu, il, iu, m, w, z, ldz, nzc, isuppz, tryrac, work, lwork, iwork, liwork, info)
SSTEMR
subroutine sstevr(jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, ldz, isuppz, work, lwork, iwork, liwork, info)
SSTEVR computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrice...