189 SUBROUTINE dsytrd( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK,
198 INTEGER INFO, LDA, LWORK, N
201 DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ),
209 parameter( one = 1.0d+0 )
212 LOGICAL LQUERY, UPPER
213 INTEGER I, IINFO, IWS, J, KK, LDWORK, LWKOPT, NB,
225 EXTERNAL lsame, ilaenv
232 upper = lsame( uplo,
'U' )
233 lquery = ( lwork.EQ.-1 )
234 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
236 ELSE IF( n.LT.0 )
THEN
238 ELSE IF( lda.LT.max( 1, n ) )
THEN
240 ELSE IF( lwork.LT.1 .AND. .NOT.lquery )
THEN
248 nb = ilaenv( 1,
'DSYTRD', uplo, n, -1, -1, -1 )
249 lwkopt = max( 1, n*nb )
254 CALL xerbla(
'DSYTRD', -info )
256 ELSE IF( lquery )
THEN
269 IF( nb.GT.1 .AND. nb.LT.n )
THEN
274 nx = max( nb, ilaenv( 3,
'DSYTRD', uplo, n, -1, -1, -1 ) )
281 IF( lwork.LT.iws )
THEN
287 nb = max( lwork / ldwork, 1 )
288 nbmin = ilaenv( 2,
'DSYTRD', uplo, n, -1, -1, -1 )
304 kk = n - ( ( n-nx+nb-1 ) / nb )*nb
305 DO 20 i = n - nb + 1, kk + 1, -nb
311 CALL dlatrd( uplo, i+nb-1, nb, a, lda, e, tau, work,
317 CALL dsyr2k( uplo,
'No transpose', i-1, nb, -one, a( 1,
319 $ lda, work, ldwork, one, a, lda )
324 DO 10 j = i, i + nb - 1
325 a( j-1, j ) = e( j-1 )
332 CALL dsytd2( uplo, kk, a, lda, d, e, tau, iinfo )
337 DO 40 i = 1, n - nx, nb
343 CALL dlatrd( uplo, n-i+1, nb, a( i, i ), lda, e( i ),
344 $ tau( i ), work, ldwork )
349 CALL dsyr2k( uplo,
'No transpose', n-i-nb+1, nb, -one,
350 $ a( i+nb, i ), lda, work( nb+1 ), ldwork, one,
351 $ a( i+nb, i+nb ), lda )
356 DO 30 j = i, i + nb - 1
364 CALL dsytd2( uplo, n-i+1, a( i, i ), lda, d( i ), e( i ),
subroutine dsyr2k(uplo, trans, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DSYR2K
subroutine dsytd2(uplo, n, a, lda, d, e, tau, info)
DSYTD2 reduces a symmetric matrix to real symmetric tridiagonal form by an orthogonal similarity tran...
subroutine dsytrd(uplo, n, a, lda, d, e, tau, work, lwork, info)
DSYTRD
subroutine dlatrd(uplo, n, nb, a, lda, e, tau, w, ldw)
DLATRD reduces the first nb rows and columns of a symmetric/Hermitian matrix A to real tridiagonal fo...