2
3
4
5
6
7
8 INTEGER INFO, K, LDA, N
9
10
11 INTEGER ISEED( 4 )
12 REAL D( * )
13 COMPLEX 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 ZERO, ONE, HALF
60 parameter( zero = ( 0.0e+0, 0.0e+0 ),
61 $ one = ( 1.0e+0, 0.0e+0 ),
62 $ half = ( 0.5e+0, 0.0e+0 ) )
63
64
65 INTEGER I, II, J, JJ
66 REAL WN
67 COMPLEX ALPHA, TAU, WA, WB
68
69
72
73
74 REAL SCNRM2
75 COMPLEX CDOTC
77
78
79 INTRINSIC abs,
max, real
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(
'CLAGSY', -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 clarnv( 3, iseed, n-i+1, work )
116 wn =
scnrm2( 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 cscal( n-i, one / wb, work( 2 ), 1 )
123 work( 1 ) = one
124 tau = real( wb / wa )
125 END IF
126
127
128
129
130
131
132 CALL clacgv( n-i+1, work, 1 )
133 CALL csymv(
'Lower', n-i+1, tau, a( i, i ), lda, work, 1, zero,
134 $ work( n+1 ), 1 )
135 CALL clacgv( n-i+1, work, 1 )
136
137
138
139 alpha = -half*tau*
cdotc( n-i+1, work, 1, work( n+1 ), 1 )
140 CALL caxpy( 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 =
scnrm2( 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 cscal( n-k-i, one / wb, a( k+i+1, i ), 1 )
169 a( k+i, i ) = one
170 tau = real( wb / wa )
171 END IF
172
173
174
175 CALL cgemv(
'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 cgerc( 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 clacgv( n-k-i+1, a( k+i, i ), 1 )
185 CALL csymv(
'Lower', n-k-i+1, tau, a( k+i, k+i ), lda,
186 $ a( k+i, i ), 1, zero, work, 1 )
187 CALL clacgv( n-k-i+1, a( k+i, i ), 1 )
188
189
190
191 alpha = -half*tau*
cdotc( n-k-i+1, a( k+i, i ), 1, work, 1 )
192 CALL caxpy( 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 clacgv(n, x, incx)
CLACGV conjugates a complex vector.
subroutine clarnv(idist, iseed, n, x)
CLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine csymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
CSYMV computes a matrix-vector product for a complex symmetric matrix.
subroutine caxpy(n, ca, cx, incx, cy, incy)
CAXPY
complex function cdotc(n, cx, incx, cy, incy)
CDOTC
subroutine cscal(n, ca, cx, incx)
CSCAL
subroutine cgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
CGEMV
subroutine cgerc(m, n, alpha, x, incx, y, incy, a, lda)
CGERC
real(wp) function scnrm2(n, x, incx)
SCNRM2