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
222
223
224
225
226
227 char DiagA, TranOp, UploA, Xroc, btop, ctop, * negone, * one,
228 * zero;
229 Int Acol, Ai, Aii, Aimb1, Ainb1, Aj, Ajj, Akp, Akq, Ald, Amb, Anb,
230 Anp, Anp0, Anq, Anq0, Arow, Asrc, XACapbX, XACfr, XACld,
231 XACsum, XARapbX, XARfr, XARld, XARsum, Xi, Xj, ctxt, info,
232 ione=1, k, kb, kbnext, kbprev, ktmp, mycol, myrow, nb, notran,
233 nounit, npcol, nprow, size, upper;
235
236
237
239 char * Aptr = NULL, * XAC = NULL, * XAR = NULL;
240
241
242
243
249#ifndef NO_ARGCHK
250
251
252
254 if( !( info = ( ( nprow == -1 ) ? -( 801 +
CTXT_ ) : 0 ) ) )
255 {
256 if( ( !upper ) && ( UploA !=
CLOWER ) )
257 {
258 PB_Cwarn( ctxt, __LINE__,
"PCTRSV",
"Illegal UPLO = %c\n", UploA );
259 info = -1;
260 }
261 else if( ( !notran ) && ( TranOp !=
CTRAN ) && ( TranOp !=
CCOTRAN ) )
262 {
263 PB_Cwarn( ctxt, __LINE__,
"PCTRSV",
"Illegal TRANS = %c\n", TranOp );
264 info = -2;
265 }
266 else if( ( !nounit ) && ( DiagA !=
CUNIT ) )
267 {
268 PB_Cwarn( ctxt, __LINE__,
"PCTRSV",
"Illegal DIAG = %c\n", DiagA );
269 info = -3;
270 }
271 PB_Cchkmat( ctxt,
"PCTRSV",
"A", *N, 4, *N, 4, Ai, Aj, Ad, 8, &info );
272 PB_Cchkvec( ctxt,
"PCTRSV",
"X", *N, 4, Xi, Xj, Xd, *INCX, 12, &info );
273 }
274 if( info ) {
PB_Cabort( ctxt,
"PCTRSV", info );
return; }
275#endif
276
277
278
279 if( *N == 0 ) return;
280
281
282
283#ifdef NO_ARGCHK
285#endif
286
287
288
291
292
293
294 PB_Cdescribe( *N, *N, Ai, Aj, Ad, nprow, npcol, myrow, mycol, &Aii, &Ajj,
295 &Ald, &Aimb1, &Ainb1, &Amb, &Anb, &Arow, &Acol, Ad0 );
296
297
298
299
301 PB_Clcm( ( Arow >= 0 ? nprow : 1 ), ( Acol >= 0 ? npcol : 1 ) );
302
304
305 if( notran )
306 {
307 if( upper )
308 {
309
310
311
316
317
318
320
321
322
323
325 ((char *) X), Xi, Xj, Xd, &Xroc, &XAC, XACd,
326 &XACfr, &XACsum, &XACapbX );
327
328
329
330 PB_COutV( type,
ROW,
INIT, *N, *N, Ad0, 1, &XAR, XARd, &XARfr,
331 &XARsum );
332
333
334
335 Aimb1 = Ad0[
IMB_ ]; Ainb1 = Ad0[
INB_ ];
336 Amb = Ad0[
MB_ ]; Anb = Ad0[
NB_ ];
338 Anp =
PB_Cnumroc( *N, 0, Aimb1, Amb, myrow, Arow, nprow );
339 Anq =
PB_Cnumroc( *N, 0, Ainb1, Anb, mycol, Acol, npcol );
340 if( ( Anp > 0 ) && ( Anq > 0 ) )
341 Aptr =
Mptr( ((
char *) A), Aii, Ajj, Ald, size );
342
343 XACld = XACd[
LLD_]; XARld = XARd[
LLD_];
344
345 for( k = ( ( *N - 1 ) / nb ) * nb; k >= 0; k -= nb )
346 {
347 ktmp = *N - k; kb =
MIN( ktmp, nb );
348
349
350
351
352 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
353 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
354 PB_Cptrsv( type, XARsum, &UploA, &TranOp, &DiagA, kb, Aptr, k, k,
355 Ad0,
Mptr( XAC, Akp, 0, XACld, size ), 1,
Mptr( XAR, 0,
356 Akq, XARld, size ), XARld );
357
358
359
360
361
362 if( Akp > 0 )
363 {
364 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
365 if( XACsum )
366 {
367 kbprev =
MIN( k, nb );
368 ktmp =
PB_Cnumroc( kbprev, k-kbprev, Aimb1, Amb, myrow,
369 Arow, nprow );
370 Akp -= ktmp;
371
372 if( ktmp > 0 )
373 {
374 if( Anq0 > 0 )
375 cgemv_( TRANS, &ktmp, &Anq0, negone,
376 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
377 Mptr( XAR, 0, Akq, XARld, size ), &XARld, one,
378 Mptr( XAC, Akp, 0, XACld, size ), &ione );
379 Asrc =
PB_Cindxg2p( k-1, Ainb1, Anb, Acol, Acol, npcol );
381 0, XACld, size ), XACld, myrow, Asrc );
382 if( mycol != Asrc )
383 cset_( &ktmp, zero,
Mptr( XAC, Akp, 0, XACld,
384 size ), &ione );
385 }
386 if( Akp > 0 && Anq0 > 0 )
387 cgemv_( TRANS, &Akp, &Anq0, negone,
388 Mptr( Aptr, 0, Akq, Ald, size ), &Ald,
389 Mptr( XAR, 0, Akq, XARld, size ), &XARld, one,
390 XAC, &ione );
391 }
392 else
393 {
394 if( Anq0 > 0 )
395 cgemv_( TRANS, &Akp, &Anq0, negone,
396 Mptr( Aptr, 0, Akq, Ald, size ), &Ald,
397 Mptr( XAR, 0, Akq, XARld, size ), &XARld, one,
398 XAC, &ione );
399 }
400 }
401 }
402
403
404
405 if( XACsum && ( Anp > 0 ) )
406 {
407 Ccgsum2d( ctxt,
ROW, &ctop, Anp, 1, XAC, XACld, myrow,
409 }
410
411
412
413 if( XACapbX )
414 {
415 PB_Cpaxpby( type,
NOCONJG, *N, 1, one, XAC, 0, 0, XACd,
COLUMN,
416 zero, ((char *) X), Xi, Xj, Xd, &Xroc );
417 }
418
419
420
423 }
424 else
425 {
426
427
428
433
434
435
437
438
439
440
442 ((char *) X), Xi, Xj, Xd, &Xroc, &XAC, XACd,
443 &XACfr, &XACsum, &XACapbX );
444
445
446
447 PB_COutV( type,
ROW,
INIT, *N, *N, Ad0, 1, &XAR, XARd, &XARfr,
448 &XARsum );
449
450
451
452 Aimb1 = Ad0[
IMB_ ]; Ainb1 = Ad0[
INB_ ];
453 Amb = Ad0[
MB_ ]; Anb = Ad0[
NB_ ];
455 Anp =
PB_Cnumroc( *N, 0, Aimb1, Amb, myrow, Arow, nprow );
456 Anq =
PB_Cnumroc( *N, 0, Ainb1, Anb, mycol, Acol, npcol );
457 if( ( Anp > 0 ) && ( Anq > 0 ) )
458 Aptr =
Mptr( ((
char *) A), Aii, Ajj, Ald, size );
459
460 XACld = XACd[
LLD_]; XARld = XARd[
LLD_];
461
462 for( k = 0; k < *N; k += nb )
463 {
464 ktmp = *N - k; kb =
MIN( ktmp, nb );
465
466
467
468
469 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
470 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
471 PB_Cptrsv( type, XARsum, &UploA, &TranOp, &DiagA, kb, Aptr, k, k,
472 Ad0,
Mptr( XAC, Akp, 0, XACld, size ), 1,
Mptr( XAR, 0,
473 Akq, XARld, size ), XARld );
474
475
476
477
478
479 Akp =
PB_Cnumroc( k+kb, 0, Aimb1, Amb, myrow, Arow, nprow );
480 if( ( Anp0 = Anp - Akp ) > 0 )
481 {
482 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
483 if( XACsum )
484 {
485 kbnext = ktmp - kb; kbnext =
MIN( kbnext, nb );
486 ktmp =
PB_Cnumroc( kbnext, k+kb, Aimb1, Amb, myrow, Arow,
487 nprow );
488 Anp0 -= ktmp;
489
490 if( ktmp > 0 )
491 {
492 if( Anq0 > 0 )
493 cgemv_( TRANS, &ktmp, &Anq0, negone,
494 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
495 Mptr( XAR, 0, Akq, XARld, size ), &XARld, one,
496 Mptr( XAC, Akp, 0, XACld, size ), &ione );
497 Asrc =
PB_Cindxg2p( k+kb, Ainb1, Anb, Acol, Acol, npcol );
499 0, XACld, size ), XACld, myrow, Asrc );
500 if( mycol != Asrc )
501 cset_( &ktmp, zero,
Mptr( XAC, Akp, 0, XACld,
502 size ), &ione );
503 }
504 if( Anp0 > 0 && Anq0 > 0 )
505 cgemv_( TRANS, &Anp0, &Anq0, negone,
506 Mptr( Aptr, Akp+ktmp, Akq, Ald, size ), &Ald,
507 Mptr( XAR, 0, Akq, XARld, size ), &XARld,
508 one,
509 Mptr( XAC, Akp+ktmp, 0, XACld, size ), &ione );
510 }
511 else
512 {
513 if( Anq0 > 0 )
514 cgemv_( TRANS, &Anp0, &Anq0, negone,
515 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
516 Mptr( XAR, 0, Akq, XARld, size ), &XARld,
517 one,
518 Mptr( XAC, Akp, 0, XACld, size ), &ione );
519 }
520 }
521 }
522
523
524
525 if( XACsum && ( Anp > 0 ) )
526 {
527 Ccgsum2d( ctxt,
ROW, &ctop, Anp, 1, XAC, XACld, myrow,
529 }
530
531
532
533 if( XACapbX )
534 {
536 COLUMN, zero, ((
char *) X), Xi, Xj, Xd, &Xroc );
537 }
538
539
540
543 }
544 }
545 else
546 {
547 if( upper )
548 {
549
550
551
556
557
558
560
561
562
563
565 ((char *) X), Xi, Xj, Xd, &Xroc, &XAR, XARd,
566 &XARfr, &XARsum, &XARapbX );
567
568
569
570 PB_COutV( type,
COLUMN,
INIT, *N, *N, Ad0, 1, &XAC, XACd, &XACfr,
571 &XACsum );
572
573
574
575 Aimb1 = Ad0[
IMB_ ]; Ainb1 = Ad0[
INB_ ];
576 Amb = Ad0[
MB_ ]; Anb = Ad0[
NB_ ];
578 Anp =
PB_Cnumroc( *N, 0, Aimb1, Amb, myrow, Arow, nprow );
579 Anq =
PB_Cnumroc( *N, 0, Ainb1, Anb, mycol, Acol, npcol );
580 if( ( Anp > 0 ) && ( Anq > 0 ) )
581 Aptr =
Mptr( ((
char *) A), Aii, Ajj, Ald, size );
582
583 XACld = XACd[
LLD_]; XARld = XARd[
LLD_];
584
585 for( k = 0; k < *N; k += nb )
586 {
587 ktmp = *N - k; kb =
MIN( ktmp, nb );
588
589
590
591
592 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
593 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
594 PB_Cptrsv( type, XACsum, &UploA, &TranOp, &DiagA, kb, Aptr, k, k,
595 Ad0,
Mptr( XAC, Akp, 0, XACld, size ), 1,
Mptr( XAR, 0,
596 Akq, XARld, size ), XARld );
597
598
599
600
601
602 Akq =
PB_Cnumroc( k+kb, 0, Ainb1, Anb, mycol, Acol, npcol );
603 if( ( Anq0 = Anq - Akq ) > 0 )
604 {
605 Anp0 =
PB_Cnumroc( kb, k, Aimb1, Amb, myrow, Arow, nprow );
606 if( XARsum )
607 {
608 kbnext = ktmp - kb; kbnext =
MIN( kbnext, nb );
609 ktmp =
PB_Cnumroc( kbnext, k+kb, Ainb1, Anb, mycol, Acol,
610 npcol );
611 Anq0 -= ktmp;
612
613 if( ktmp > 0 )
614 {
615 if( Anp0 > 0 )
616 cgemv_( TRANS, &Anp0, &ktmp, negone,
617 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
618 Mptr( XAC, Akp, 0, XACld, size ), &ione, one,
619 Mptr( XAR, 0, Akq, XARld, size ), &XARld );
620 Asrc =
PB_Cindxg2p( k+kb, Aimb1, Amb, Arow, Arow, nprow );
622 Akq, XARld, size ), XARld, Asrc, mycol );
623 if( myrow != Asrc )
624 cset_( &ktmp, zero,
Mptr( XAR, 0, Akq, XARld,
625 size ), &XARld );
626 }
627 if( Anp0 > 0 && Anq0 > 0 )
628 cgemv_( TRANS, &Anp0, &Anq0, negone,
629 Mptr( Aptr, Akp, Akq+ktmp, Ald, size ), &Ald,
630 Mptr( XAC, Akp, 0, XACld, size ), &ione, one,
631 Mptr( XAR, 0, Akq+ktmp, XARld, size ), &XARld );
632 }
633 else
634 {
635 if( Anp0 > 0 )
636 cgemv_( TRANS, &Anp0, &Anq0, negone,
637 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
638 Mptr( XAC, Akp, 0, XACld, size ), &ione, one,
639 Mptr( XAR, 0, Akq, XARld, size ), &XARld );
640 }
641 }
642 }
643
644
645
646 if( XARsum && ( Anq > 0 ) )
647 {
649 mycol );
650 }
651
652
653
654 if( XARapbX )
655 {
656 PB_Cpaxpby( type,
NOCONJG, 1, *N, one, XAR, 0, 0, XARd,
ROW, zero,
657 ((char *) X), Xi, Xj, Xd, &Xroc );
658 }
659
660
661
664 }
665 else
666 {
667
668
669
674
675
676
678
679
680
681
683 ((char *) X), Xi, Xj, Xd, &Xroc, &XAR, XARd,
684 &XARfr, &XARsum, &XARapbX );
685
686
687
688 PB_COutV( type,
COLUMN,
INIT, *N, *N, Ad0, 1, &XAC, XACd, &XACfr,
689 &XACsum );
690
691
692
693 Aimb1 = Ad0[
IMB_ ]; Ainb1 = Ad0[
INB_ ];
694 Amb = Ad0[
MB_ ]; Anb = Ad0[
NB_ ];
696 Anp =
PB_Cnumroc( *N, 0, Aimb1, Amb, myrow, Arow, nprow );
697 Anq =
PB_Cnumroc( *N, 0, Ainb1, Anb, mycol, Acol, npcol );
698 if( ( Anp > 0 ) && ( Anq > 0 ) )
699 Aptr =
Mptr( ((
char *) A), Aii, Ajj, Ald, size );
700
701 XACld = XACd[
LLD_]; XARld = XARd[
LLD_];
702
703 for( k = ( ( *N - 1 ) / nb ) * nb; k >= 0; k -= nb )
704 {
705 ktmp = *N - k; kb =
MIN( ktmp, nb );
706
707
708
709
710 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
711 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
712 PB_Cptrsv( type, XACsum, &UploA, &TranOp, &DiagA, kb, Aptr, k, k,
713 Ad0,
Mptr( XAC, Akp, 0, XACld, size ), 1,
Mptr( XAR, 0,
714 Akq, XARld, size ), XARld );
715
716
717
718
719
720 if( Akq > 0 )
721 {
722 Anp0 =
PB_Cnumroc( kb, k, Aimb1, Amb, myrow, Arow, nprow );
723 if( XARsum )
724 {
725 kbprev =
MIN( k, nb );
726 ktmp =
PB_Cnumroc( kbprev, k-kbprev, Ainb1, Anb, mycol,
727 Acol, npcol );
728 Akq -= ktmp;
729
730 if( ktmp > 0 )
731 {
732 if( Anp0 > 0 )
733 cgemv_( TRANS, &Anp0, &ktmp, negone,
734 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
735 Mptr( XAC, Akp, 0, XACld, size ), &ione, one,
736 Mptr( XAR, 0, Akq, XARld, size ), &XARld );
737 Asrc =
PB_Cindxg2p( k-1, Aimb1, Amb, Arow, Arow, nprow );
739 Akq, XARld, size ), XARld, Asrc, mycol );
740 if( myrow != Asrc )
741 cset_( &ktmp, zero,
Mptr( XAR, 0, Akq, XARld,
742 size ), &XARld );
743 }
744 if( Anp0 > 0 && Akq > 0 )
745 cgemv_( TRANS, &Anp0, &Akq, negone,
746 Mptr( Aptr, Akp, 0, Ald, size ), &Ald,
747 Mptr( XAC, Akp, 0, XACld, size ), &ione,
748 one, XAR, &XARld );
749 }
750 else
751 {
752 if( Anp0 > 0 )
753 cgemv_( TRANS, &Anp0, &Akq, negone,
754 Mptr( Aptr, Akp, 0, Ald, size ), &Ald,
755 Mptr( XAC, Akp, 0, XACld, size ), &ione,
756 one, XAR, &XARld );
757 }
758 }
759 }
760
761
762
763 if( XARsum && ( Anq > 0 ) )
764 {
766 mycol );
767 }
768
769
770
771 if( XARapbX )
772 {
773 PB_Cpaxpby( type,
NOCONJG, 1, *N, one, XAR, 0, 0, XARd,
ROW, zero,
774 ((char *) X), Xi, Xj, Xd, &Xroc );
775 }
776
777
778
781 }
782 }
783 if( XACfr ) free( XAC );
784 if( XARfr ) free( XAR );
785
786
787
788}