2
3
4
5
6
7
8 INTEGER INFO, K, LDA, N
9
10
11 INTEGER ISEED( 4 )
12 DOUBLE PRECISION D( * )
13 COMPLEX*16 A( LDA, * ), WORK( * )
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 COMPLEX*16 ZERO, ONE, HALF
60 parameter( zero = ( 0.0d+0, 0.0d+0 ),
61 $ one = ( 1.0d+0, 0.0d+0 ),
62 $ half = ( 0.5d+0, 0.0d+0 ) )
63
64
65 INTEGER I, II, J, JJ
66 DOUBLE PRECISION WN
67 COMPLEX*16 ALPHA, TAU, WA, WB
68
69
72
73
74 DOUBLE PRECISION DZNRM2
75 COMPLEX*16 ZDOTC
77
78
79 INTRINSIC abs, dble,
max
80
81
82
83
84
85 info = 0
86 IF( n.LT.0 ) THEN
87 info = -1
88 ELSE IF( k.LT.0 .OR. k.GT.n-1 ) THEN
89 info = -2
90 ELSE IF( lda.LT.
max( 1, n ) )
THEN
91 info = -5
92 END IF
93 IF( info.LT.0 ) THEN
94 CALL xerbla(
'ZLAGSY', -info )
95 RETURN
96 END IF
97
98
99
100 DO 20 j = 1, n
101 DO 10 i = j + 1, n
102 a( i, j ) = zero
103 10 CONTINUE
104 20 CONTINUE
105 DO 30 i = 1, n
106 a( i, i ) = d( i )
107 30 CONTINUE
108
109
110
111 DO 60 i = n - 1, 1, -1
112
113
114
115 CALL zlarnv( 3, iseed, n-i+1, work )
116 wn =
dznrm2( n-i+1, work, 1 )
117 wa = ( wn / abs( work( 1 ) ) )*work( 1 )
118 IF( wn.EQ.zero ) THEN
119 tau = zero
120 ELSE
121 wb = work( 1 ) + wa
122 CALL zscal( n-i, one / wb, work( 2 ), 1 )
123 work( 1 ) = one
124 tau = dble( wb / wa )
125 END IF
126
127
128
129
130
131
132 CALL zlacgv( n-i+1, work, 1 )
133 CALL zsymv(
'Lower', n-i+1, tau, a( i, i ), lda, work, 1, zero,
134 $ work( n+1 ), 1 )
135 CALL zlacgv( n-i+1, work, 1 )
136
137
138
139 alpha = -half*tau*
zdotc( n-i+1, work, 1, work( n+1 ), 1 )
140 CALL zaxpy( n-i+1,
alpha, work, 1, work( n+1 ), 1 )
141
142
143
144
145
146
147 DO 50 jj = i, n
148 DO 40 ii = jj, n
149 a( ii, jj ) = a( ii, jj ) -
150 $ work( ii-i+1 )*work( n+jj-i+1 ) -
151 $ work( n+ii-i+1 )*work( jj-i+1 )
152 40 CONTINUE
153 50 CONTINUE
154 60 CONTINUE
155
156
157
158 DO 100 i = 1, n - 1 - k
159
160
161
162 wn =
dznrm2( n-k-i+1, a( k+i, i ), 1 )
163 wa = ( wn / abs( a( k+i, i ) ) )*a( k+i, i )
164 IF( wn.EQ.zero ) THEN
165 tau = zero
166 ELSE
167 wb = a( k+i, i ) + wa
168 CALL zscal( n-k-i, one / wb, a( k+i+1, i ), 1 )
169 a( k+i, i ) = one
170 tau = dble( wb / wa )
171 END IF
172
173
174
175 CALL zgemv(
'Conjugate transpose', n-k-i+1, k-1, one,
176 $ a( k+i, i+1 ), lda, a( k+i, i ), 1, zero, work, 1 )
177 CALL zgerc( n-k-i+1, k-1, -tau, a( k+i, i ), 1, work, 1,
178 $ a( k+i, i+1 ), lda )
179
180
181
182
183
184 CALL zlacgv( n-k-i+1, a( k+i, i ), 1 )
185 CALL zsymv(
'Lower', n-k-i+1, tau, a( k+i, k+i ), lda,
186 $ a( k+i, i ), 1, zero, work, 1 )
187 CALL zlacgv( n-k-i+1, a( k+i, i ), 1 )
188
189
190
191 alpha = -half*tau*
zdotc( n-k-i+1, a( k+i, i ), 1, work, 1 )
192 CALL zaxpy( n-k-i+1,
alpha, a( k+i, i ), 1, work, 1 )
193
194
195
196
197
198
199 DO 80 jj = k + i, n
200 DO 70 ii = jj, n
201 a( ii, jj ) = a( ii, jj ) - a( ii, i )*work( jj-k-i+1 ) -
202 $ work( ii-k-i+1 )*a( jj, i )
203 70 CONTINUE
204 80 CONTINUE
205
206 a( k+i, i ) = -wa
207 DO 90 j = k + i + 1, n
208 a( j, i ) = zero
209 90 CONTINUE
210 100 CONTINUE
211
212
213
214 DO 120 j = 1, n
215 DO 110 i = j + 1, n
216 a( j, i ) = a( i, j )
217 110 CONTINUE
218 120 CONTINUE
219 RETURN
220
221
222
subroutine xerbla(srname, info)
XERBLA
subroutine zlarnv(idist, iseed, n, x)
ZLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine zlacgv(n, x, incx)
ZLACGV conjugates a complex vector.
subroutine zsymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
ZSYMV computes a matrix-vector product for a complex symmetric matrix.
complex *16 function zdotc(n, zx, incx, zy, incy)
ZDOTC
subroutine zaxpy(n, za, zx, incx, zy, incy)
ZAXPY
subroutine zscal(n, za, zx, incx)
ZSCAL
subroutine zgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
ZGEMV
subroutine zgerc(m, n, alpha, x, incx, y, incy, a, lda)
ZGERC
real(wp) function dznrm2(n, x, incx)
DZNRM2