380 SUBROUTINE dsyevr_2stage( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
381 $ IL, IU, ABSTOL, M, W, Z, LDZ, ISUPPZ, WORK,
382 $ LWORK, IWORK, LIWORK, INFO )
392 CHARACTER JOBZ, RANGE, UPLO
393 INTEGER IL, INFO, IU, LDA, LDZ, LIWORK, LWORK, M, N
394 DOUBLE PRECISION ABSTOL, VL, VU
397 INTEGER ISUPPZ( * ), IWORK( * )
398 DOUBLE PRECISION A( lda, * ), W( * ), WORK( * ), Z( ldz, * )
404 DOUBLE PRECISION ZERO, ONE, TWO
405 parameter( zero = 0.0d+0, one = 1.0d+0, two = 2.0d+0 )
408 LOGICAL ALLEIG, INDEIG, LOWER, LQUERY, VALEIG, WANTZ,
411 INTEGER I, IEEEOK, IINFO, IMAX, INDD, INDDD, INDE,
412 $ indee, indibl, indifl, indisp, indiwo, indtau,
413 $ indwk, indwkn, iscale, j, jj, liwmin,
414 $ llwork, llwrkn, lwmin, nsplit,
415 $ lhtrd, lwtrd, kd, ib, indhous
416 DOUBLE PRECISION ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
417 $ sigma, smlnum, tmp1, vll, vuu
422 DOUBLE PRECISION DLAMCH, DLANSY
423 EXTERNAL lsame, ilaenv, dlamch, dlansy
430 INTRINSIC max, min, sqrt
436 ieeeok = ilaenv( 10,
'DSYEVR',
'N', 1, 2, 3, 4 )
438 lower = lsame( uplo,
'L' )
439 wantz = lsame( jobz,
'V' )
440 alleig = lsame( range,
'A' )
441 valeig = lsame( range,
'V' )
442 indeig = lsame( range,
'I' )
444 lquery = ( ( lwork.EQ.-1 ) .OR. ( liwork.EQ.-1 ) )
446 kd = ilaenv( 17,
'DSYTRD_2STAGE', jobz, n, -1, -1, -1 )
447 ib = ilaenv( 18,
'DSYTRD_2STAGE', jobz, n, kd, -1, -1 )
448 lhtrd = ilaenv( 19,
'DSYTRD_2STAGE', jobz, n, kd, ib, -1 )
449 lwtrd = ilaenv( 20,
'DSYTRD_2STAGE', jobz, n, kd, ib, -1 )
450 lwmin = max( 26*n, 5*n + lhtrd + lwtrd )
451 liwmin = max( 1, 10*n )
454 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN 456 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN 458 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN 460 ELSE IF( n.LT.0 )
THEN 462 ELSE IF( lda.LT.max( 1, n ) )
THEN 466 IF( n.GT.0 .AND. vu.LE.vl )
468 ELSE IF( indeig )
THEN 469 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN 471 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN 477 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 479 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 481 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN 495 CALL xerbla(
'DSYEVR_2STAGE', -info )
497 ELSE IF( lquery )
THEN 511 IF( alleig .OR. indeig )
THEN 515 IF( vl.LT.a( 1, 1 ) .AND. vu.GE.a( 1, 1 ) )
THEN 530 safmin = dlamch(
'Safe minimum' )
531 eps = dlamch(
'Precision' )
532 smlnum = safmin / eps
533 bignum = one / smlnum
534 rmin = sqrt( smlnum )
535 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
545 anrm = dlansy(
'M', uplo, n, a, lda, work )
546 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN 549 ELSE IF( anrm.GT.rmax )
THEN 553 IF( iscale.EQ.1 )
THEN 556 CALL dscal( n-j+1, sigma, a( j, j ), 1 )
560 CALL dscal( j, sigma, a( 1, j ), 1 )
564 $ abstll = abstol*sigma
592 indwk = indhous + lhtrd
593 llwork = lwork - indwk + 1
615 $ work( inde ), work( indtau ), work( indhous ),
616 $ lhtrd, work( indwk ), llwork, iinfo )
621 IF( ( alleig .OR. ( indeig .AND. il.EQ.1 .AND. iu.EQ.n ) ) .AND.
623 IF( .NOT.wantz )
THEN 624 CALL dcopy( n, work( indd ), 1, w, 1 )
625 CALL dcopy( n-1, work( inde ), 1, work( indee ), 1 )
626 CALL dsterf( n, w, work( indee ), info )
628 CALL dcopy( n-1, work( inde ), 1, work( indee ), 1 )
629 CALL dcopy( n, work( indd ), 1, work( inddd ), 1 )
631 IF (abstol .LE. two*n*eps)
THEN 636 CALL dstemr( jobz,
'A', n, work( inddd ), work( indee ),
637 $ vl, vu, il, iu, m, w, z, ldz, n, isuppz,
638 $ tryrac, work( indwk ), lwork, iwork, liwork,
646 IF( wantz .AND. info.EQ.0 )
THEN 648 llwrkn = lwork - indwkn + 1
649 CALL dormtr(
'L', uplo,
'N', n, m, a, lda,
650 $ work( indtau ), z, ldz, work( indwkn ),
674 CALL dstebz( range, order, n, vll, vuu, il, iu, abstll,
675 $ work( indd ), work( inde ), m, nsplit, w,
676 $ iwork( indibl ), iwork( indisp ), work( indwk ),
677 $ iwork( indiwo ), info )
680 CALL dstein( n, work( indd ), work( inde ), m, w,
681 $ iwork( indibl ), iwork( indisp ), z, ldz,
682 $ work( indwk ), iwork( indiwo ), iwork( indifl ),
689 llwrkn = lwork - indwkn + 1
690 CALL dormtr(
'L', uplo,
'N', n, m, a, lda, work( indtau ), z,
691 $ ldz, work( indwkn ), llwrkn, iinfo )
698 IF( iscale.EQ.1 )
THEN 704 CALL dscal( imax, one / sigma, w, 1 )
717 IF( w( jj ).LT.tmp1 )
THEN 726 CALL dswap( n, z( 1, i ), 1, z( 1, j ), 1 )
subroutine dstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
DSTEIN
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMTR
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dsyevr_2stage(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, ISUPPZ, WORK, LWORK, IWORK, LIWORK, INFO)
DSYEVR_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY ma...
subroutine dsytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
DSYTRD_2STAGE
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dstemr(JOBZ, RANGE, N, D, E, VL, VU, IL, IU, M, W, Z, LDZ, NZC, ISUPPZ, TRYRAC, WORK, LWORK, IWORK, LIWORK, INFO)
DSTEMR
subroutine dstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
DSTEBZ