1 SUBROUTINE dlagsy( N, K, D, A, LDA, ISEED, WORK, INFO )
8 INTEGER INFO, K, LDA, N
12 DOUBLE PRECISION A( LDA, * ), D( * ), WORK( * )
58 DOUBLE PRECISION ZERO, ONE, HALF
59 parameter( zero = 0.0d+0, one = 1.0d+0, half = 0.5d+0 )
63 DOUBLE PRECISION ALPHA, TAU, WA, WB, WN
70 DOUBLE PRECISION DDOT, DNRM2
83 ELSE IF( k.LT.0 .OR. k.GT.n-1 )
THEN
85 ELSE IF( lda.LT.
max( 1, n ) )
THEN
89 CALL xerbla(
'DLAGSY', -info )
106 DO 40 i = n - 1, 1, -1
110 CALL dlarnv( 3, iseed, n-i+1, work )
111 wn = dnrm2( n-i+1, work, 1 )
112 wa = sign( wn, work( 1 ) )
113 IF( wn.EQ.zero )
THEN
117 CALL dscal( n-i, one / wb, work( 2 ), 1 )
127 CALL dsymv(
'Lower', n-i+1, tau, a( i, i ), lda, work, 1, zero,
133 CALL daxpy( n-i+1, alpha, work, 1, work( n+1 ), 1 )
137 CALL dsyr2(
'Lower', n-i+1, -one, work, 1, work( n+1 ), 1,
143 DO 60 i = 1, n - 1 - k
147 wn = dnrm2( n-k-i+1, a( k+i, i ), 1 )
148 wa = sign( wn, a( k+i, i ) )
149 IF( wn.EQ.zero )
THEN
152 wb = a( k+i, i ) + wa
153 CALL dscal( n-k-i, one / wb, a( k+i+1, i ), 1 )
160 CALL dgemv(
'Transpose', n-k-i+1, k-1, one, a( k+i, i+1 ), lda,
161 $ a( k+i, i ), 1, zero, work, 1 )
162 CALL dger( n-k-i+1, k-1, -tau, a( k+i, i ), 1, work, 1,
163 $ a( k+i, i+1 ), lda )
169 CALL dsymv( 'lower
', N-K-I+1, TAU, A( K+I, K+I ), LDA,
170 $ A( K+I, I ), 1, ZERO, WORK, 1 )
174 ALPHA = -HALF*TAU*DDOT( N-K-I+1, WORK, 1, A( K+I, I ), 1 )
175 CALL DAXPY( N-K-I+1, ALPHA, A( K+I, I ), 1, WORK, 1 )
179 CALL DSYR2( 'lower
', N-K-I+1, -ONE, A( K+I, I ), 1, WORK, 1,
180 $ A( K+I, K+I ), LDA )
183 DO 50 J = K + I + 1, N
192 A( J, I ) = A( I, J )
subroutine dlarnv(idist, iseed, n, x)
DLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine dsymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
DSYMV
subroutine dgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
DGEMV
subroutine dsyr2(uplo, n, alpha, x, incx, y, incy, a, lda)
DSYR2
subroutine dger(m, n, alpha, x, incx, y, incy, a, lda)
DGER