252 $ RWORK, LRWORK, IWORK, LIWORK, INFO )
262 INTEGER INFO, LDA, LIWORK, LRWORK, LWORK, N
266 DOUBLE PRECISION RWORK( * ), W( * )
267 COMPLEX*16 A( LDA, * ), WORK( * )
273 DOUBLE PRECISION ZERO, ONE
274 parameter( zero = 0.0d0, one = 1.0d0 )
276 parameter( cone = ( 1.0d0, 0.0d0 ) )
279 LOGICAL LOWER, LQUERY, WANTZ
280 INTEGER IINFO, IMAX, INDE, INDRWK, INDTAU, INDWK2,
281 $ indwrk, iscale, liwmin, llrwk, llwork,
282 $ llwrk2, lrwmin, lwmin,
283 $ lhtrd, lwtrd, kd, ib, indhous
286 DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
292 DOUBLE PRECISION DLAMCH, ZLANHE
293 EXTERNAL lsame, dlamch, zlanhe, ilaenv2stage
300 INTRINSIC dble, max, sqrt
306 wantz = lsame( jobz,
'V' )
307 lower = lsame( uplo,
'L' )
308 lquery = ( lwork.EQ.-1 .OR. lrwork.EQ.-1 .OR. liwork.EQ.-1 )
311 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN
313 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
315 ELSE IF( n.LT.0 )
THEN
317 ELSE IF( lda.LT.max( 1, n ) )
THEN
327 kd = ilaenv2stage( 1,
'ZHETRD_2STAGE', jobz,
329 ib = ilaenv2stage( 2,
'ZHETRD_2STAGE', jobz,
331 lhtrd = ilaenv2stage( 3,
'ZHETRD_2STAGE', jobz,
333 lwtrd = ilaenv2stage( 4,
'ZHETRD_2STAGE', jobz,
337 lrwmin = 1 + 5*n + 2*n**2
340 lwmin = n + 1 + lhtrd + lwtrd
349 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
351 ELSE IF( lrwork.LT.lrwmin .AND. .NOT.lquery )
THEN
353 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
359 CALL xerbla(
'ZHEEVD_2STAGE', -info )
361 ELSE IF( lquery )
THEN
371 w( 1 ) = dble( a( 1, 1 ) )
379 safmin = dlamch(
'Safe minimum' )
380 eps = dlamch(
'Precision' )
381 smlnum = safmin / eps
382 bignum = one / smlnum
383 rmin = sqrt( smlnum )
384 rmax = sqrt( bignum )
388 anrm = zlanhe(
'M', uplo, n, a, lda, rwork )
390 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
393 ELSE IF( anrm.GT.rmax )
THEN
398 $
CALL zlascl( uplo, 0, 0, one, sigma, n, n, a, lda, info )
404 llrwk = lrwork - indrwk + 1
407 indwrk = indhous + lhtrd
408 llwork = lwork - indwrk + 1
409 indwk2 = indwrk + n*n
410 llwrk2 = lwork - indwk2 + 1
413 $ work( indtau ), work( indhous ), lhtrd,
414 $ work( indwrk ), llwork, iinfo )
422 IF( .NOT.wantz )
THEN
423 CALL dsterf( n, w, rwork( inde ), info )
425 CALL zstedc(
'I', n, w, rwork( inde ), work( indwrk ), n,
426 $ work( indwk2 ), llwrk2, rwork( indrwk ), llrwk,
427 $ iwork, liwork, info )
428 CALL zunmtr(
'L', uplo,
'N', n, n, a, lda, work( indtau ),
429 $ work( indwrk ), n, work( indwk2 ), llwrk2, iinfo )
430 CALL zlacpy(
'A', n, n, work( indwrk ), n, a, lda )
435 IF( iscale.EQ.1 )
THEN
441 CALL dscal( imax, one / sigma, w, 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine zhetrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
ZHETRD_2STAGE
subroutine zheevd_2stage(JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZHEEVD_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE mat...
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