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 dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
DSTEIN
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine dstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
DSTEBZ
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 xerbla(SRNAME, INFO)
XERBLA
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 dsytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
DSYTRD_2STAGE
subroutine dormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMTR