3
4
5
6
7
8
9
10 CHARACTER*1 UPLO
11 INTEGER INCX, INCY, LDA, N
12 REAL ALPHA, BETA
13
14
15 REAL Y( * )
16 COMPLEX A( LDA, * ), X( * )
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 REAL ONE, ZERO
94 parameter( one = 1.0e+0, zero = 0.0e+0 )
95
96
97 INTEGER I, INFO, IX, IY, J, JX, JY, KX, KY
98 REAL TALPHA, TEMP0, TEMP1, TEMP2
99 COMPLEX ZDUM
100
101
102 LOGICAL LSAME
104
105
106 EXTERNAL xerbla
107
108
109 INTRINSIC abs, aimag, conjg,
max, real
110
111
112 REAL CABS1
113 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
114
115
116
117
118
119 info = 0
120 IF ( .NOT.
lsame( uplo,
'U' ).AND.
121 $ .NOT.
lsame( uplo,
'L' ) )
THEN
122 info = 1
123 ELSE IF( n.LT.0 )THEN
124 info = 2
125 ELSE IF( lda.LT.
max( 1, n ) )
THEN
126 info = 5
127 ELSE IF( incx.EQ.0 )THEN
128 info = 7
129 ELSE IF( incy.EQ.0 )THEN
130 info = 10
131 END IF
132 IF( info.NE.0 )THEN
133 CALL xerbla( 'CAHEMV', info )
134 RETURN
135 END IF
136
137
138
139 IF( ( n.EQ.0 ).OR.( ( alpha.EQ.zero ).AND.( beta.EQ.one ) ) )
140 $ RETURN
141
142
143
144 IF( incx.GT.0 ) THEN
145 kx = 1
146 ELSE
147 kx = 1 - ( n - 1 ) * incx
148 END IF
149 IF( incy.GT.0 )THEN
150 ky = 1
151 ELSE
152 ky = 1 - ( n - 1 ) * incy
153 END IF
154
155
156
157
158
159
160
161 IF( beta.NE.one ) THEN
162 IF( incy.EQ.1 ) THEN
163 IF( beta.EQ.zero ) THEN
164 DO 10, i = 1, n
165 y( i ) = zero
166 10 CONTINUE
167 ELSE
168 DO 20, i = 1, n
169 y( i ) = abs( beta * y( i ) )
170 20 CONTINUE
171 END IF
172 ELSE
173 iy = ky
174 IF( beta.EQ.zero ) THEN
175 DO 30, i = 1, n
176 y( iy ) = zero
177 iy = iy + incy
178 30 CONTINUE
179 ELSE
180 DO 40, i = 1, n
181 y( iy ) = abs( beta * y( iy ) )
182 iy = iy + incy
183 40 CONTINUE
184 END IF
185 END IF
186 END IF
187
188 IF( alpha.EQ.zero )
189 $ RETURN
190
191 talpha = abs( alpha )
192
193 IF(
lsame( uplo,
'U' ) )
THEN
194
195
196
197 IF( ( incx.EQ.1 ).AND.( incy.EQ.1 ) ) THEN
198 DO 60, j = 1, n
199 temp1 = talpha * cabs1( x( j ) )
200 temp2 = zero
201 DO 50, i = 1, j - 1
202 temp0 = cabs1( a( i, j ) )
203 y( i ) = y( i ) + temp1 * temp0
204 temp2 = temp2 + temp0 * cabs1( x( i ) )
205 50 CONTINUE
206 y( j ) = y( j ) + temp1 * abs( real( a( j, j ) ) ) +
207 $ alpha * temp2
208
209 60 CONTINUE
210
211 ELSE
212
213 jx = kx
214 jy = ky
215
216 DO 80, j = 1, n
217 temp1 = talpha * cabs1( x( jx ) )
218 temp2 = zero
219 ix = kx
220 iy = ky
221
222 DO 70, i = 1, j - 1
223 temp0 = cabs1( a( i, j ) )
224 y( iy ) = y( iy ) + temp1 * temp0
225 temp2 = temp2 + temp0 * cabs1( x( ix ) )
226 ix = ix + incx
227 iy = iy + incy
228 70 CONTINUE
229 y( jy ) = y( jy ) + temp1 * abs( real( a( j, j ) ) ) +
230 $ alpha * temp2
231 jx = jx + incx
232 jy = jy + incy
233
234 80 CONTINUE
235
236 END IF
237
238 ELSE
239
240
241
242 IF( ( incx.EQ.1 ).AND.( incy.EQ.1 ) ) THEN
243
244 DO 100, j = 1, n
245
246 temp1 = talpha * cabs1( x( j ) )
247 temp2 = zero
248 y( j ) = y( j ) + temp1 * abs( real( a( j, j ) ) )
249
250 DO 90, i = j + 1, n
251 temp0 = cabs1( a( i, j ) )
252 y( i ) = y( i ) + temp1 * temp0
253 temp2 = temp2 + temp0 * cabs1( x( i ) )
254
255 90 CONTINUE
256
257 y( j ) = y( j ) + alpha * temp2
258
259 100 CONTINUE
260
261 ELSE
262
263 jx = kx
264 jy = ky
265
266 DO 120, j = 1, n
267 temp1 = talpha * cabs1( x( jx ) )
268 temp2 = zero
269 y( jy ) = y( jy ) + temp1 * abs( real( a( j, j ) ) )
270 ix = jx
271 iy = jy
272
273 DO 110, i = j + 1, n
274
275 ix = ix + incx
276 iy = iy + incy
277 temp0 = cabs1( a( i, j ) )
278 y( iy ) = y( iy ) + temp1 * temp0
279 temp2 = temp2 + temp0 * cabs1( x( ix ) )
280
281 110 CONTINUE
282
283 y( jy ) = y( jy ) + alpha * temp2
284 jx = jx + incx
285 jy = jy + incy
286
287 120 CONTINUE
288
289 END IF
290
291 END IF
292
293 RETURN
294
295
296