3
4
5
6
7
8
9
10 CHARACTER*1 DIAG, TRANS, UPLO
11 INTEGER INCX, INCY, LDA, N
12 DOUBLE PRECISION ALPHA, BETA
13
14
15 DOUBLE PRECISION Y( * )
16 COMPLEX*16 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 DOUBLE PRECISION ONE, ZERO
122 parameter( one = 1.0d+0, zero = 0.0d+0 )
123
124
125 INTEGER I, INFO, IX, IY, J, JX, JY, KX, KY
126 LOGICAL NOUNIT
127 DOUBLE PRECISION ABSX, TALPHA, TEMP
128 COMPLEX*16 ZDUM
129
130
131 LOGICAL LSAME
133
134
135 EXTERNAL xerbla
136
137
138 INTRINSIC abs, dble, dimag,
max
139
140
141 DOUBLE PRECISION CABS1
142 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( 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( 'ZATRMV', 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