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
280
281
282
283 char DiagA, TranOp, UploA, Yroc, * one, top;
284 Int Acol, Ai, Aii, Aimb1, Ainb1, Aj, Ajj, Akp, Akq, Ald, Amb,
285 Amp, Amp0, Anb, Anq, Anq0, Arow, XAfr, XAld, Xi, Xj, YAfr,
286 YAld, YApbY, YAsum, Ycol, Yi, Yii, Yj, Yjj, Yld, Ynp, Ynq,
287 Yrow, ctxt, info, ione=1, k, kb, ktmp, mycol, myrow, nb,
288 notran, nounit, npcol, nprow, size, upper, usiz;
289 float * tbeta;
291
292
293
296 char * Aptr = NULL, * XA = NULL, * YA = NULL;
297
298
299
300
307#ifndef NO_ARGCHK
308
309
310
312 if( !( info = ( ( nprow == -1 ) ? -( 801 +
CTXT_ ) : 0 ) ) )
313 {
314 if( ( !upper ) && ( UploA !=
CLOWER ) )
315 {
316 PB_Cwarn( ctxt, __LINE__,
"PCATRMV",
"Illegal UPLO = %c\n", UploA );
317 info = -1;
318 }
319 else if( ( !notran ) && ( TranOp !=
CTRAN ) && ( TranOp !=
CCOTRAN ) )
320 {
321 PB_Cwarn( ctxt, __LINE__,
"PCATRMV",
"Illegal TRANS = %c\n", TranOp );
322 info = -2;
323 }
324 else if( ( !nounit ) && ( DiagA !=
CUNIT ) )
325 {
326 PB_Cwarn( ctxt, __LINE__,
"PCATRMV",
"Illegal DIAG = %c\n", DiagA );
327 info = -3;
328 }
329 PB_Cchkmat( ctxt,
"PCATRMV",
"A", *N, 4, *N, 4, Ai, Aj, Ad, 9, &info );
330 PB_Cchkvec( ctxt,
"PCATRMV",
"X", *N, 4, Xi, Xj, Xd, *INCX, 13, &info );
331 PB_Cchkvec( ctxt,
"PCATRMV",
"Y", *N, 4, Yi, Yj, Yd, *INCY, 19, &info );
332 }
333 if( info ) {
PB_Cabort( ctxt,
"PCATRMV", info );
return; }
334#endif
335
336
337
340
341
342
343#ifdef NO_ARGCHK
345#endif
346
347
348
351
352
353
355 {
356
357
358
359 PB_Cinfog2l( Yi, Yj, Yd, nprow, npcol, myrow, mycol, &Yii, &Yjj,
360 &Yrow, &Ycol );
361
362 if( *INCY == Yd[
M_] )
363 {
364
365
366
367 if( ( myrow == Yrow ) || ( Yrow < 0 ) )
368 {
369
370
371
373 npcol );
374 if( Ynq > 0 )
375 {
377 sascal_( &Ynq, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
378 Yjj, Yld, usiz ), &Yld );
379 }
380 }
381 }
382 else
383 {
384
385
386
387 if( ( mycol == Ycol ) || ( Ycol < 0 ) )
388 {
389
390
391
393 nprow );
394 if( Ynp > 0 )
395 {
396 sascal_( &Ynp, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
397 Yjj, Yd[
LLD_], usiz ), INCY );
398 }
399 }
400 }
401 return;
402 }
403
404
405
406 PB_Cdescribe( *N, *N, Ai, Aj, Ad, nprow, npcol, myrow, mycol, &Aii, &Ajj,
407 &Ald, &Aimb1, &Ainb1, &Amb, &Anb, &Arow, &Acol, Ad0 );
408
410
411 if( notran )
412 {
413
414
415
417 Yi, Yj, Yd, &Yroc, ((char**)(&tbeta)), &YA, YAd, &YAfr,
418 &YAsum, &YApbY );
419
420
421
422 PB_CInV( type,
NOCONJG,
ROW, *N, *N, Ad0, 1, ((
char *) X), Xi, Xj, Xd,
423 ( *INCX == Xd[
M_] ?
ROW :
COLUMN ), &XA, XAd, &XAfr );
424 }
425 else
426 {
427
428
429
430 PB_CInOutV( utyp,
ROW, *N, *N, Ad0, 1, ((
char *) BETA), ((
char *) Y),
431 Yi, Yj, Yd, &Yroc, ((char**)(&tbeta)), &YA, YAd, &YAfr,
432 &YAsum, &YApbY );
433
434
435
436 PB_CInV( type,
NOCONJG,
COLUMN, *N, *N, Ad0, 1, ((
char *) X), Xi, Xj, Xd,
437 ( *INCX == Xd[
M_] ?
ROW :
COLUMN ), &XA, XAd, &XAfr );
438 }
439
441
442
443
444 Aimb1 = Ad0[
IMB_ ]; Ainb1 = Ad0[
INB_ ]; Amb = Ad0[
MB_]; Anb = Ad0[
NB_];
446 Amp =
PB_Cnumroc( *N, 0, Aimb1, Amb, myrow, Arow, nprow );
447 Anq =
PB_Cnumroc( *N, 0, Ainb1, Anb, mycol, Acol, npcol );
448
449 if( ( Amp > 0 ) && ( Anq > 0 ) )
450 {
451 Aptr =
Mptr( ((
char *) A), Aii, Ajj, Ald, size );
452
454
455
456
457 if( notran && !( YApbY ) )
458 {
459
460
461
462 if( ( mycol == YAd[
CSRC_] ) || ( YAd[
CSRC_] < 0 ) )
463 {
464
465
466
467 if( Amp > 0 )
468 sascal_( &Amp, ((
char *) tbeta), YA, &ione );
469 }
470 }
471 else if( !( notran ) && !( YApbY ) )
472 {
473
474
475
476 if( ( myrow == YAd[
RSRC_] ) || ( YAd[
RSRC_] < 0 ) )
477 {
478
479
480
481 if( Anq > 0 )
482 sascal_( &Anq, ((
char *) tbeta), YA, &YAld );
483 }
484 }
485
486
487
488
490 PB_Clcm( ( Arow >= 0 ? nprow : 1 ), ( Acol >= 0 ? npcol : 1 ) );
491
492 if( upper )
493 {
494 if( notran )
495 {
496 for( k = 0; k < *N; k += nb )
497 {
498 kb = *N - k; kb =
MIN( kb, nb );
499 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
500 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
501 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
502 if( Akp > 0 && Anq0 > 0 )
503 {
504 cagemv_( TRANS, &Akp, &Anq0, ((
char *) ALPHA),
505 Mptr( Aptr, 0, Akq, Ald, size ), &Ald,
506 Mptr( XA, 0, Akq, XAld, size ), &XAld, one,
507 YA, &ione );
508 }
510 ((char *) ALPHA), Aptr, k, k, Ad0,
511 Mptr( XA, 0, Akq, XAld, size ), XAld,
513 }
514 }
515 else
516 {
517 for( k = 0; k < *N; k += nb )
518 {
519 kb = *N - k; kb =
MIN( kb, nb );
520 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
521 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
522 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
523 if( Akp > 0 && Anq0 > 0 )
524 {
525 cagemv_( TRANS, &Akp, &Anq0, ((
char *) ALPHA),
526 Mptr( Aptr, 0, Akq, Ald, size ), &Ald, XA, &ione,
527 one,
Mptr( YA, 0, Akq, YAld, usiz ), &YAld );
528 }
530 ((char *) ALPHA), Aptr, k, k, Ad0,
531 Mptr( XA, Akp, 0, XAld, size ), XAld,
533 }
534 }
535 }
536 else
537 {
538 if( notran )
539 {
540 for( k = 0; k < *N; k += nb )
541 {
542 kb = *N - k; ktmp = k + ( kb =
MIN( kb, nb ) );
543 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
544 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
546 ((char *) ALPHA), Aptr, k, k, Ad0,
547 Mptr( XA, 0, Akq, XAld, size ), XAld,
549 Akp =
PB_Cnumroc( ktmp, 0, Aimb1, Amb, myrow, Arow, nprow );
550 Amp0 = Amp - Akp;
551 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
552 if( Amp0 > 0 && Anq0 > 0 )
553 {
554 cagemv_( TRANS, &Amp0, &Anq0, ((
char *) ALPHA),
555 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
556 Mptr( XA, 0, Akq, XAld, size ), &XAld, one,
557 Mptr( YA, Akp, 0, YAld, usiz ), &ione );
558 }
559 }
560 }
561 else
562 {
563 for( k = 0; k < *N; k += nb )
564 {
565 kb = *N - k; ktmp = k + ( kb =
MIN( kb, nb ) );
566 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
567 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
569 ((char *) ALPHA), Aptr, k, k, Ad0,
570 Mptr( XA, Akp, 0, XAld, size ), XAld,
572 Akp =
PB_Cnumroc( ktmp, 0, Aimb1, Amb, myrow, Arow, nprow );
573 Amp0 = Amp - Akp;
574 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
575 if( Amp0 > 0 && Anq0 > 0 )
576 {
577 cagemv_( TRANS, &Amp0, &Anq0, one,
578 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
579 Mptr( XA, Akp, 0, XAld, size ), &ione, one,
580 Mptr( YA, 0, Akq, YAld, usiz ), &YAld );
581 }
582 }
583 }
584 }
585 }
586 if( XAfr ) free( XA );
587
588 if( notran )
589 {
590
591
592
593 if( YAsum && ( Amp > 0 ) )
594 {
598 }
599 }
600 else
601 {
602
603
604
605 if( YAsum && ( Anq > 0 ) )
606 {
609 mycol );
610 }
611 }
612
613
614
615 if( YApbY )
616 {
617
618
619
620 PB_Cinfog2l( Yi, Yj, Yd, nprow, npcol, myrow, mycol, &Yii, &Yjj, &Yrow,
621 &Ycol );
622
623 if( *INCY == Yd[
M_] )
624 {
625
626
627
628 if( ( myrow == Yrow ) || ( Yrow < 0 ) )
629 {
630
631
632
634 npcol );
635 if( Ynq > 0 )
636 {
638 sascal_( &Ynq, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
639 Yjj, Yld, usiz ), &Yld );
640 }
641 }
642 }
643 else
644 {
645
646
647
648 if( ( mycol == Ycol ) || ( Ycol < 0 ) )
649 {
650
651
652
654 nprow );
655 if( Ynp > 0 )
656 {
657 sascal_( &Ynp, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
658 Yjj, Yd[
LLD_], usiz ), INCY );
659 }
660 }
661 }
662
663 if( notran )
664 {
665 PB_Cpaxpby( utyp,
NOCONJG, *N, 1, one, YA, 0, 0, YAd,
COLUMN, one,
666 ((char *) Y), Yi, Yj, Yd, &Yroc );
667 }
668 else
669 {
670 PB_Cpaxpby( utyp,
NOCONJG, 1, *N, one, YA, 0, 0, YAd,
ROW, one,
671 ((char *) Y), Yi, Yj, Yd, &Yroc );
672 }
673 }
674 if( YAfr ) free( YA );
675
676
677
678}