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