198 SUBROUTINE zhpevd( JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, LWORK,
199 $ RWORK, LRWORK, IWORK, LIWORK, INFO )
207 INTEGER INFO, LDZ, LIWORK, LRWORK, LWORK, N
211 DOUBLE PRECISION RWORK( * ), W( * )
212 COMPLEX*16 AP( * ), WORK( * ), Z( ldz, * )
218 DOUBLE PRECISION ZERO, ONE
219 parameter( zero = 0.0d+0, one = 1.0d+0 )
221 parameter( cone = ( 1.0d+0, 0.0d+0 ) )
224 LOGICAL LQUERY, WANTZ
225 INTEGER IINFO, IMAX, INDE, INDRWK, INDTAU, INDWRK,
226 $ iscale, liwmin, llrwk, llwrk, lrwmin, lwmin
227 DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
232 DOUBLE PRECISION DLAMCH, ZLANHP
233 EXTERNAL lsame, dlamch, zlanhp
246 wantz = lsame( jobz,
'V' )
247 lquery = ( lwork.EQ.-1 .OR. lrwork.EQ.-1 .OR. liwork.EQ.-1 )
250 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN 252 ELSE IF( .NOT.( lsame( uplo,
'L' ) .OR. lsame( uplo,
'U' ) ) )
255 ELSE IF( n.LT.0 )
THEN 257 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 269 lrwmin = 1 + 5*n + 2*n**2
281 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 283 ELSE IF( lrwork.LT.lrwmin .AND. .NOT.lquery )
THEN 285 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN 291 CALL xerbla(
'ZHPEVD', -info )
293 ELSE IF( lquery )
THEN 303 w( 1 ) = dble( ap( 1 ) )
311 safmin = dlamch(
'Safe minimum' )
312 eps = dlamch(
'Precision' )
313 smlnum = safmin / eps
314 bignum = one / smlnum
315 rmin = sqrt( smlnum )
316 rmax = sqrt( bignum )
320 anrm = zlanhp(
'M', uplo, n, ap, rwork )
322 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN 325 ELSE IF( anrm.GT.rmax )
THEN 329 IF( iscale.EQ.1 )
THEN 330 CALL zdscal( ( n*( n+1 ) ) / 2, sigma, ap, 1 )
339 llwrk = lwork - indwrk + 1
340 llrwk = lrwork - indrwk + 1
341 CALL zhptrd( uplo, n, ap, w, rwork( inde ), work( indtau ),
347 IF( .NOT.wantz )
THEN 348 CALL dsterf( n, w, rwork( inde ), info )
350 CALL zstedc(
'I', n, w, rwork( inde ), z, ldz, work( indwrk ),
351 $ llwrk, rwork( indrwk ), llrwk, iwork, liwork,
353 CALL zupmtr(
'L', uplo,
'N', n, n, ap, work( indtau ), z, ldz,
354 $ work( indwrk ), iinfo )
359 IF( iscale.EQ.1 )
THEN 365 CALL dscal( imax, one / sigma, w, 1 )
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
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 zstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZSTEDC
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine zhpevd(JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZHPEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matric...