403 $ IL, IU, ABSTOL, M, W, Z, LDZ, ISUPPZ,
404 $ WORK, LWORK, RWORK, LRWORK, IWORK,
414 CHARACTER JOBZ, RANGE, UPLO
415 INTEGER IL, INFO, IU, LDA, LDZ, LIWORK, LRWORK, ,
417 DOUBLE PRECISION ABSTOL, VL,
420 INTEGER ISUPPZ( * ), IWORK( * )
421 DOUBLE PRECISION RWORK( * ), W(
422COMPLEX*16 A( LDA, * ), WORK( * ), Z( LDZ, * )
428 DOUBLE PRECISION ZERO, ONE
429PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0, two = 2.0d+0 )
432 LOGICAL ALLEIG, INDEIG, LOWER, LQUERY
435 INTEGER I, IEEEOK, IINFO, IMAX, INDIBL, INDIFL, INDISP,
436 $ , INDRD, INDRDD, INDRE, , INDRWK,
437 $ indtau, indwk, indwkn, iscale, itmp1, j, jj,
438 $ liwmin, llwork, llrwork, llwrkn, lrwmin,
439 $ lwmin, nsplit, lhtrd, lwtrd, kd, ib, indhous
440 DOUBLE PRECISION ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
441 $ SIGMA, SMLNUM, , VLL, VUU
445 INTEGER ILAENV, ILAENV2STAGE
446 DOUBLE PRECISION DLAMCH, ZLANSY
447 EXTERNAL lsame, dlamch, zlansy, ilaenv, ilaenv2stage
454 INTRINSIC dble,
max,
min, sqrt
460 ieeeok = ilaenv( 10,
'ZHEEVR',
'N', 1, 2, 3, 4 )
462 lower = lsame( uplo,
'L' )
463 wantz = lsame( jobz,
'V' )
464 alleig = lsame( range,
'A' )
465 valeig = lsame( range,
'V' )
466 indeig = lsame( range,
'I' )
468 lquery = ( ( lwork.EQ.-1 ) .OR. ( lrwork.EQ.-1 ) .OR.
471 kd = ilaenv2stage( 1,
'ZHETRD_2STAGE', jobz, n, -1, -1, -1 )
473 LHTRD = ILAENV2STAGE( 3, 'zhetrd_2stage', JOBZ, N, KD, IB, -1 )
474 LWTRD = ILAENV2STAGE( 4, 'zhetrd_2stage', JOBZ, N, KD, IB, -1 )
475 LWMIN = N + LHTRD + LWTRD
476 LRWMIN = MAX( 1, 24*N )
477 LIWMIN = MAX( 1, 10*N )
480.NOT.
IF( ( LSAME( JOBZ, 'n
' ) ) ) THEN
482.NOT..OR..OR.
ELSE IF( ( ALLEIG VALEIG INDEIG ) ) THEN
484.NOT..OR.
ELSE IF( ( LOWER LSAME( UPLO, 'u
' ) ) ) THEN
486.LT.
ELSE IF( N0 ) THEN
488.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
492.GT..AND..LE.
IF( N0 VUVL )
494 ELSE IF( INDEIG ) THEN
495.LT..OR..GT.
IF( IL1 ILMAX( 1, N ) ) THEN
497.LT..OR..GT.
ELSE IF( IUMIN( N, IL ) IUN ) THEN
503.LT..OR..AND..LT.
IF( LDZ1 ( WANTZ LDZN ) ) THEN
513.LT..AND..NOT.
IF( LWORKLWMIN LQUERY ) THEN
515.LT..AND..NOT.
ELSE IF( LRWORKLRWMIN LQUERY ) THEN
517.LT..AND..NOT.
ELSE IF( LIWORKLIWMIN LQUERY ) THEN
525 ELSE IF( LQUERY ) THEN
539.OR.
IF( ALLEIG INDEIG ) THEN
541 W( 1 ) = DBLE( A( 1, 1 ) )
543.LT..AND..GE.
IF( VLDBLE( A( 1, 1 ) ) VUDBLE( A( 1, 1 ) ) )
546 W( 1 ) = DBLE( A( 1, 1 ) )
559 SAFMIN = DLAMCH( 'safe minimum
' )
560 EPS = DLAMCH( 'precision
' )
561 SMLNUM = SAFMIN / EPS
562 BIGNUM = ONE / SMLNUM
563 RMIN = SQRT( SMLNUM )
564 RMAX = MIN( SQRT( BIGNUM ), ONE / SQRT( SQRT( SAFMIN ) ) )
574 ANRM = ZLANSY( 'm
', UPLO, N, A, LDA, RWORK )
575.GT..AND..LT.
IF( ANRMZERO ANRMRMIN ) THEN
578.GT.
ELSE IF( ANRMRMAX ) THEN
582.EQ.
IF( ISCALE1 ) THEN
585 CALL ZDSCAL( N-J+1, SIGMA, A( J, J ), 1 )
589 CALL ZDSCAL( J, SIGMA, A( 1, J ), 1 )
593 $ ABSTLL = ABSTOL*SIGMA
609 INDWK = INDHOUS + LHTRD
610 LLWORK = LWORK - INDWK + 1
627 LLRWORK = LRWORK - INDRWK + 1
646 CALL ZHETRD_2STAGE( JOBZ, UPLO, N, A, LDA, RWORK( INDRD ),
647 $ RWORK( INDRE ), WORK( INDTAU ),
648 $ WORK( INDHOUS ), LHTRD,
649 $ WORK( INDWK ), LLWORK, IINFO )
656.EQ..AND..EQ.
IF( IL1 IUN ) THEN
660.OR..AND..EQ.
IF( ( ALLEIGTEST ) ( IEEEOK1 ) ) THEN
661.NOT.
IF( WANTZ ) THEN
662 CALL DCOPY( N, RWORK( INDRD ), 1, W, 1 )
663 CALL DCOPY( N-1, RWORK( INDRE ), 1, RWORK( INDREE ), 1 )
664 CALL DSTERF( N, W, RWORK( INDREE ), INFO )
666 CALL DCOPY( N-1, RWORK( INDRE ), 1, RWORK( INDREE ), 1 )
667 CALL DCOPY( N, RWORK( INDRD ), 1, RWORK( INDRDD ), 1 )
669.LE.
IF (ABSTOL TWO*N*EPS) THEN
674 CALL ZSTEMR( JOBZ, 'a
', N, RWORK( INDRDD ),
675 $ RWORK( INDREE ), VL, VU, IL, IU, M, W,
676 $ Z, LDZ, N, ISUPPZ, TRYRAC,
677 $ RWORK( INDRWK ), LLRWORK,
678 $ IWORK, LIWORK, INFO )
683.AND..EQ.
IF( WANTZ INFO0 ) THEN
685 LLWRKN = LWORK - INDWKN + 1
686 CALL ZUNMTR( 'l', uplo,
'N', n, m, a, lda,
687 $ work( indtau ), z, ldz, work( indwkn ),
709 CALL dstebz( range, order, n, vll, vuu, il, iu, abstll,
710 $ rwork( indrd ), rwork( indre ), m, nsplit, w,
711 $ iwork( indibl ), iwork( indisp ), rwork( indrwk ),
712 $ iwork( indiwo ), info )
715 CALL zstein( n, rwork( indrd ), rwork( indre ), m, w,
716 $ iwork( indibl ), iwork( indisp ), z, ldz,
717 $ rwork( indrwk ), iwork( indiwo ), iwork( indifl ),
724 llwrkn = lwork - indwkn + 1
725 CALL zunmtr(
'L', uplo,
'N', n, m, a, lda, work( indtau ), z,
726 $ ldz, work( indwkn ), llwrkn, iinfo )
732 IF( iscale.EQ.1 )
THEN
738 CALL dscal( imax, one / sigma, w, 1 )
749 IF( w( jj ).LT.tmp1 )
THEN
756 itmp1 = iwork( indibl+i-1 )
758 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
760 iwork( indibl+j-1 ) = itmp1
761 CALL zswap( n, z( 1, i ), 1, z( 1, j ), 1 )
subroutine dstebz(range, order, n, vl, vu, il, iu, abstol, d, e, m, nsplit, w, iblock, isplit, work, iwork, info)
DSTEBZ
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 mat...
subroutine zstemr(jobz, range, n, d, e, vl, vu, il, iu, m, w, z, ldz, nzc, isuppz, tryrac, work, lwork, iwork, liwork, info)
ZSTEMR