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, J
66 REAL WN
67 COMPLEX ALPHA, TAU, WA, WB, DOTC
68
69
70 EXTERNAL caxpy,
ccdotc, cgemv, cgerc, chemv, cher2,
72
73
74 REAL SCNRM2
75 EXTERNAL scnrm2
76
77
78 INTRINSIC abs, conjg,
max, real
79
80
81
82
83
84 info = 0
85 IF( n.LT.0 ) THEN
86 info = -1
87 ELSE IF( k.LT.0 .OR. k.GT.n-1 ) THEN
88 info = -2
89 ELSE IF( lda.LT.
max( 1, n ) )
THEN
90 info = -5
91 END IF
92 IF( info.LT.0 ) THEN
93 CALL xerbla( 'CLAGHE', -info )
94 RETURN
95 END IF
96
97
98
99 DO 20 j = 1, n
100 DO 10 i = j + 1, n
101 a( i, j ) = zero
102 10 CONTINUE
103 20 CONTINUE
104 DO 30 i = 1, n
105 a( i, i ) = d( i )
106 30 CONTINUE
107
108
109
110 DO 40 i = n - 1, 1, -1
111
112
113
114 CALL clarnv( 3, iseed, n-i+1, work )
115 wn = scnrm2( n-i+1, work, 1 )
116 wa = ( wn / abs( work( 1 ) ) )*work( 1 )
117 IF( wn.EQ.zero ) THEN
118 tau = zero
119 ELSE
120 wb = work( 1 ) + wa
121 CALL cscal( n-i, one / wb, work( 2 ), 1 )
122 work( 1 ) = one
123 tau = real( wb / wa )
124 END IF
125
126
127
128
129
130
131 CALL chemv( 'Lower', n-i+1, tau, a( i, i ), lda, work, 1, zero,
132 $ work( n+1 ), 1 )
133
134
135
136 CALL ccdotc( n-i+1, dotc, work( n+1 ), 1, work, 1 )
137 alpha = -half*tau*dotc
138 CALL caxpy( n-i+1, alpha, work, 1, work( n+1 ), 1 )
139
140
141
142 CALL cher2( 'Lower', n-i+1, -one, work, 1, work( n+1 ), 1,
143 $ a( i, i ), lda )
144 40 CONTINUE
145
146
147
148 DO 60 i = 1, n - 1 - k
149
150
151
152 wn = scnrm2( n-k-i+1, a( k+i, i ), 1 )
153 wa = ( wn / abs( a( k+i, i ) ) )*a( k+i, i )
154 IF( wn.EQ.zero ) THEN
155 tau = zero
156 ELSE
157 wb = a( k+i, i ) + wa
158 CALL cscal( n-k-i, one / wb, a( k+i+1, i ), 1 )
159 a( k+i, i ) = one
160 tau = real( wb / wa )
161 END IF
162
163
164
165 CALL cgemv( 'Conjugate transpose', n-k-i+1, k-1, one,
166 $ a( k+i, i+1 ), lda, a( k+i, i ), 1, zero, work, 1 )
167 CALL cgerc( n-k-i+1, k-1, -tau, a( k+i, i ), 1, work, 1,
168 $ a( k+i, i+1 ), lda )
169
170
171
172
173
174 CALL chemv( 'Lower', n-k-i+1, tau, a( k+i, k+i ), lda,
175 $ a( k+i, i ), 1, zero, work, 1 )
176
177
178
179 CALL ccdotc( n-k-i+1, dotc, work, 1, a( k+i, i ), 1 )
180 alpha = -half*tau*dotc
181 CALL caxpy( n-k-i+1, alpha, a( k+i, i ), 1, work, 1 )
182
183
184
185 CALL cher2( 'Lower', n-k-i+1, -one, a( k+i, i ), 1, work, 1,
186 $ a( k+i, k+i ), lda )
187
188 a( k+i, i ) = -wa
189 DO 50 j = k + i + 1, n
190 a( j, i ) = zero
191 50 CONTINUE
192 60 CONTINUE
193
194
195
196 DO 80 j = 1, n
197 DO 70 i = j + 1, n
198 a( j, i ) = conjg( a( i, j ) )
199 70 CONTINUE
200 80 CONTINUE
201 RETURN
202
203
204
subroutine ccdotc(n, dotc, x, incx, y, incy)
subroutine clarnv(idist, iseed, n, x)