203 SUBROUTINE cheevd( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK,
204 $ LRWORK, IWORK, LIWORK, INFO )
212 INTEGER INFO, LDA, LIWORK, LRWORK, LWORK, N
216 REAL RWORK( * ), W( * )
217 COMPLEX A( LDA, * ), WORK( * )
224 parameter( zero = 0.0e0, one = 1.0e0 )
226 parameter( cone = ( 1.0e0, 0.0e0 ) )
229 LOGICAL LOWER, LQUERY, WANTZ
230 INTEGER IINFO, IMAX, INDE, INDRWK, INDTAU, INDWK2,
231 $ indwrk, iscale, liopt, liwmin, llrwk, llwork,
232 $ llwrk2, lopt, lropt, lrwmin, lwmin
233 REAL ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
240 EXTERNAL ilaenv, lsame, clanhe, slamch
253 wantz = lsame( jobz,
'V' )
254 lower = lsame( uplo,
'L' )
255 lquery = ( lwork.EQ.-1 .OR. lrwork.EQ.-1 .OR. liwork.EQ.-1 )
258 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
260 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
262 ELSE IF( n.LT.0 )
THEN
264 ELSE IF( lda.LT.max( 1, n ) )
THEN
279 lrwmin = 1 + 5*n + 2*n**2
286 lopt = max( lwmin, n +
287 $ n*ilaenv( 1,
'CHETRD', uplo, n, -1, -1, -1 ) )
295 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
297 ELSE IF( lrwork.LT.lrwmin .AND. .NOT.lquery )
THEN
299 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
305 CALL xerbla(
'CHEEVD', -info )
307 ELSE IF( lquery )
THEN
317 w( 1 ) = real( a( 1, 1 ) )
325 safmin = slamch(
'Safe minimum' )
326 eps = slamch(
'Precision' )
327 smlnum = safmin / eps
328 bignum = one / smlnum
329 rmin = sqrt( smlnum )
330 rmax = sqrt( bignum )
334 anrm = clanhe(
'M', uplo, n, a, lda, rwork )
336 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
339 ELSE IF( anrm.GT.rmax )
THEN
344 $
CALL clascl( uplo, 0, 0, one, sigma, n, n, a, lda, info )
352 indwk2 = indwrk + n*n
353 llwork = lwork - indwrk + 1
354 llwrk2 = lwork - indwk2 + 1
355 llrwk = lrwork - indrwk + 1
356 CALL chetrd( uplo, n, a, lda, w, rwork( inde ), work( indtau ),
357 $ work( indwrk ), llwork, iinfo )
365 IF( .NOT.wantz )
THEN
366 CALL ssterf( n, w, rwork( inde ), info )
368 CALL cstedc(
'I', n, w, rwork( inde ), work( indwrk ), n,
369 $ work( indwk2 ), llwrk2, rwork( indrwk ), llrwk,
370 $ iwork, liwork, info )
371 CALL cunmtr(
'L', uplo,
'N', n, n, a, lda, work( indtau ),
372 $ work( indwrk ), n, work( indwk2 ), llwrk2, iinfo )
373 CALL clacpy(
'A', n, n, work( indwrk ), n, a, lda )
378 IF( iscale.EQ.1 )
THEN
384 CALL sscal( imax, one / sigma, w, 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine chetrd(UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO)
CHETRD
subroutine cheevd(JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CHEEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
subroutine clascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
CLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine cunmtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
CUNMTR
subroutine cstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CSTEDC
subroutine sscal(N, SA, SX, INCX)
SSCAL