303 SUBROUTINE dstevr( JOBZ, RANGE, N, D, E, VL, VU, IL, IU, ABSTOL,
304 $ M, W, Z, LDZ, ISUPPZ, WORK, LWORK, IWORK,
313 CHARACTER JOBZ, RANGE
314 INTEGER IL, INFO, IU, LDZ, LIWORK, LWORK, M, N
315 DOUBLE PRECISION ABSTOL, VL, VU
318 INTEGER ISUPPZ( * ), IWORK( * )
319 DOUBLE PRECISION D( * ), E( * ), W( * ), WORK( * ), Z( LDZ, * )
325 DOUBLE PRECISION ZERO, ONE, TWO
326 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0, two = 2.0d+0 )
329 LOGICAL ALLEIG, INDEIG, TEST, LQUERY, VALEIG, WANTZ,
332 INTEGER I, IEEEOK, IMAX, INDIBL, INDIFL, INDISP,
333 $ indiwo, iscale, itmp1, j, jj, liwmin, lwmin,
335 DOUBLE PRECISION BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, SMLNUM,
336 $ TMP1, TNRM, VLL, VUU
341 DOUBLE PRECISION DLAMCH, DLANST
342 EXTERNAL lsame, ilaenv, dlamch, dlanst
349 INTRINSIC max, min, sqrt
356 ieeeok = ilaenv( 10,
'DSTEVR',
'N', 1, 2, 3, 4 )
358 wantz = lsame( jobz,
'V' )
359 alleig = lsame( range,
'A' )
360 valeig = lsame( range,
'V' )
361 indeig = lsame( range,
'I' )
363 lquery = ( ( lwork.EQ.-1 ) .OR. ( liwork.EQ.-1 ) )
364 lwmin = max( 1, 20*n )
365 liwmin = max( 1, 10*n )
369 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
371 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
373 ELSE IF( n.LT.0 )
THEN
377 IF( n.GT.0 .AND. vu.LE.vl )
379 ELSE IF( indeig )
THEN
380 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN
382 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN
388 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
397 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
399 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
405 CALL xerbla(
'DSTEVR', -info )
407 ELSE IF( lquery )
THEN
418 IF( alleig .OR. indeig )
THEN
422 IF( vl.LT.d( 1 ) .AND. vu.GE.d( 1 ) )
THEN
434 safmin = dlamch(
'Safe minimum' )
435 eps = dlamch(
'Precision' )
436 smlnum = safmin / eps
437 bignum = one / smlnum
438 rmin = sqrt( smlnum )
439 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
450 tnrm = dlanst(
'M', n, d, e )
451 IF( tnrm.GT.zero .AND. tnrm.LT.rmin )
THEN
454 ELSE IF( tnrm.GT.rmax )
THEN
458 IF( iscale.EQ.1 )
THEN
459 CALL dscal( n, sigma, d, 1 )
460 CALL dscal( n-1, sigma, e( 1 ), 1 )
491 IF( il.EQ.1 .AND. iu.EQ.n )
THEN
495 IF( ( alleig .OR. test ) .AND. ieeeok.EQ.1 )
THEN
496 CALL dcopy( n-1, e( 1 ), 1, work( 1 ), 1 )
497 IF( .NOT.wantz )
THEN
498 CALL dcopy( n, d, 1, w, 1 )
499 CALL dsterf( n, w, work, info )
501 CALL dcopy( n, d, 1, work( n+1 ), 1 )
502 IF (abstol .LE. two*n*eps)
THEN
507 CALL dstemr( jobz,
'A', n, work( n+1 ), work, vl, vu, il,
508 $ iu, m, w, z, ldz, n, isuppz, tryrac,
509 $ work( 2*n+1 ), lwork-2*n, iwork, liwork, info )
527 CALL dstebz( range, order, n, vll, vuu, il, iu, abstol, d, e, m,
528 $ nsplit, w, iwork( indibl ), iwork( indisp ), work,
529 $ iwork( indiwo ), info )
532 CALL dstein( n, d, e, m, w, iwork( indibl ), iwork( indisp ),
533 $ z, ldz, work, iwork( indiwo ), iwork( indifl ),
540 IF( iscale.EQ.1 )
THEN
546 CALL dscal( imax, one / sigma, w, 1 )
557 IF( w( jj ).LT.tmp1 )
THEN
566 iwork( i ) = iwork( j )
569 CALL dswap( n, z( 1, i ), 1, z( 1, j ), 1 )