404 SUBROUTINE zheevr_2stage( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
405 $ IL, IU, ABSTOL, M, W, Z, LDZ, ISUPPZ,
406 $ WORK, LWORK, RWORK, LRWORK, IWORK,
417 CHARACTER JOBZ, RANGE, UPLO
418 INTEGER IL, INFO, IU, LDA, LDZ, LIWORK, LRWORK, LWORK,
420 DOUBLE PRECISION ABSTOL, VL, VU
423 INTEGER ISUPPZ( * ), IWORK( * )
424 DOUBLE PRECISION RWORK( * ), W( * )
425 COMPLEX*16 A( lda, * ), WORK( * ), Z( ldz, * )
431 DOUBLE PRECISION ZERO, ONE, TWO
432 parameter( zero = 0.0d+0, one = 1.0d+0, two = 2.0d+0 )
435 LOGICAL ALLEIG, INDEIG, LOWER, LQUERY, TEST, VALEIG,
438 INTEGER I, IEEEOK, IINFO, IMAX, INDIBL, INDIFL, INDISP,
439 $ indiwo, indrd, indrdd, indre, indree, indrwk,
440 $ indtau, indwk, indwkn, iscale, itmp1, j, jj,
441 $ liwmin, llwork, llrwork, llwrkn, lrwmin,
442 $ lwmin, nsplit, lhtrd, lwtrd, kd, ib, indhous
443 DOUBLE PRECISION ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
444 $ sigma, smlnum, tmp1, vll, vuu
449 DOUBLE PRECISION DLAMCH, ZLANSY
450 EXTERNAL lsame, ilaenv, dlamch, zlansy
457 INTRINSIC dble, max, min, sqrt
463 ieeeok = ilaenv( 10,
'ZHEEVR',
'N', 1, 2, 3, 4 )
465 lower = lsame( uplo,
'L' )
466 wantz = lsame( jobz,
'V' )
467 alleig = lsame( range,
'A' )
468 valeig = lsame( range,
'V' )
469 indeig = lsame( range,
'I' )
471 lquery = ( ( lwork.EQ.-1 ) .OR. ( lrwork.EQ.-1 ) .OR.
474 kd = ilaenv( 17,
'DSYTRD_2STAGE', jobz, n, -1, -1, -1 )
475 ib = ilaenv( 18,
'DSYTRD_2STAGE', jobz, n, kd, -1, -1 )
476 lhtrd = ilaenv( 19,
'DSYTRD_2STAGE', jobz, n, kd, ib, -1 )
477 lwtrd = ilaenv( 20,
'DSYTRD_2STAGE', jobz, n, kd, ib, -1 )
478 lwmin = n + lhtrd + lwtrd
479 lrwmin = max( 1, 24*n )
480 liwmin = max( 1, 10*n )
483 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN 485 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN 487 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN 489 ELSE IF( n.LT.0 )
THEN 491 ELSE IF( lda.LT.max( 1, n ) )
THEN 495 IF( n.GT.0 .AND. vu.LE.vl )
497 ELSE IF( indeig )
THEN 498 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN 500 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN 506 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 516 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 518 ELSE IF( lrwork.LT.lrwmin .AND. .NOT.lquery )
THEN 520 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN 526 CALL xerbla(
'ZHEEVR_2STAGE', -info )
528 ELSE IF( lquery )
THEN 542 IF( alleig .OR. indeig )
THEN 544 w( 1 ) = dble( a( 1, 1 ) )
546 IF( vl.LT.dble( a( 1, 1 ) ) .AND. vu.GE.dble( a( 1, 1 ) ) )
549 w( 1 ) = dble( a( 1, 1 ) )
562 safmin = dlamch(
'Safe minimum' )
563 eps = dlamch(
'Precision' )
564 smlnum = safmin / eps
565 bignum = one / smlnum
566 rmin = sqrt( smlnum )
567 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
577 anrm = zlansy(
'M', uplo, n, a, lda, rwork )
578 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN 581 ELSE IF( anrm.GT.rmax )
THEN 585 IF( iscale.EQ.1 )
THEN 588 CALL zdscal( n-j+1, sigma, a( j, j ), 1 )
592 CALL zdscal( j, sigma, a( 1, j ), 1 )
596 $ abstll = abstol*sigma
612 indwk = indhous + lhtrd
613 llwork = lwork - indwk + 1
630 llrwork = lrwork - indrwk + 1
650 $ rwork( indre ), work( indtau ),
651 $ work( indhous ), lhtrd,
652 $ work( indwk ), llwork, iinfo )
659 IF( il.EQ.1 .AND. iu.EQ.n )
THEN 663 IF( ( alleig.OR.test ) .AND. ( ieeeok.EQ.1 ) )
THEN 664 IF( .NOT.wantz )
THEN 665 CALL dcopy( n, rwork( indrd ), 1, w, 1 )
666 CALL dcopy( n-1, rwork( indre ), 1, rwork( indree ), 1 )
667 CALL dsterf( n, w, rwork( indree ), info )
669 CALL dcopy( n-1, rwork( indre ), 1, rwork( indree ), 1 )
670 CALL dcopy( n, rwork( indrd ), 1, rwork( indrdd ), 1 )
672 IF (abstol .LE. two*n*eps)
THEN 677 CALL zstemr( jobz,
'A', n, rwork( indrdd ),
678 $ rwork( indree ), vl, vu, il, iu, m, w,
679 $ z, ldz, n, isuppz, tryrac,
680 $ rwork( indrwk ), llrwork,
681 $ iwork, liwork, info )
686 IF( wantz .AND. info.EQ.0 )
THEN 688 llwrkn = lwork - indwkn + 1
689 CALL zunmtr(
'L', uplo,
'N', n, m, a, lda,
690 $ work( indtau ), z, ldz, work( indwkn ),
712 CALL dstebz( range, order, n, vll, vuu, il, iu, abstll,
713 $ rwork( indrd ), rwork( indre ), m, nsplit, w,
714 $ iwork( indibl ), iwork( indisp ), rwork( indrwk ),
715 $ iwork( indiwo ), info )
718 CALL zstein( n, rwork( indrd ), rwork( indre ), m, w,
719 $ iwork( indibl ), iwork( indisp ), z, ldz,
720 $ rwork( indrwk ), iwork( indiwo ), iwork( indifl ),
727 llwrkn = lwork - indwkn + 1
728 CALL zunmtr(
'L', uplo,
'N', n, m, a, lda, work( indtau ), z,
729 $ ldz, work( indwkn ), llwrkn, iinfo )
735 IF( iscale.EQ.1 )
THEN 741 CALL dscal( imax, one / sigma, w, 1 )
752 IF( w( jj ).LT.tmp1 )
THEN 759 itmp1 = iwork( indibl+i-1 )
761 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
763 iwork( indibl+j-1 ) = itmp1
764 CALL zswap( n, z( 1, i ), 1, z( 1, j ), 1 )
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine zswap(N, ZX, INCX, ZY, INCY)
ZSWAP
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine zheevr_2stage(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, ISUPPZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZHEEVR_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE ma...
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zstemr(JOBZ, RANGE, N, D, E, VL, VU, IL, IU, M, W, Z, LDZ, NZC, ISUPPZ, TRYRAC, WORK, LWORK, IWORK, LIWORK, INFO)
ZSTEMR
subroutine dstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
DSTEBZ
subroutine zstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
ZSTEIN
subroutine zunmtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
ZUNMTR
subroutine zhetrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
ZHETRD_2STAGE