203 SUBROUTINE zheevd( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK,
204 $ LRWORK, IWORK, LIWORK, INFO )
212 INTEGER INFO, LDA, LIWORK, LRWORK, LWORK, N
216 DOUBLE PRECISION RWORK( * ), W( * )
217 COMPLEX*16 A( LDA, * ), WORK( * )
223 DOUBLE PRECISION ZERO, ONE
224 parameter( zero = 0.0d0, one = 1.0d0 )
226 parameter( cone = ( 1.0d0, 0.0d0 ) )
229 LOGICAL LOWER, LQUERY, WANTZ
230 INTEGER IINFO, IMAX, INDE, INDRWK, INDTAU, INDWK2,
231 $ indwrk, iscale, liopt, liwmin, llrwk, llwork,
233 DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, , SAFMIN, SIGMA,
239 DOUBLE PRECISION DLAMCH, ZLANHE
240 EXTERNAL lsame, ilaenv, dlamch, zlanhe
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.NOT..OR.
ELSE IF( ( LOWER LSAME( UPLO, 'u
' ) ) ) THEN
262.LT.
ELSE IF( N0 ) THEN
264.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
279 LRWMIN = 1 + 5*N + 2*N**2
286 LOPT = MAX( LWMIN, N +
287 $ ILAENV( 1, 'zhetrd', UPLO, N, -1, -1, -1 ) )
295.LT..AND..NOT.
IF( LWORKLWMIN LQUERY ) THEN
297.LT..AND..NOT.
ELSE IF( LRWORKLRWMIN LQUERY ) THEN
299.LT..AND..NOT.
ELSE IF( LIWORKLIWMIN LQUERY ) THEN
305 CALL XERBLA( 'zheevd', -INFO )
307 ELSE IF( LQUERY ) THEN
317 W( 1 ) = DBLE( A( 1, 1 ) )
325 SAFMIN = DLAMCH( 'safe minimum
' )
326 EPS = DLAMCH( 'precision
' )
327 SMLNUM = SAFMIN / EPS
328 BIGNUM = ONE / SMLNUM
329 RMIN = SQRT( SMLNUM )
330 RMAX = SQRT( BIGNUM )
334 ANRM = ZLANHE( 'm
', UPLO, N, A, LDA, RWORK )
336.GT..AND..LT.
IF( ANRMZERO ANRMRMIN ) THEN
339.GT.
ELSE IF( ANRMRMAX ) THEN
344 $ CALL ZLASCL( 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 ZHETRD( UPLO, N, A, LDA, W, RWORK( INDE ), WORK( INDTAU ),
357 $ WORK( INDWRK ), LLWORK, IINFO )
365.NOT.
IF( WANTZ ) THEN
366 CALL DSTERF( N, W, RWORK( INDE ), INFO )
368 CALL ZSTEDC( 'i
', N, W, RWORK( INDE ), WORK( INDWRK ), N,
369 $ WORK( INDWK2 ), LLWRK2, RWORK( INDRWK ), LLRWK,
370 $ IWORK, LIWORK, INFO )
371 CALL ZUNMTR( 'l
', UPLO, 'n
', N, N, A, LDA, WORK( INDTAU ),
372 $ WORK( INDWRK ), N, WORK( INDWK2 ), LLWRK2, IINFO )
373 CALL ZLACPY( 'a
', N, N, WORK( INDWRK ), N, A, LDA )
378.EQ.
IF( ISCALE1 ) THEN
384 CALL DSCAL( IMAX, ONE / SIGMA, W, 1 )
subroutine dsterf(n, d, e, info)
DSTERF
subroutine xerbla(srname, info)
XERBLA
subroutine zhetrd(uplo, n, a, lda, d, e, tau, work, lwork, info)
ZHETRD
subroutine zheevd(jobz, uplo, n, a, lda, w, work, lwork, rwork, lrwork, iwork, liwork, info)
ZHEEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
subroutine zlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zunmtr(side, uplo, trans, m, n, a, lda, tau, c, ldc, work, lwork, info)
ZUNMTR
subroutine zstedc(compz, n, d, e, z, ldz, work, lwork, rwork, lrwork, iwork, liwork, info)
ZSTEDC
subroutine dscal(n, da, dx, incx)
DSCAL