3
4
5
6
7
8
9
10 CHARACTER*1 DIAG, TRANS, 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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121 REAL ONE, ZERO
122 parameter( one = 1.0e+0, zero = 0.0e+0 )
123
124
125 INTEGER I, INFO, IX, IY, J, JX, JY, KX, KY
126 LOGICAL NOUNIT
127 REAL ABSX, TALPHA, TEMP
128 COMPLEX ZDUM
129
130
131 LOGICAL LSAME
133
134
135 EXTERNAL xerbla
136
137
138 INTRINSIC abs, aimag,
max, real
139
140
141 REAL CABS1
142 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
143
144
145
146
147
148 info = 0
149 IF ( .NOT.
lsame( uplo ,
'U' ).AND.
150 $ .NOT.
lsame( uplo ,
'L' ) )
THEN
151 info = 1
152 ELSE IF( .NOT.
lsame( trans,
'N' ).AND.
153 $ .NOT.
lsame( trans,
'T' ).AND.
154 $ .NOT.
lsame( trans,
'C' ) )
THEN
155 info = 2
156 ELSE IF( .NOT.
lsame( diag ,
'U' ).AND.
157 $ .NOT.
lsame( diag ,
'N' ) )
THEN
158 info = 3
159 ELSE IF( n.LT.0 )THEN
160 info = 4
161 ELSE IF( lda.LT.
max( 1, n ) )
THEN
162 info = 7
163 ELSE IF( incx.EQ.0 )THEN
164 info = 9
165 ELSE IF( incy.EQ.0 ) THEN
166 info = 12
167 END IF
168 IF( info.NE.0 )THEN
169 CALL xerbla( 'CATRMV', info )
170 RETURN
171 END IF
172
173
174
175 IF( ( n.EQ.0 ).OR.
176 $ ( ( alpha.EQ.zero ).AND.( beta.EQ.one ) ) )
177 $ RETURN
178
179 nounit =
lsame( diag ,
'N' )
180
181
182
183 IF( incx.GT.0 ) THEN
184 kx = 1
185 ELSE
186 kx = 1 - ( n - 1 ) * incx
187 END IF
188 IF( incy.GT.0 ) THEN
189 ky = 1
190 ELSE
191 ky = 1 - ( n - 1 ) * incy
192 END IF
193
194
195
196
197
198
199 IF( incy.EQ.1 ) THEN
200 IF( beta.EQ.zero ) THEN
201 DO 10, i = 1, n
202 y( i ) = zero
203 10 CONTINUE
204 ELSE IF( beta.EQ.one ) THEN
205 DO 20, i = 1, n
206 y( i ) = abs( y( i ) )
207 20 CONTINUE
208 ELSE
209 DO 30, i = 1, n
210 y( i ) = abs( beta * y( i ) )
211 30 CONTINUE
212 END IF
213 ELSE
214 iy = ky
215 IF( beta.EQ.zero ) THEN
216 DO 40, i = 1, n
217 y( iy ) = zero
218 iy = iy + incy
219 40 CONTINUE
220 ELSE IF( beta.EQ.one ) THEN
221 DO 50, i = 1, n
222 y( iy ) = abs( y( iy ) )
223 iy = iy + incy
224 50 CONTINUE
225 ELSE
226 DO 60, i = 1, n
227 y( iy ) = abs( beta * y( iy ) )
228 iy = iy + incy
229 60 CONTINUE
230 END IF
231 END IF
232
233 IF( alpha.EQ.zero )
234 $ RETURN
235
236 talpha = abs( alpha )
237
238 IF(
lsame( trans,
'N' ) )
THEN
239
240
241
242 IF(
lsame( uplo,
'U' ) )
THEN
243 jx = kx
244 IF( incy.EQ.1 ) THEN
245 DO 80, j = 1, n
246 absx = cabs1( x( jx ) )
247 IF( absx.NE.zero ) THEN
248 temp = talpha * absx
249 DO 70, i = 1, j - 1
250 y( i ) = y( i ) + temp * cabs1( a( i, j ) )
251 70 CONTINUE
252
253 IF( nounit ) THEN
254 y( j ) = y( j ) + temp * cabs1( a( j, j ) )
255 ELSE
256 y( j ) = y( j ) + temp
257 END IF
258 END IF
259 jx = jx + incx
260 80 CONTINUE
261
262 ELSE
263
264 DO 100, j = 1, n
265 absx = cabs1( x( jx ) )
266 IF( absx.NE.zero ) THEN
267 temp = talpha * absx
268 iy = ky
269 DO 90, i = 1, j - 1
270 y( iy ) = y( iy ) + temp * cabs1( a( i, j ) )
271 iy = iy + incy
272 90 CONTINUE
273
274 IF( nounit ) THEN
275 y( iy ) = y( iy ) + temp * cabs1( a( j, j ) )
276 ELSE
277 y( iy ) = y( iy ) + temp
278 END IF
279 END IF
280 jx = jx + incx
281 100 CONTINUE
282
283 END IF
284
285 ELSE
286
287 jx = kx
288 IF( incy.EQ.1 ) THEN
289 DO 120, j = 1, n
290 absx = cabs1( x( jx ) )
291 IF( absx.NE.zero ) THEN
292
293 temp = talpha * absx
294
295 IF( nounit ) THEN
296 y( j ) = y( j ) + temp * cabs1( a( j, j ) )
297 ELSE
298 y( j ) = y( j ) + temp
299 END IF
300
301 DO 110, i = j + 1, n
302 y( i ) = y( i ) + temp * cabs1( a( i, j ) )
303 110 CONTINUE
304 END IF
305 jx = jx + incx
306 120 CONTINUE
307
308 ELSE
309
310 DO 140, j = 1, n
311 absx = cabs1( x( jx ) )
312 IF( absx.NE.zero ) THEN
313 temp = talpha * absx
314 iy = ky + ( j - 1 ) * incy
315
316 IF( nounit ) THEN
317 y( iy ) = y( iy ) + temp * cabs1( a( j, j ) )
318 ELSE
319 y( iy ) = y( iy ) + temp
320 END IF
321
322 DO 130, i = j + 1, n
323 iy = iy + incy
324 y( iy ) = y( iy ) + temp * cabs1( a( i, j ) )
325 130 CONTINUE
326 END IF
327 jx = jx + incx
328 140 CONTINUE
329
330 END IF
331
332 END IF
333
334 ELSE
335
336
337
338 IF(
lsame( uplo,
'U' ) )
THEN
339 jy = ky
340 IF( incx.EQ.1 ) THEN
341 DO 160, j = 1, n
342
343 temp = zero
344
345 DO 150, i = 1, j - 1
346 temp = temp + cabs1( a( i, j ) ) * cabs1( x( i ) )
347 150 CONTINUE
348
349 IF( nounit ) THEN
350 temp = temp + cabs1( a( j, j ) ) * cabs1( x( j ) )
351 ELSE
352 temp = temp + cabs1( x( j ) )
353 END IF
354
355 y( jy ) = y( jy ) + talpha * temp
356 jy = jy + incy
357
358 160 CONTINUE
359
360 ELSE
361
362 DO 180, j = 1, n
363 temp = zero
364 ix = kx
365 DO 170, i = 1, j - 1
366 temp = temp + cabs1( a( i, j ) ) * cabs1( x( ix ) )
367 ix = ix + incx
368 170 CONTINUE
369
370 IF( nounit ) THEN
371 temp = temp + cabs1( a( j, j ) ) * cabs1( x( ix ) )
372 ELSE
373 temp = temp + cabs1( x( ix ) )
374 END IF
375
376 y( jy ) = y( jy ) + talpha * temp
377 jy = jy + incy
378
379 180 CONTINUE
380
381 END IF
382
383 ELSE
384
385 jy = ky
386 IF( incx.EQ.1 ) THEN
387
388 DO 200, j = 1, n
389
390 IF( nounit ) THEN
391 temp = cabs1( a( j, j ) ) * cabs1( x( j ) )
392 ELSE
393 temp = cabs1( x( j ) )
394 END IF
395
396 DO 190, i = j + 1, n
397 temp = temp + cabs1( a( i, j ) ) * cabs1( x( i ) )
398 190 CONTINUE
399
400 y( jy ) = y( jy ) + talpha * temp
401 jy = jy + incy
402
403 200 CONTINUE
404
405 ELSE
406
407 DO 220, j = 1, n
408
409 ix = kx + ( j - 1 ) * incx
410
411 IF( nounit ) THEN
412 temp = cabs1( a( j, j ) ) * cabs1( x( ix ) )
413 ELSE
414 temp = cabs1( x( ix ) )
415 END IF
416
417 DO 210, i = j + 1, n
418 ix = ix + incx
419 temp = temp + cabs1( a( i, j ) ) * cabs1( x( ix ) )
420 210 CONTINUE
421 y( jy ) = y( jy ) + talpha * temp
422 jy = jy + incy
423 220 CONTINUE
424 END IF
425 END IF
426
427 END IF
428
429 RETURN
430
431
432