252 $ RWORK, LRWORK, IWORK, LIWORK, INFO )
262 INTEGER INFO, LDA, LIWORK, LRWORK, LWORK, N
266 REAL RWORK( * ), W( * )
267 COMPLEX A( LDA, * ), WORK( * )
274 parameter( zero = 0.0e0, one = 1.0e0 )
276 parameter( cone = ( 1.0e0, 0.0e0 ) )
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 REAL ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
293 EXTERNAL lsame, slamch, clanhe, ilaenv2stage
300 INTRINSIC real, 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,
'CHETRD_2STAGE', jobz,
329 ib = ilaenv2stage( 2,
'CHETRD_2STAGE', jobz,
331 lhtrd = ilaenv2stage( 3,
'CHETRD_2STAGE', jobz,
333 lwtrd = ilaenv2stage( 4,
'CHETRD_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(
'CHEEVD_2STAGE', -info )
361 ELSE IF( lquery )
THEN
371 w( 1 ) = real( a( 1, 1 ) )
379 safmin = slamch(
'Safe minimum' )
380 eps = slamch(
'Precision' )
381 smlnum = safmin / eps
382 bignum = one / smlnum
383 rmin = sqrt( smlnum )
384 rmax = sqrt( bignum )
388 anrm = clanhe(
'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 clascl( 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 ssterf( n, w, rwork( inde ), info )
425 CALL cstedc(
'I', n, w, rwork( inde ), work( indwrk ), n,
426 $ work( indwk2 ), llwrk2, rwork( indrwk ), llrwk,
427 $ iwork, liwork, info )
428 CALL cunmtr(
'L', uplo,
'N', n, n, a, lda, work( indtau ),
429 $ work( indwrk ), n, work( indwk2 ), llwrk2, iinfo )
430 CALL clacpy(
'A', n, n, work( indwrk ), n, a, lda )
435 IF( iscale.EQ.1 )
THEN
441 CALL sscal( imax, one / sigma, w, 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine chetrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
CHETRD_2STAGE
subroutine cheevd_2stage(JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CHEEVD_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE mat...
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