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(, * )
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 zupmtr(side, uplo, trans, m, n, ap, tau, c, ldc, work, info)
ZUPMTR
subroutine zstedc(compz, n, d, e, z, ldz, work, lwork, rwork, lrwork, iwork, liwork, info)
ZSTEDC
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 matrice...