3
4
5
6
7
8
9 CHARACTER*1 MODE
10 INTEGER ICONTXT, LDA, LDB, M, N
11 DOUBLE PRECISION ALPHA, BETA
12
13
14 DOUBLE PRECISION A( LDA, * ), B( LDB, * )
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
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 DOUBLE PRECISION ZERO, ONE
90 parameter( zero = 0.0d+0, one = 1.0d+0)
91
92
93 INTEGER I, J
94
95
96 LOGICAL LSAME
98
99
101
102
104
105
106
107 IF( m.LE.0 .OR. n.LE.0 .OR. (
alpha.EQ.zero.AND.beta.EQ.one ) )
108 $ RETURN
109
110
111
112 IF(
lsame( mode,
'U' ) )
THEN
113 IF(
alpha.EQ.zero )
THEN
114 IF( beta.EQ.zero ) THEN
115 DO 20 j = 1, n
116 DO 10 i = 1,
min( j, m )
117 b( i, j ) = zero
118 10 CONTINUE
119 20 CONTINUE
120 ELSE
121 DO 40 j = 1, n
122 DO 30 i = 1,
min( j, m )
123 b( i, j ) = beta * b( i, j )
124 30 CONTINUE
125 40 CONTINUE
126 END IF
127
128 ELSE IF(
alpha.EQ.one )
THEN
129 IF( beta.EQ.zero ) THEN
130 DO 60 j = 1, n
131 DO 50 i = 1,
min( j, m )
132 b( i, j ) = a( i, j )
133 50 CONTINUE
134 60 CONTINUE
135 ELSE IF( beta.EQ.one ) THEN
136 DO 80 j = 1, n
137 DO 70 i = 1,
min( j, m )
138 b( i, j ) = a( i, j ) + b( i, j )
139 70 CONTINUE
140 80 CONTINUE
141 ELSE
142 DO 100 j = 1, n
143 DO 90 i = 1,
min( j, m )
144 b( i, j ) = a( i, j ) + beta * b( i, j )
145 90 CONTINUE
146 100 CONTINUE
147 END IF
148
149 ELSE
150 IF( beta.EQ.zero ) THEN
151 DO 120 j = 1, n
152 DO 110 i = 1,
min( j, m )
153 b( i, j ) =
alpha * a( i, j )
154 110 CONTINUE
155 120 CONTINUE
156 ELSE IF( beta.EQ.one ) THEN
157 DO 140 j = 1, n
158 DO 130 i = 1,
min( j, m )
159 b( i, j ) =
alpha * a( i, j ) + b( i, j )
160 130 CONTINUE
161 140 CONTINUE
162 ELSE
163 DO 160 j = 1, n
164 DO 150 i = 1,
min( j, m )
165 b( i, j ) =
alpha * a( i, j ) + beta * b( i, j )
166 150 CONTINUE
167 160 CONTINUE
168 END IF
169 END IF
170
171
172
173 ELSE IF(
lsame( mode,
'L' ) )
THEN
174 IF(
alpha.EQ.zero )
THEN
175 IF( beta.EQ.zero ) THEN
176 DO 180 j = 1, n
177 DO 170 i = j, m
178 b( i, j ) = zero
179 170 CONTINUE
180 180 CONTINUE
181 ELSE
182 DO 200 j = 1, n
183 DO 190 i = j, m
184 b( i, j ) = beta * b( i, j )
185 190 CONTINUE
186 200 CONTINUE
187 END IF
188
189 ELSE IF(
alpha.EQ.one )
THEN
190 IF( beta.EQ.zero ) THEN
191 DO 220 j = 1, n
192 DO 210 i = j, m
193 b( i, j ) = a( i, j )
194 210 CONTINUE
195 220 CONTINUE
196 ELSE IF( beta.EQ.one ) THEN
197 DO 240 j = 1, n
198 DO 230 i = j, m
199 b( i, j ) = a( i, j ) + b( i, j )
200 230 CONTINUE
201 240 CONTINUE
202 ELSE
203 DO 260 j = 1, n
204 DO 250 i = j, m
205 b( i, j ) = a( i, j ) + beta * b( i, j )
206 250 CONTINUE
207 260 CONTINUE
208 END IF
209
210 ELSE
211 IF( beta.EQ.zero ) THEN
212 DO 280 j = 1, n
213 DO 270 i = j, m
214 b( i, j ) =
alpha * a( i, j )
215 270 CONTINUE
216 280 CONTINUE
217 ELSE IF( beta.EQ.one ) THEN
218 DO 300 j = 1, n
219 DO 290 i = j, m
220 b( i, j ) =
alpha * a( i, j ) + b( i, j )
221 290 CONTINUE
222 300 CONTINUE
223 ELSE
224 DO 320 j = 1, n
225 DO 310 i = j, m
226 b( i, j ) =
alpha * a( i, j ) + beta * b( i, j )
227 310 CONTINUE
228 320 CONTINUE
229 END IF
230 END IF
231
232
233
234 ELSE IF(
lsame( mode,
'T' ) .OR.
lsame( mode,
'C' ) )
THEN
235 IF(
alpha.EQ.zero )
THEN
236 IF( beta.EQ.zero ) THEN
237 DO 340 j = 1, n
238 DO 330 i = 1, m
239 b( i, j ) = zero
240 330 CONTINUE
241 340 CONTINUE
242 ELSE
243 DO 360 j = 1, n
244 DO 350 i = 1, m
245 b( i, j ) = beta * b( i, j )
246 350 CONTINUE
247 360 CONTINUE
248 END IF
249
250 ELSE IF(
alpha.EQ.one )
THEN
251 IF( beta.EQ.zero ) THEN
252 DO 380 j = 1, n
253 DO 370 i = 1, m
254 b( i, j ) = a( j, i )
255 370 CONTINUE
256 380 CONTINUE
257 ELSE IF( beta.EQ.one ) THEN
258 DO 400 j = 1, n
259 DO 390 i = 1, m
260 b( i, j ) = a( j, i ) + b( i, j )
261 390 CONTINUE
262 400 CONTINUE
263 ELSE
264 DO 420 j = 1, n
265 DO 410 i = 1, m
266 b( i, j ) = a( j, i ) + beta * b( i, j )
267 410 CONTINUE
268 420 CONTINUE
269 END IF
270
271 ELSE
272 IF( beta.EQ.zero ) THEN
273 DO 440 j = 1, n
274 DO 430 i = 1, m
275 b( i, j ) =
alpha * a( j, i )
276 430 CONTINUE
277 440 CONTINUE
278 ELSE IF( beta.EQ.one ) THEN
279 DO 460 j = 1, n
280 DO 450 i = 1, m
281 b( i, j ) =
alpha * a( j, i ) + b( i, j )
282 450 CONTINUE
283 460 CONTINUE
284 ELSE
285 DO 480 j = 1, n
286 DO 470 i = 1, m
287 b( i, j ) =
alpha * a( j, i ) + beta * b( i, j )
288 470 CONTINUE
289 480 CONTINUE
290 END IF
291 END IF
292
293
294
295 ELSE
296 IF(
alpha.EQ.zero )
THEN
297 IF( beta.EQ.zero ) THEN
298 DO 500 j = 1, n
299 DO 490 i = 1, m
300 b( i, j ) = zero
301 490 CONTINUE
302 500 CONTINUE
303
304 ELSE
305 IF( m.EQ.ldb ) THEN
306 CALL dscal( m*n, beta, b( 1, 1 ), 1 )
307 ELSE IF(
lsame( mode,
'V' ) )
THEN
308 DO 510 j = 1, n
309 CALL dscal( m, beta, b( 1, j ), 1 )
310 510 CONTINUE
311 ELSE
312 DO 530 j = 1, n
313 DO 520 i = 1, m
314 b( i, j ) = beta * b( i, j )
315 520 CONTINUE
316 530 CONTINUE
317 END IF
318 END IF
319
320 ELSE IF(
alpha.EQ.one )
THEN
321 IF( beta.EQ.zero ) THEN
322 IF( m.EQ.lda .AND. m.EQ.ldb ) THEN
323 CALL dcopy( m*n, a( 1, 1 ), 1, b( 1, 1 ), 1 )
324 ELSE IF(
lsame( mode,
'V' ) )
THEN
325 DO 540 j = 1, n
326 CALL dcopy( m, a( 1, j ), 1, b( 1, j ), 1 )
327 540 CONTINUE
328 ELSE
329 DO 560 j = 1, n
330 DO 550 i = 1, m
331 b( i, j ) = a( i, j )
332 550 CONTINUE
333 560 CONTINUE
334 END IF
335
336 ELSE IF( beta.EQ.one ) THEN
337 DO 580 j = 1, n
338 DO 570 i = 1, m
339 b( i, j ) = a( i, j ) + b( i, j )
340 570 CONTINUE
341 580 CONTINUE
342
343 ELSE
344 DO 600 j = 1, n
345 DO 590 i = 1, m
346 b( i, j ) = a( i, j ) + beta * b( i, j )
347 590 CONTINUE
348 600 CONTINUE
349 END IF
350
351 ELSE
352 IF( beta.EQ.zero ) THEN
353 DO 620 j = 1, n
354 DO 610 i = 1, m
355 b( i, j ) =
alpha * a( i, j )
356 610 CONTINUE
357 620 CONTINUE
358
359 ELSE IF( beta.EQ.one ) THEN
360 IF( m.EQ.lda .AND. m.EQ.ldb ) THEN
361 CALL daxpy( m*n,
alpha, a( 1, 1 ), 1, b( 1, 1 ), 1 )
362 ELSE IF(
lsame( mode,
'V' ) )
THEN
363 DO 630 j = 1, n
364 CALL daxpy( m,
alpha, a( 1, j ), 1, b( 1, j ), 1 )
365 630 CONTINUE
366 ELSE
367 DO 650 j = 1, n
368 DO 640 i = 1, m
369 b( i, j ) =
alpha * a( i, j ) + b( i, j )
370 640 CONTINUE
371 650 CONTINUE
372 END IF
373
374 ELSE
375 DO 670 j = 1, n
376 DO 660 i = 1, m
377 b( i, j ) =
alpha * a( i, j ) + beta * b( i, j )
378 660 CONTINUE
379 670 CONTINUE
380 END IF
381 END IF
382 END IF
383
384 RETURN
385
386
387
logical function lsame(ca, cb)
LSAME
subroutine dscal(n, da, dx, incx)
DSCAL
subroutine daxpy(n, da, dx, incx, dy, incy)
DAXPY
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY