237 SUBROUTINE chpevx( 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
251 INTEGER IFAIL( * ), IWORK( * )
252 REAL RWORK( * ), W( * )
253 COMPLEX AP( * ), WORK( * ), Z( ldz, * )
260 parameter( zero = 0.0e0, one = 1.0e0 )
262 parameter( cone = ( 1.0e0, 0.0e0 ) )
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 REAL ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
271 $ sigma, smlnum, tmp1, vll, vuu
276 EXTERNAL lsame, clanhp, slamch
283 INTRINSIC max, min,
REAL, 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(
'CHPEVX', -info )
333 IF( alleig .OR. indeig )
THEN 335 w( 1 ) =
REAL( AP( 1 ) )
337 IF( vl.LT.
REAL( AP( 1 ) ) .AND. VU.GE.
REAL( AP( 1 ) ) ) then
339 w( 1 ) =
REAL( AP( 1 ) )
349 safmin = slamch(
'Safe minimum' )
350 eps = slamch(
'Precision' )
351 smlnum = safmin / eps
352 bignum = one / smlnum
353 rmin = sqrt( smlnum )
354 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
367 anrm = clanhp(
'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 csscal( ( n*( n+1 ) ) / 2, sigma, ap, 1 )
378 $ abstll = abstol*sigma
392 CALL chptrd( 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 scopy( n, rwork( indd ), 1, w, 1 )
408 IF( .NOT.wantz )
THEN 409 CALL scopy( n-1, rwork( inde ), 1, rwork( indee ), 1 )
410 CALL ssterf( n, w, rwork( indee ), info )
412 CALL cupgtr( uplo, n, ap, work( indtau ), z, ldz,
413 $ work( indwrk ), iinfo )
414 CALL scopy( n-1, rwork( inde ), 1, rwork( indee ), 1 )
415 CALL csteqr( jobz, n, w, rwork( indee ), z, ldz,
416 $ rwork( indrwk ), info )
440 CALL sstebz( 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 cstein( n, rwork( indd ), rwork( inde ), m, w,
447 $ iwork( indibl ), iwork( indisp ), z, ldz,
448 $ rwork( indrwk ), iwork( indiwk ), ifail, info )
454 CALL cupmtr(
'L', uplo,
'N', n, m, ap, work( indtau ), z, ldz,
455 $ work( indwrk ), iinfo )
461 IF( iscale.EQ.1 )
THEN 467 CALL sscal( 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 cswap( n, z( 1, i ), 1, z( 1, j ), 1 )
493 ifail( i ) = ifail( j )
subroutine cupgtr(UPLO, N, AP, TAU, Q, LDQ, WORK, INFO)
CUPGTR
subroutine csteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
CSTEQR
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
SSTEBZ
subroutine csscal(N, SA, CX, INCX)
CSSCAL
subroutine cstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
CSTEIN
subroutine chpevx(JOBZ, RANGE, UPLO, N, AP, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, RWORK, IWORK, IFAIL, INFO)
CHPEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matric...
subroutine chptrd(UPLO, N, AP, D, E, TAU, INFO)
CHPTRD
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine cswap(N, CX, INCX, CY, INCY)
CSWAP
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine cupmtr(SIDE, UPLO, TRANS, M, N, AP, TAU, C, LDC, WORK, INFO)
CUPMTR