227 SUBROUTINE dsyevd_2stage( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK,
228 $ IWORK, LIWORK, INFO )
239 INTEGER INFO, LDA, LIWORK, LWORK, N
243 DOUBLE PRECISION A( lda, * ), W( * ), WORK( * )
249 DOUBLE PRECISION ZERO, ONE
250 parameter( zero = 0.0d+0, one = 1.0d+0 )
254 LOGICAL LOWER, LQUERY, WANTZ
255 INTEGER IINFO, INDE, INDTAU, INDWK2, INDWRK, ISCALE,
256 $ liwmin, llwork, llwrk2, lwmin,
257 $ lhtrd, lwtrd, kd, ib, indhous
258 DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
264 DOUBLE PRECISION DLAMCH, DLANSY
265 EXTERNAL lsame, dlamch, dlansy, ilaenv
278 wantz = lsame( jobz,
'V' )
279 lower = lsame( uplo,
'L' )
280 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
283 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN 285 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN 287 ELSE IF( n.LT.0 )
THEN 289 ELSE IF( lda.LT.max( 1, n ) )
THEN 298 kd = ilaenv( 17,
'DSYTRD_2STAGE', jobz, n, -1, -1, -1 )
299 ib = ilaenv( 18,
'DSYTRD_2STAGE', jobz, n, kd, -1, -1 )
300 lhtrd = ilaenv( 19,
'DSYTRD_2STAGE', jobz, n, kd, ib, -1 )
301 lwtrd = ilaenv( 20,
'DSYTRD_2STAGE', jobz, n, kd, ib, -1 )
304 lwmin = 1 + 6*n + 2*n**2
307 lwmin = 2*n + 1 + lhtrd + lwtrd
313 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 315 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN 321 CALL xerbla(
'DSYEVD_2STAGE', -info )
323 ELSE IF( lquery )
THEN 341 safmin = dlamch(
'Safe minimum' )
342 eps = dlamch(
'Precision' )
343 smlnum = safmin / eps
344 bignum = one / smlnum
345 rmin = sqrt( smlnum )
346 rmax = sqrt( bignum )
350 anrm = dlansy(
'M', uplo, n, a, lda, work )
352 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN 355 ELSE IF( anrm.GT.rmax )
THEN 360 $
CALL dlascl( uplo, 0, 0, one, sigma, n, n, a, lda, info )
367 indwrk = indhous + lhtrd
368 llwork = lwork - indwrk + 1
369 indwk2 = indwrk + n*n
370 llwrk2 = lwork - indwk2 + 1
373 $ work( indtau ), work( indhous ), lhtrd,
374 $ work( indwrk ), llwork, iinfo )
381 IF( .NOT.wantz )
THEN 382 CALL dsterf( n, w, work( inde ), info )
387 CALL dstedc(
'I', n, w, work( inde ), work( indwrk ), n,
388 $ work( indwk2 ), llwrk2, iwork, liwork, info )
389 CALL dormtr(
'L', uplo,
'N', n, n, a, lda, work( indtau ),
390 $ work( indwrk ), n, work( indwk2 ), llwrk2, iinfo )
391 CALL dlacpy(
'A', n, n, work( indwrk ), n, a, lda )
397 $
CALL dscal( n, one / sigma, w, 1 )
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMTR
subroutine dlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine dsyevd_2stage(JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK, LIWORK, INFO)
DSYEVD_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY ma...
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dsytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
DSYTRD_2STAGE
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
DSTEDC