237 SUBROUTINE zhpevx( JOBZ, RANGE, UPLO, N, AP, VL, VU, IL, IU,
238 $ ABSTOL, M, W, Z, LDZ, WORK, RWORK, IWORK,
246 CHARACTER JOBZ, RANGE, UPLO
247 INTEGER IL, INFO, IU, LDZ, M, N
248 DOUBLE PRECISION ABSTOL, VL, VU
251 INTEGER IFAIL( * ), IWORK( * )
252 DOUBLE PRECISION RWORK( * ), W( * )
253 COMPLEX*16 AP( * ), WORK( * ), Z( ldz, * )
259 DOUBLE PRECISION ZERO, ONE
260 parameter( zero = 0.0d0, one = 1.0d0 )
262 parameter( cone = ( 1.0d0, 0.0d0 ) )
265 LOGICAL ALLEIG, INDEIG, TEST, VALEIG, WANTZ
267 INTEGER I, IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
268 $ indisp, indiwk, indrwk, indtau, indwrk, iscale,
269 $ itmp1, j, jj, nsplit
270 DOUBLE PRECISION ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
271 $ sigma, smlnum, tmp1, vll, vuu
275 DOUBLE PRECISION DLAMCH, ZLANHP
276 EXTERNAL lsame, dlamch, zlanhp
283 INTRINSIC dble, max, min, sqrt
289 wantz = lsame( jobz,
'V' )
290 alleig = lsame( range,
'A' )
291 valeig = lsame( range,
'V' )
292 indeig = lsame( range,
'I' )
295 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN 297 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN 299 ELSE IF( .NOT.( lsame( uplo,
'L' ) .OR. lsame( uplo,
'U' ) ) )
302 ELSE IF( n.LT.0 )
THEN 306 IF( n.GT.0 .AND. vu.LE.vl )
308 ELSE IF( indeig )
THEN 309 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN 311 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN 317 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
322 CALL xerbla(
'ZHPEVX', -info )
333 IF( alleig .OR. indeig )
THEN 335 w( 1 ) = dble( ap( 1 ) )
337 IF( vl.LT.dble( ap( 1 ) ) .AND. vu.GE.dble( ap( 1 ) ) )
THEN 339 w( 1 ) = dble( ap( 1 ) )
349 safmin = dlamch(
'Safe minimum' )
350 eps = dlamch(
'Precision' )
351 smlnum = safmin / eps
352 bignum = one / smlnum
353 rmin = sqrt( smlnum )
354 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
367 anrm = zlanhp(
'M', uplo, n, ap, rwork )
368 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN 371 ELSE IF( anrm.GT.rmax )
THEN 375 IF( iscale.EQ.1 )
THEN 376 CALL zdscal( ( n*( n+1 ) ) / 2, sigma, ap, 1 )
378 $ abstll = abstol*sigma
392 CALL zhptrd( uplo, n, ap, rwork( indd ), rwork( inde ),
393 $ work( indtau ), iinfo )
401 IF (il.EQ.1 .AND. iu.EQ.n)
THEN 405 IF ((alleig .OR. test) .AND. (abstol.LE.zero))
THEN 406 CALL dcopy( n, rwork( indd ), 1, w, 1 )
408 IF( .NOT.wantz )
THEN 409 CALL dcopy( n-1, rwork( inde ), 1, rwork( indee ), 1 )
410 CALL dsterf( n, w, rwork( indee ), info )
412 CALL zupgtr( uplo, n, ap, work( indtau ), z, ldz,
413 $ work( indwrk ), iinfo )
414 CALL dcopy( n-1, rwork( inde ), 1, rwork( indee ), 1 )
415 CALL zsteqr( jobz, n, w, rwork( indee ), z, ldz,
416 $ rwork( indrwk ), info )
440 CALL dstebz( range, order, n, vll, vuu, il, iu, abstll,
441 $ rwork( indd ), rwork( inde ), m, nsplit, w,
442 $ iwork( indibl ), iwork( indisp ), rwork( indrwk ),
443 $ iwork( indiwk ), info )
446 CALL zstein( n, rwork( indd ), rwork( inde ), m, w,
447 $ iwork( indibl ), iwork( indisp ), z, ldz,
448 $ rwork( indrwk ), iwork( indiwk ), ifail, info )
454 CALL zupmtr(
'L', uplo,
'N', n, m, ap, work( indtau ), z, ldz,
455 $ work( indwrk ), iinfo )
461 IF( iscale.EQ.1 )
THEN 467 CALL dscal( imax, one / sigma, w, 1 )
478 IF( w( jj ).LT.tmp1 )
THEN 485 itmp1 = iwork( indibl+i-1 )
487 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
489 iwork( indibl+j-1 ) = itmp1
490 CALL zswap( n, z( 1, i ), 1, z( 1, j ), 1 )
493 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 zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zsteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
ZSTEQR
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zupmtr(SIDE, UPLO, TRANS, M, N, AP, TAU, C, LDC, WORK, INFO)
ZUPMTR
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine zhptrd(UPLO, N, AP, D, E, TAU, INFO)
ZHPTRD
subroutine zupgtr(UPLO, N, AP, TAU, Q, LDQ, WORK, INFO)
ZUPGTR
subroutine zhpevx(JOBZ, RANGE, UPLO, N, AP, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, RWORK, IWORK, IFAIL, INFO)
ZHPEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matric...
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine zstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
ZSTEIN
subroutine zswap(N, ZX, INCX, ZY, INCY)
ZSWAP