256 SUBROUTINE zheevx( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
257 $ ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK,
258 $ IWORK, IFAIL, INFO )
265 CHARACTER JOBZ, RANGE, UPLO
266 INTEGER IL, INFO, IU, LDA, LDZ, LWORK, M, N
267 DOUBLE PRECISION ABSTOL, VL, VU
270 INTEGER IFAIL( * ), IWORK( * )
271 DOUBLE PRECISION RWORK( * ), W( * )
272 COMPLEX*16 A( LDA, * ), WORK( * ), Z( LDZ, * )
278 DOUBLE PRECISION ZERO, ONE
279 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
281 parameter( cone = ( 1.0d+0, 0.0d+0 ) )
284 LOGICAL ALLEIG, INDEIG, LOWER, LQUERY, TEST, VALEIG,
287 INTEGER I, IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
288 $ indisp, indiwk, indrwk, indtau, indwrk, iscale,
289 $ itmp1, j, jj, llwork, lwkmin, lwkopt, nb,
291 DOUBLE PRECISION ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
292 $ SIGMA, SMLNUM, TMP1, VLL, VUU
297 DOUBLE PRECISION DLAMCH, ZLANHE
298 EXTERNAL lsame, ilaenv, dlamch, zlanhe
306 INTRINSIC dble,
max,
min, sqrt
312 lower = lsame( uplo,
'L' )
313 wantz = lsame( jobz,
'V' )
314 alleig = lsame( range,
'A' )
315 valeig = lsame( range,
'V' )
316 indeig = lsame( range,
'I' )
317 lquery = ( lwork.EQ.-1 )
320 IF( .NOT.( wantz .OR. lsame( jobz, 'n
' ) ) ) THEN
322.NOT..OR..OR.
ELSE IF( ( ALLEIG VALEIG INDEIG ) ) THEN
324.NOT..OR.
ELSE IF( ( LOWER LSAME( UPLO, 'u
' ) ) ) THEN
326.LT.
ELSE IF( N0 ) THEN
328.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
332.GT..AND..LE.
IF( N0 VUVL )
334 ELSE IF( INDEIG ) THEN
335.LT..OR..GT.
IF( IL1 ILMAX( 1, N ) ) THEN
337.LT..OR..GT.
ELSE IF( IUMIN( N, IL ) IUN ) THEN
343.LT..OR..AND..LT.
IF( LDZ1 ( WANTZ LDZN ) ) THEN
354 NB = ILAENV( 1, 'zhetrd', UPLO, N, -1, -1, -1 )
355 NB = MAX( NB, ILAENV( 1, 'zunmtr', UPLO, N, -1, -1, -1 ) )
356 LWKOPT = MAX( 1, ( NB + 1 )*N )
360.LT..AND..NOT.
IF( LWORKLWKMIN LQUERY )
365 CALL XERBLA( 'zheevx', -INFO )
367 ELSE IF( LQUERY ) THEN
379.OR.
IF( ALLEIG INDEIG ) THEN
381 W( 1 ) = DBLE( A( 1, 1 ) )
382 ELSE IF( VALEIG ) THEN
383.LT..AND..GE.
IF( VLDBLE( A( 1, 1 ) ) VUDBLE( A( 1, 1 ) ) )
386 W( 1 ) = DBLE( A( 1, 1 ) )
396 SAFMIN = DLAMCH( 'safe minimum
' )
397 EPS = DLAMCH( 'precision
' )
398 SMLNUM = SAFMIN / EPS
399 BIGNUM = ONE / SMLNUM
400 RMIN = SQRT( SMLNUM )
401 RMAX = MIN( SQRT( BIGNUM ), ONE / SQRT( SQRT( SAFMIN ) ) )
411 ANRM = ZLANHE( 'm
', UPLO, N, A, LDA, RWORK )
412.GT..AND..LT.
IF( ANRMZERO ANRMRMIN ) THEN
415.GT.
ELSE IF( ANRMRMAX ) THEN
419.EQ.
IF( ISCALE1 ) THEN
422 CALL ZDSCAL( N-J+1, SIGMA, A( J, J ), 1 )
426 CALL ZDSCAL( J, SIGMA, A( 1, J ), 1 )
430 $ ABSTLL = ABSTOL*SIGMA
444 LLWORK = LWORK - INDWRK + 1
445 CALL ZHETRD( UPLO, N, A, LDA, RWORK( INDD ), RWORK( INDE ),
446 $ WORK( INDTAU ), WORK( INDWRK ), LLWORK, IINFO )
454.EQ..AND..EQ.
IF( IL1 IUN ) THEN
458.OR..AND..LE.
IF( ( ALLEIG TEST ) ( ABSTOLZERO ) ) THEN
459 CALL DCOPY( N, RWORK( INDD ), 1, W, 1 )
461.NOT.
IF( WANTZ ) THEN
462 CALL DCOPY( N-1, RWORK( INDE ), 1, RWORK( INDEE ), 1 )
463 CALL DSTERF( N, W, RWORK( INDEE ), INFO )
465 CALL ZLACPY( 'a
', N, N, A, LDA, Z, LDZ )
466 CALL ZUNGTR( UPLO, N, Z, LDZ, WORK( INDTAU ),
467 $ WORK( INDWRK ), LLWORK, IINFO )
468 CALL DCOPY( N-1, RWORK( INDE ), 1, RWORK( INDEE ), 1 )
469 CALL ZSTEQR( JOBZ, N, W, RWORK( INDEE ), Z, LDZ,
470 $ RWORK( INDRWK ), INFO )
494 CALL DSTEBZ( RANGE, ORDER, N, VLL, VUU, IL, IU, ABSTLL,
495 $ RWORK( INDD ), RWORK( INDE ), M, NSPLIT, W,
496 $ IWORK( INDIBL ), IWORK( INDISP ), RWORK( INDRWK ),
497 $ IWORK( INDIWK ), INFO )
500 CALL ZSTEIN( N, RWORK( INDD ), RWORK( INDE ), M, W,
501 $ IWORK( INDIBL ), IWORK( INDISP ), Z, LDZ,
502 $ RWORK( INDRWK ), IWORK( INDIWK ), IFAIL, INFO )
507 CALL ZUNMTR( 'l
', UPLO, 'n
', N, M, A, LDA, WORK( INDTAU ), Z,
508 $ LDZ, WORK( INDWRK ), LLWORK, IINFO )
514.EQ.
IF( ISCALE1 ) THEN
520 CALL DSCAL( IMAX, ONE / SIGMA, W, 1 )
531.LT.
IF( W( JJ )TMP1 ) THEN
538 ITMP1 = IWORK( INDIBL+I-1 )
540 IWORK( INDIBL+I-1 ) = IWORK( INDIBL+J-1 )
542 IWORK( INDIBL+J-1 ) = ITMP1
543 CALL ZSWAP( N, Z( 1, I ), 1, Z( 1, J ), 1 )
546 IFAIL( I ) = IFAIL( J )
subroutine dstebz(range, order, n, vl, vu, il, iu, abstol, d, e, m, nsplit, w, iblock, isplit, work, iwork, info)
DSTEBZ
subroutine dsterf(n, d, e, info)
DSTERF
subroutine xerbla(srname, info)
XERBLA
subroutine zhetrd(uplo, n, a, lda, d, e, tau, work, lwork, info)
ZHETRD
subroutine zheevx(jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, rwork, iwork, ifail, info)
ZHEEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zstein(n, d, e, m, w, iblock, isplit, z, ldz, work, iwork, ifail, info)
ZSTEIN
subroutine zsteqr(compz, n, d, e, z, ldz, work, info)
ZSTEQR
subroutine zungtr(uplo, n, a, lda, tau, work, lwork, info)
ZUNGTR
subroutine zunmtr(side, uplo, trans, m, n, a, lda, tau, c, ldc, work, lwork, info)
ZUNMTR
subroutine zdscal(n, da, zx, incx)
ZDSCAL
subroutine zswap(n, zx, incx, zy, incy)
ZSWAP
subroutine dscal(n, da, dx, incx)
DSCAL
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY