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
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279 char DiagA, TranOp, UploA, Yroc, * one, top;
280 Int Acol, Ai, Aii, Aimb1, Ainb1, Aj, Ajj, Akp, Akq, Ald, Amb,
281 Amp, Amp0, Anb, Anq, Anq0, Arow, XAfr, XAld, Xi, Xj, YAfr,
282 YAld, YApbY, YAsum, Ycol, Yi, Yii, Yj, Yjj, Yld, Ynp, Ynq,
283 Yrow, ctxt, info, ione=1, k, kb, ktmp, mycol, myrow, nb,
284 notran, nounit, npcol, nprow, size, upper, usiz;
285 float * tbeta;
287
288
289
292 char * Aptr = NULL, * XA = NULL, * YA = NULL;
293
294
295
296
303#ifndef NO_ARGCHK
304
305
306
308 if( !( info = ( ( nprow == -1 ) ? -( 801 +
CTXT_ ) : 0 ) ) )
309 {
310 if( ( !upper ) && ( UploA !=
CLOWER ) )
311 {
312 PB_Cwarn( ctxt, __LINE__,
"PSATRMV",
"Illegal UPLO = %c\n", UploA );
313 info = -1;
314 }
315 else if( ( !notran ) && ( TranOp !=
CTRAN ) && ( TranOp !=
CCOTRAN ) )
316 {
317 PB_Cwarn( ctxt, __LINE__,
"PSATRMV",
"Illegal TRANS = %c\n", TranOp );
318 info = -2;
319 }
320 else if( ( !nounit ) && ( DiagA !=
CUNIT ) )
321 {
322 PB_Cwarn( ctxt, __LINE__,
"PSATRMV",
"Illegal DIAG = %c\n", DiagA );
323 info = -3;
324 }
325 PB_Cchkmat( ctxt,
"PSATRMV",
"A", *N, 4, *N, 4, Ai, Aj, Ad, 9, &info );
326 PB_Cchkvec( ctxt,
"PSATRMV",
"X", *N, 4, Xi, Xj, Xd, *INCX, 13, &info );
327 PB_Cchkvec( ctxt,
"PSATRMV",
"Y", *N, 4, Yi, Yj, Yd, *INCY, 19, &info );
328 }
329 if( info ) {
PB_Cabort( ctxt,
"PSATRMV", info );
return; }
330#endif
331
332
333
336
337
338
339#ifdef NO_ARGCHK
341#endif
342
343
344
346 size = usiz = type->
size;
347
348
349
351 {
352
353
354
355 PB_Cinfog2l( Yi, Yj, Yd, nprow, npcol, myrow, mycol, &Yii, &Yjj,
356 &Yrow, &Ycol );
357
358 if( *INCY == Yd[
M_] )
359 {
360
361
362
363 if( ( myrow == Yrow ) || ( Yrow < 0 ) )
364 {
365
366
367
369 npcol );
370 if( Ynq > 0 )
371 {
373 sascal_( &Ynq, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
374 Yjj, Yld, usiz ), &Yld );
375 }
376 }
377 }
378 else
379 {
380
381
382
383 if( ( mycol == Ycol ) || ( Ycol < 0 ) )
384 {
385
386
387
389 nprow );
390 if( Ynp > 0 )
391 {
392 sascal_( &Ynp, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
393 Yjj, Yd[
LLD_], usiz ), INCY );
394 }
395 }
396 }
397 return;
398 }
399
400
401
402 PB_Cdescribe( *N, *N, Ai, Aj, Ad, nprow, npcol, myrow, mycol, &Aii, &Ajj,
403 &Ald, &Aimb1, &Ainb1, &Amb, &Anb, &Arow, &Acol, Ad0 );
404
406
407 if( notran )
408 {
409
410
411
413 Yi, Yj, Yd, &Yroc, ((char**)(&tbeta)), &YA, YAd, &YAfr,
414 &YAsum, &YApbY );
415
416
417
418 PB_CInV( type,
NOCONJG,
ROW, *N, *N, Ad0, 1, ((
char *) X), Xi, Xj, Xd,
419 ( *INCX == Xd[
M_] ?
ROW :
COLUMN ), &XA, XAd, &XAfr );
420 }
421 else
422 {
423
424
425
426 PB_CInOutV( utyp,
ROW, *N, *N, Ad0, 1, ((
char *) BETA), ((
char *) Y),
427 Yi, Yj, Yd, &Yroc, ((char**)(&tbeta)), &YA, YAd, &YAfr,
428 &YAsum, &YApbY );
429
430
431
432 PB_CInV( type,
NOCONJG,
COLUMN, *N, *N, Ad0, 1, ((
char *) X), Xi, Xj, Xd,
433 ( *INCX == Xd[
M_] ?
ROW :
COLUMN ), &XA, XAd, &XAfr );
434 }
435
437
438
439
440 Aimb1 = Ad0[
IMB_ ]; Ainb1 = Ad0[
INB_ ]; Amb = Ad0[
MB_]; Anb = Ad0[
NB_];
442 Amp =
PB_Cnumroc( *N, 0, Aimb1, Amb, myrow, Arow, nprow );
443 Anq =
PB_Cnumroc( *N, 0, Ainb1, Anb, mycol, Acol, npcol );
444
445 if( ( Amp > 0 ) && ( Anq > 0 ) )
446 {
447 Aptr =
Mptr( ((
char *) A), Aii, Ajj, Ald, size );
448
450
451
452
453 if( notran && !( YApbY ) )
454 {
455
456
457
458 if( ( mycol == YAd[
CSRC_] ) || ( YAd[
CSRC_] < 0 ) )
459 {
460
461
462
463 if( Amp > 0 )
464 sascal_( &Amp, ((
char *) tbeta), YA, &ione );
465 }
466 }
467 else if( !( notran ) && !( YApbY ) )
468 {
469
470
471
472 if( ( myrow == YAd[
RSRC_] ) || ( YAd[
RSRC_] < 0 ) )
473 {
474
475
476
477 if( Anq > 0 )
478 sascal_( &Anq, ((
char *) tbeta), YA, &YAld );
479 }
480 }
481
482
483
484
486 PB_Clcm( ( Arow >= 0 ? nprow : 1 ), ( Acol >= 0 ? npcol : 1 ) );
487
488 if( upper )
489 {
490 if( notran )
491 {
492 for( k = 0; k < *N; k += nb )
493 {
494 kb = *N - k; kb =
MIN( kb, nb );
495 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
496 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
497 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
498 if( Akp > 0 && Anq0 > 0 )
499 {
500 sagemv_( TRANS, &Akp, &Anq0, ((
char *) ALPHA),
501 Mptr( Aptr, 0, Akq, Ald, size ), &Ald,
502 Mptr( XA, 0, Akq, XAld, size ), &XAld, one,
503 YA, &ione );
504 }
506 ((char *) ALPHA), Aptr, k, k, Ad0,
507 Mptr( XA, 0, Akq, XAld, size ), XAld,
509 }
510 }
511 else
512 {
513 for( k = 0; k < *N; k += nb )
514 {
515 kb = *N - k; kb =
MIN( kb, nb );
516 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
517 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
518 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
519 if( Akp > 0 && Anq0 > 0 )
520 {
521 sagemv_( TRANS, &Akp, &Anq0, ((
char *) ALPHA),
522 Mptr( Aptr, 0, Akq, Ald, size ), &Ald, XA, &ione,
523 one,
Mptr( YA, 0, Akq, YAld, usiz ), &YAld );
524 }
526 ((char *) ALPHA), Aptr, k, k, Ad0,
527 Mptr( XA, Akp, 0, XAld, size ), XAld,
529 }
530 }
531 }
532 else
533 {
534 if( notran )
535 {
536 for( k = 0; k < *N; k += nb )
537 {
538 kb = *N - k; ktmp = k + ( kb =
MIN( kb, nb ) );
539 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
540 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
542 ((char *) ALPHA), Aptr, k, k, Ad0,
543 Mptr( XA, 0, Akq, XAld, size ), XAld,
545 Akp =
PB_Cnumroc( ktmp, 0, Aimb1, Amb, myrow, Arow, nprow );
546 Amp0 = Amp - Akp;
547 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
548 if( Amp0 > 0 && Anq0 > 0 )
549 {
550 sagemv_( TRANS, &Amp0, &Anq0, ((
char *) ALPHA),
551 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
552 Mptr( XA, 0, Akq, XAld, size ), &XAld, one,
553 Mptr( YA, Akp, 0, YAld, usiz ), &ione );
554 }
555 }
556 }
557 else
558 {
559 for( k = 0; k < *N; k += nb )
560 {
561 kb = *N - k; ktmp = k + ( kb =
MIN( kb, nb ) );
562 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
563 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
565 ((char *) ALPHA), Aptr, k, k, Ad0,
566 Mptr( XA, Akp, 0, XAld, size ), XAld,
568 Akp =
PB_Cnumroc( ktmp, 0, Aimb1, Amb, myrow, Arow, nprow );
569 Amp0 = Amp - Akp;
570 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
571 if( Amp0 > 0 && Anq0 > 0 )
572 {
573 sagemv_( TRANS, &Amp0, &Anq0, one,
574 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
575 Mptr( XA, Akp, 0, XAld, size ), &ione, one,
576 Mptr( YA, 0, Akq, YAld, usiz ), &YAld );
577 }
578 }
579 }
580 }
581 }
582 if( XAfr ) free( XA );
583
584 if( notran )
585 {
586
587
588
589 if( YAsum && ( Amp > 0 ) )
590 {
594 }
595 }
596 else
597 {
598
599
600
601 if( YAsum && ( Anq > 0 ) )
602 {
605 mycol );
606 }
607 }
608
609
610
611 if( YApbY )
612 {
613
614
615
616 PB_Cinfog2l( Yi, Yj, Yd, nprow, npcol, myrow, mycol, &Yii, &Yjj, &Yrow,
617 &Ycol );
618
619 if( *INCY == Yd[
M_] )
620 {
621
622
623
624 if( ( myrow == Yrow ) || ( Yrow < 0 ) )
625 {
626
627
628
630 npcol );
631 if( Ynq > 0 )
632 {
634 sascal_( &Ynq, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
635 Yjj, Yld, usiz ), &Yld );
636 }
637 }
638 }
639 else
640 {
641
642
643
644 if( ( mycol == Ycol ) || ( Ycol < 0 ) )
645 {
646
647
648
650 nprow );
651 if( Ynp > 0 )
652 {
653 sascal_( &Ynp, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
654 Yjj, Yd[
LLD_], usiz ), INCY );
655 }
656 }
657 }
658
659 if( notran )
660 {
661 PB_Cpaxpby( utyp,
NOCONJG, *N, 1, one, YA, 0, 0, YAd,
COLUMN, one,
662 ((char *) Y), Yi, Yj, Yd, &Yroc );
663 }
664 else
665 {
666 PB_Cpaxpby( utyp,
NOCONJG, 1, *N, one, YA, 0, 0, YAd,
ROW, one,
667 ((char *) Y), Yi, Yj, Yd, &Yroc );
668 }
669 }
670 if( YAfr ) free( YA );
671
672
673
674}