198 SUBROUTINE chpevd( JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, LWORK,
199 $ RWORK, LRWORK, IWORK, LIWORK, INFO )
207 INTEGER INFO, LDZ, LIWORK, LRWORK, LWORK, N
211 REAL RWORK( * ), W( * )
212 COMPLEX AP( * ), WORK( * ), Z( LDZ, * )
219 parameter( zero = 0.0e+0, one = 1.0e+0 )
221 parameter( cone = ( 1.0e+0, 0.0e+0 ) )
224 LOGICAL LQUERY, WANTZ
225 INTEGER IINFO, IMAX, INDE, INDRWK, INDTAU, INDWRK,
226 $ iscale, liwmin, llrwk, llwrk, lrwmin, lwmin
227 REAL ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
233 EXTERNAL lsame, clanhp, slamch
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(
'CHPEVD', -info )
293 ELSE IF( lquery )
THEN
303 w( 1 ) = real( ap( 1 ) )
311 safmin = slamch(
'Safe minimum' )
312 eps = slamch(
'Precision' )
313 smlnum = safmin / eps
314 bignum = one / smlnum
315 rmin = sqrt( smlnum )
316 rmax = sqrt( bignum )
320 anrm = clanhp(
'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 csscal( ( n*( n+1 ) ) / 2, sigma, ap, 1 )
339 llwrk = lwork - indwrk + 1
340 llrwk = lrwork - indrwk + 1
341 CALL chptrd( uplo, n, ap, w, rwork( inde ), work( indtau ),
347 IF( .NOT.wantz )
THEN
348 CALL ssterf( n, w, rwork( inde ), info )
350 CALL cstedc(
'I', n, w, rwork( inde ), z, ldz, work( indwrk ),
351 $ llwrk, rwork( indrwk ), llrwk, iwork, liwork,
353 CALL cupmtr(
'L', uplo,
'N', n, n, ap, work( indtau ), z, ldz,
354 $ work( indwrk ), iinfo )
359 IF( iscale.EQ.1 )
THEN
365 CALL sscal( imax, one / sigma, w, 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine csscal(N, SA, CX, INCX)
CSSCAL
subroutine chptrd(UPLO, N, AP, D, E, TAU, INFO)
CHPTRD
subroutine cupmtr(SIDE, UPLO, TRANS, M, N, AP, TAU, C, LDC, WORK, INFO)
CUPMTR
subroutine cstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CSTEDC
subroutine chpevd(JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CHPEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrice...
subroutine sscal(N, SA, SX, INCX)
SSCAL