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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221 char DiagA, TranOp, UploA, Xroc, * one, * tbeta, top, *zero;
222 Int Acol, Ai, Aii, Aimb1, Ainb1, Aj, Ajj, Akp, Akq, Ald, Amb,
223 Amp, Amp0, Anb, Anq, Anq0, Arow, XAfr, XAld, Xcol, Xi, Xii,
224 Xj, Xjj, Xld, Xnp, Xnq, Xrow, YAfr, YAld, YApbY, YAsum,
225 ctxt, info, ione=1, k, kb, ktmp, mycol, myrow, nb, notran,
226 nounit, npcol, nprow, size, upper;
228
229
230
232 char * Aptr = NULL, * XA = NULL, * YA = NULL;
233
234
235
236
242#ifndef NO_ARGCHK
243
244
245
247 if( !( info = ( ( nprow == -1 ) ? -( 801 +
CTXT_ ) : 0 ) ) )
248 {
249 if( ( !upper ) && ( UploA !=
CLOWER ) )
250 {
251 PB_Cwarn( ctxt, __LINE__,
"PSTRMV",
"Illegal UPLO = %c\n", UploA );
252 info = -1;
253 }
254 else if( ( !notran ) && ( TranOp !=
CTRAN ) && ( TranOp !=
CCOTRAN ) )
255 {
256 PB_Cwarn( ctxt, __LINE__,
"PSTRMV",
"Illegal TRANS = %c\n", TranOp );
257 info = -2;
258 }
259 else if( ( !nounit ) && ( DiagA !=
CUNIT ) )
260 {
261 PB_Cwarn( ctxt, __LINE__,
"PSTRMV",
"Illegal DIAG = %c\n", DiagA );
262 info = -3;
263 }
264 PB_Cchkmat( ctxt,
"PSTRMV",
"A", *N, 4, *N, 4, Ai, Aj, Ad, 8, &info );
265 PB_Cchkvec( ctxt,
"PSTRMV",
"X", *N, 4, Xi, Xj, Xd, *INCX, 12, &info );
266 }
267 if( info ) {
PB_Cabort( ctxt,
"PSTRMV", info );
return; }
268#endif
269
270
271
272 if( *N == 0 ) return;
273
274
275
276#ifdef NO_ARGCHK
278#endif
279
280
281
283 size = type->
size; one = type->
one; zero = type->
zero;
284
285
286
287 PB_Cdescribe( *N, *N, Ai, Aj, Ad, nprow, npcol, myrow, mycol, &Aii, &Ajj,
288 &Ald, &Aimb1, &Ainb1, &Amb, &Anb, &Arow, &Acol, Ad0 );
289
291
292 if( notran )
293 {
294
295
296
297 PB_CInV( type,
NOCONJG,
ROW, *N, *N, Ad0, 1, ((
char *) X), Xi, Xj, Xd,
298 &Xroc, &XA, XAd, &XAfr );
299
300
301
302 PB_CInOutV( type,
COLUMN, *N, *N, Ad0, 1, one, ((
char *) X), Xi, Xj, Xd,
303 &Xroc, &tbeta, &YA, YAd, &YAfr, &YAsum, &YApbY );
304
305
306
308 {
309
310
311
312 PB_Cinfog2l( Xi, Xj, Xd, nprow, npcol, myrow, mycol, &Xii, &Xjj, &Xrow,
313 &Xcol );
314
315
316
317 if( ( mycol == Xcol ) || ( Xcol < 0 ) )
318 {
319
320
321
323 nprow );
324 if( Xnp > 0 )
325 {
327 size ), &ione );
328 }
329 }
330 }
331 }
332 else
333 {
334
335
336
337 PB_CInV( type,
NOCONJG,
COLUMN, *N, *N, Ad0, 1, ((
char *) X), Xi, Xj, Xd,
338 &Xroc, &XA, XAd, &XAfr );
339
340
341
342 PB_CInOutV( type,
ROW, *N, *N, Ad0, 1, one, ((
char *) X), Xi, Xj, Xd,
343 &Xroc, &tbeta, &YA, YAd, &YAfr, &YAsum, &YApbY );
344
345
346
348 {
349
350
351
352 PB_Cinfog2l( Xi, Xj, Xd, nprow, npcol, myrow, mycol, &Xii, &Xjj, &Xrow,
353 &Xcol );
354
355
356
357 if( ( myrow == Xrow ) || ( Xrow < 0 ) )
358 {
359
360
361
363 npcol );
364 if( Xnq > 0 )
365 {
367 sset_( &Xnq, zero,
Mptr( ((
char *) X), Xii, Xjj, Xld,
368 size ), &Xld );
369 }
370 }
371 }
372 }
373
374
375
376 Aimb1 = Ad0[
IMB_ ]; Ainb1 = Ad0[
INB_ ]; Amb = Ad0[
MB_]; Anb = Ad0[
NB_];
378 Amp =
PB_Cnumroc( *N, 0, Aimb1, Amb, myrow, Arow, nprow );
379 Anq =
PB_Cnumroc( *N, 0, Ainb1, Anb, mycol, Acol, npcol );
380
381 if( ( Amp > 0 ) && ( Anq > 0 ) )
382 {
383 Aptr =
Mptr( ((
char *) A), Aii, Ajj, Ald, size );
384
386
387
388
389
391 PB_Clcm( ( Arow >= 0 ? nprow : 1 ), ( Acol >= 0 ? npcol : 1 ) );
392
393 if( upper )
394 {
395 if( notran )
396 {
397 for( k = 0; k < *N; k += nb )
398 {
399 kb = *N - k; kb =
MIN( kb, nb );
400 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
401 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
402 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
403 if( Akp > 0 && Anq0 > 0 )
404 {
405 sgemv_( TRANS, &Akp, &Anq0, one,
Mptr( Aptr, 0, Akq, Ald,
406 size ), &Ald,
Mptr( XA, 0, Akq, XAld, size ),
407 &XAld, one, YA, &ione );
408 }
410 Aptr, k, k, Ad0,
Mptr( XA, 0, Akq, XAld, size ), XAld,
412 }
413 }
414 else
415 {
416 for( k = 0; k < *N; k += nb )
417 {
418 kb = *N - k; kb =
MIN( kb, nb );
419 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
420 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
421 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
422 if( Akp > 0 && Anq0 > 0 )
423 {
424 sgemv_( TRANS, &Akp, &Anq0, one,
Mptr( Aptr, 0, Akq, Ald,
425 size ), &Ald, XA, &ione, one,
Mptr( YA, 0, Akq, YAld,
426 size ), &YAld );
427 }
429 Aptr, k, k, Ad0,
Mptr( XA, Akp, 0, XAld, size ), XAld,
431 }
432 }
433 }
434 else
435 {
436 if( notran )
437 {
438 for( k = 0; k < *N; k += nb )
439 {
440 kb = *N - k; ktmp = k + ( kb =
MIN( kb, nb ) );
441 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
442 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
444 Aptr, k, k, Ad0,
Mptr( XA, 0, Akq, XAld, size ), XAld,
446 Akp =
PB_Cnumroc( ktmp, 0, Aimb1, Amb, myrow, Arow, nprow );
447 Amp0 = Amp - Akp;
448 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
449 if( Amp0 > 0 && Anq0 > 0 )
450 {
451 sgemv_( TRANS, &Amp0, &Anq0, one,
452 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
453 Mptr( XA, 0, Akq, XAld, size ), &XAld, one,
454 Mptr( YA, Akp, 0, YAld, size ), &ione );
455 }
456 }
457 }
458 else
459 {
460 for( k = 0; k < *N; k += nb )
461 {
462 kb = *N - k; ktmp = k + ( kb =
MIN( kb, nb ) );
463 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
464 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
466 Aptr, k, k, Ad0,
Mptr( XA, Akp, 0, XAld, size ), XAld,
468 Akp =
PB_Cnumroc( ktmp, 0, Aimb1, Amb, myrow, Arow, nprow );
469 Amp0 = Amp - Akp;
470 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
471 if( Amp0 > 0 && Anq0 > 0 )
472 {
473 sgemv_( TRANS, &Amp0, &Anq0, one,
474 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
475 Mptr( XA, Akp, 0, XAld, size ), &ione, one,
476 Mptr( YA, 0, Akq, YAld, size ), &YAld );
477 }
478 }
479 }
480 }
481 }
482 if( XAfr ) free( XA );
483
484 if( notran )
485 {
486
487
488
489 if( YAsum && ( Amp > 0 ) )
490 {
494 }
495
496
497
498 if( YApbY )
499 {
500 PB_Cpaxpby( type,
NOCONJG, *N, 1, one, YA, 0, 0, YAd,
COLUMN, zero,
501 ((char *) X), Xi, Xj, Xd, &Xroc );
502 }
503 }
504 else
505 {
506
507
508
509 if( YAsum && ( Anq > 0 ) )
510 {
513 mycol );
514 }
515
516
517
518 if( YApbY )
519 {
520 PB_Cpaxpby( type,
NOCONJG, 1, *N, one, YA, 0, 0, YAd,
ROW, zero,
521 ((char *) X), Xi, Xj, Xd, &Xroc );
522 }
523 }
524 if( YAfr ) free( YA );
525
526
527
528}