226 $ IWORK, LIWORK, INFO )
236 INTEGER INFO, LDA, LIWORK, LWORK, N
240 DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * )
246 DOUBLE PRECISION ZERO, ONE
247 parameter( zero = 0.0d+0, one = 1.0d+0 )
251 LOGICAL LOWER, LQUERY, WANTZ
252 INTEGER IINFO, INDE, INDTAU, INDWK2, INDWRK, ISCALE,
253 $ liwmin, llwork, llwrk2, lwmin,
254 $ lhtrd, lwtrd, kd, ib, indhous
255 DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
261 DOUBLE PRECISION DLAMCH, DLANSY
262 EXTERNAL lsame, dlamch, dlansy, ilaenv2stage
275 wantz = lsame( jobz,
'V' )
276 lower = lsame( uplo,
'L' )
277 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
280 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN
282 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
284 ELSE IF( n.LT.0 )
THEN
286 ELSE IF( lda.LT.max( 1, n ) )
THEN
295 kd = ilaenv2stage( 1,
'DSYTRD_2STAGE', jobz,
297 ib = ilaenv2stage( 2,
'DSYTRD_2STAGE', jobz,
299 lhtrd = ilaenv2stage( 3,
'DSYTRD_2STAGE', jobz,
301 lwtrd = ilaenv2stage( 4,
'DSYTRD_2STAGE', jobz,
305 lwmin = 1 + 6*n + 2*n**2
308 lwmin = 2*n + 1 + lhtrd + lwtrd
314 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
316 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
322 CALL xerbla(
'DSYEVD_2STAGE', -info )
324 ELSE IF( lquery )
THEN
342 safmin = dlamch(
'Safe minimum' )
343 eps = dlamch(
'Precision' )
344 smlnum = safmin / eps
345 bignum = one / smlnum
346 rmin = sqrt( smlnum )
347 rmax = sqrt( bignum )
351 anrm = dlansy(
'M', uplo, n, a, lda, work )
353 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
356 ELSE IF( anrm.GT.rmax )
THEN
361 $
CALL dlascl( uplo, 0, 0, one, sigma, n, n, a, lda, info )
368 indwrk = indhous + lhtrd
369 llwork = lwork - indwrk + 1
370 indwk2 = indwrk + n*n
371 llwrk2 = lwork - indwk2 + 1
374 $ work( indtau ), work( indhous ), lhtrd,
375 $ work( indwrk ), llwork, iinfo )
382 IF( .NOT.wantz )
THEN
383 CALL dsterf( n, w, work( inde ), info )
388 CALL dstedc(
'I', n, w, work( inde ), work( indwrk ), n,
389 $ work( indwk2 ), llwrk2, iwork, liwork, info )
390 CALL dormtr(
'L', uplo,
'N', n, n, a, lda, work( indtau ),
391 $ work( indwrk ), n, work( indwk2 ), llwrk2, iinfo )
392 CALL dlacpy(
'A', n, n, work( indwrk ), n, a, lda )
398 $
CALL dscal( n, one / sigma, w, 1 )
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 dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
DSTEDC
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMTR
subroutine dsytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
DSYTRD_2STAGE
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 mat...