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
228
229 Int Acol, Acoldst, Aimb, Ainb, AisD, AisR, Amb, Amp, Anb, Anq,
230 Arow, Arowdst, Ycol, Yii, Yimb, Yimb1, Yinb, Yinb1, YisD,
231 YisR, YisRow, Yjj, Yld, Ymb, Ymp, Ynb, Ynq, Yrow, ctxt,
232 izero=0, nprow, myrow, npcol, mycol;
233
234
235
236
237
238
239
240 *YAFREE = 0;
241 *YASUM = 0;
242 *YAPBY = 0;
243 *YAPTR = NULL;
244
245
246
247 if( ( M <= 0 ) || ( N <= 0 ) || ( K <= 0 ) )
248 {
250 {
253 }
254 else
255 {
258 }
259 return;
260 }
261
262
263
265
266
267
268 Minfog2l( IY, JY, DESCY, nprow, npcol, myrow, mycol, Yii, Yjj, Yrow, Ycol );
269
270
271
272 if( ( YisRow = (
Mupcase( YROC[0] ) ==
CROW ) ) != 0 )
273 {
274 YisD = ( ( Ycol >= 0 ) && ( npcol > 1 ) );
275 YisR = ( ( Yrow == -1 ) || ( nprow == 1 ) );
276 }
277 else
278 {
279 YisD = ( ( Yrow >= 0 ) && ( nprow > 1 ) );
280 YisR = ( ( Ycol == -1 ) || ( npcol == 1 ) );
281 }
282
283 Aimb = DESCA[
IMB_ ]; Ainb = DESCA[
INB_ ];
284 Amb = DESCA[
MB_ ]; Anb = DESCA[
NB_ ];
286
288 {
289
290
291
292 AisR = ( ( Arow < 0 ) || ( nprow == 1 ) );
293
294
295
296 Arowdst =
PB_Cindxg2p( KA, Aimb, Amb, Arow, Arow, nprow );
297
299 {
300
301
302
303
304 AisD = ( ( Acol >= 0 ) && ( npcol > 1 ) );
305
306 Yinb = DESCY[
INB_]; Ynb = DESCY[
NB_];
308
309
310
311
312
313
314 if( ( !AisD && !YisD ) ||
315 ( ( AisD && YisD ) &&
316 ( ( Acol == Ycol ) &&
317 ( ( ( Ainb >= N ) && ( Yinb1 >= N ) ) ||
318 ( ( Ainb == Yinb1 ) && ( Anb == Ynb ) ) ) ) ) )
319 {
320 Ynq =
PB_Cnumroc( N, 0, Yinb1, Ynb, mycol, Ycol, npcol );
321 Ymp = ( YisR ? K : ( ( myrow == Yrow ) ? K : 0 ) );
323
324 if( YisR )
325 {
326
327
328
329
330
331 *YASUM = ( AisR ? 0 : ( nprow > 1 ) );
332 *YAPBY = 0;
334 if( Ynq > 0 )
335 {
336 *YAPTR =
Mptr( Y, Yii, Yjj, Yld,
TYPE->size );
337 if( !AisR && ( myrow != Arowdst ) )
339 &Ynq, &izero,
TYPE->zero,
TYPE->zero, *YAPTR,
340 &Yld );
341 }
342 }
343 else
344 {
345
346
347
348 if( AisR )
349 {
350
351
352
353
354 *YASUM = 0;
355 *YAPBY = 0;
358 DESCA[
RSRC_ ] = Yrow;
359 if( ( Ynq > 0 ) && ( Ymp > 0 ) )
360 *YAPTR =
Mptr( Y, Yii, Yjj, Yld,
TYPE->size );
361 }
362 else
363 {
364 if(
PB_Cspan( M, 0, Aimb, Amb, Arow, nprow ) )
365 {
366
367
368
369
370 *YASUM = ( nprow > 1 );
371 *YAPBY = 0;
372
373 if( myrow == Yrow )
374 {
375
376
377
378
380 if( Ynq > 0 )
381 {
382 *YAPTR =
Mptr( Y, Yii, Yjj, Yld,
TYPE->size );
383 if( Yrow != Arowdst )
384 {
385 TYPE->Cgesd2d( ctxt, K, Ynq, *YAPTR, Yld, Arowdst,
386 mycol );
390 *YAPTR, &Yld );
391 }
392 }
393 }
394 else
395 {
396
397
398
399
401 if( Ynq > 0 )
402 {
404 *YAFREE = 1;
405 if( ( Yrow != Arowdst ) && ( myrow == Arowdst ) )
406 TYPE->Cgerv2d( ctxt, K, Ynq, *YAPTR, Yld, Yrow,
407 mycol );
408 else
412 *YAPTR, &Yld );
413 }
414 }
415 }
416 else
417 {
418
419
420
421 if( Yrow == Arow )
422 {
423
424
425
426 *YASUM = 0;
427 *YAPBY = 0;
429 if( ( myrow == Yrow ) && ( Ynq > 0 ) )
430 *YAPTR =
Mptr( Y, Yii, Yjj, Yld,
TYPE->size );
431 }
432 else
433 {
434
435
436
437
438
439
440 *YASUM = 0;
441 *YAPBY = 1;
442 if( Ynq > 0 )
443 {
444 if( myrow == Yrow )
445 {
447 TYPE->Cgesd2d( ctxt, K, Ynq,
Mptr( Y, Yii, Yjj,
448 Yld,
TYPE->size ), Yld, Arowdst,
449 mycol );
450 }
451 else if( myrow == Arowdst )
452 {
455 *YAFREE = 1;
456 TYPE->Cgerv2d( ctxt, K, Ynq, *YAPTR, Yld, Yrow,
457 mycol );
458 }
459 }
460 Yrow = Arowdst;
461 }
462 }
463 }
464 }
465
466
467
468
469
470 PB_Cdescset( DYA, K, N, K, Yinb1, 1, Ynb, Yrow, Ycol, ctxt, Yld );
471 return;
472 }
473 }
474
475
476
477 *YAPBY = 1;
478 Anq =
PB_Cnumroc( N, 0, Ainb, Anb, mycol, Acol, npcol );
480
481 if( YisR )
482 {
483
484
485
486
487
488
489 *YASUM = ( AisR ? 0 : ( nprow > 1 ) );
490 if( Anq > 0 )
491 {
493 *YAFREE = 1;
494 if( ( Arowdst >= 0 ) && ( myrow != Arowdst ) )
496 &izero,
TYPE->zero,
TYPE->zero, *YAPTR, &Yld );
497 }
498 }
499 else
500 {
501
502
503
504 if( AisR )
505 {
506
507
508
509
510 *YASUM = 0;
512 if( YisRow )
513 {
514
515
516
517
519 }
520 else
521 {
523 }
524 if( ( myrow == ( Arowdst = DESCA[
RSRC_] ) ) && ( Anq > 0 ) )
525 {
527 *YAFREE = 1;
528 }
529 }
530 else
531 {
532 if(
PB_Cspan( M, 0, Aimb, Amb, Arow, nprow ) )
533 {
534
535
536
537
538 *YASUM = ( nprow > 1 );
539 if( Anq > 0 )
540 {
542 *YAFREE = 1;
543 if( myrow != Arowdst )
545 &Anq, &izero,
TYPE->zero,
TYPE->zero, *YAPTR,
546 &Yld );
547 }
548 }
549 else
550 {
551
552
553
554
555 *YASUM = 0;
556 if( ( myrow == Arowdst ) && ( Anq > 0 ) )
557 {
559 *YAFREE = 1;
560 }
561 }
562 }
563 }
564
565
566
567
568
569 PB_Cdescset( DYA, K, N, K, Ainb, 1, Anb, Arowdst, Acol, ctxt, Yld );
570
571
572
573 if( YisRow )
574 {
575 PB_Cpaxpby(
TYPE, CONJUG, K, N,
TYPE->one, Y, IY, JY, DESCY,
ROW,
576 TYPE->zero, *YAPTR, 0, 0, DYA,
ROW );
577 }
578 else
579 {
580 PB_Cpaxpby(
TYPE, CONJUG, N, K,
TYPE->one, Y, IY, JY, DESCY,
COLUMN,
581 TYPE->zero, *YAPTR, 0, 0, DYA,
ROW );
582 }
583 }
584 else
585 {
586
587
588
589 AisR = ( ( Acol < 0 ) || ( npcol == 1 ) );
590
591
592
593 Acoldst =
PB_Cindxg2p( KA, Ainb, Anb, Acol, Acol, npcol );
594
596 {
597
598
599
600
601 AisD = ( ( Arow >= 0 ) && ( nprow > 1 ) );
602
603 Yimb = DESCY[
IMB_]; Ymb = DESCY[
MB_];
605
606
607
608
609
610
611 if( ( !AisD && !YisD ) ||
612 ( ( AisD && YisD ) &&
613 ( ( Arow == Yrow ) &&
614 ( ( ( Aimb >= M ) && ( Yimb1 >= M ) ) ||
615 ( ( Aimb == Yimb1 ) && ( Amb == Ymb ) ) ) ) ) )
616 {
617 Ymp =
PB_Cnumroc( M, 0, Yimb1, Ymb, myrow, Yrow, nprow );
618 Ynq = ( YisR ? K : ( ( mycol == Ycol ) ? K : 0 ) );
620
621 if( YisR )
622 {
623
624
625
626
627
628 *YASUM = ( AisR ? 0 : ( npcol > 1 ) );
629 *YAPBY = 0;
631 if( Ymp > 0 )
632 {
633 *YAPTR =
Mptr( Y, Yii, Yjj, Yld,
TYPE->size );
634 if( !AisR && ( mycol != Acoldst ) )
636 &K, &izero,
TYPE->zero,
TYPE->zero, *YAPTR,
637 &Yld );
638 }
639 }
640 else
641 {
642
643
644
645 if( AisR )
646 {
647
648
649
650
651 *YASUM = 0;
652 *YAPBY = 0;
655 DESCA[
CSRC_ ] = Ycol;
656 if( ( Ymp > 0 ) && ( Ynq > 0 ) )
657 *YAPTR =
Mptr( Y, Yii, Yjj, Yld,
TYPE->size );
658 }
659 else
660 {
661 if(
PB_Cspan( N, 0, Ainb, Anb, Acol, npcol ) )
662 {
663
664
665
666
667 *YASUM = ( npcol > 1 );
668 *YAPBY = 0;
669
670 if( mycol == Ycol )
671 {
672
673
674
675
677 if( Ymp > 0 )
678 {
679 *YAPTR =
Mptr( Y, Yii, Yjj, Yld,
TYPE->size );
680 if( Ycol != Acoldst )
681 {
682 TYPE->Cgesd2d( ctxt, Ymp, K, *YAPTR, Yld, myrow,
683 Acoldst );
687 *YAPTR, &Yld );
688 }
689 }
690 }
691 else
692 {
693
694
695
696
698 if( Ymp > 0 )
699 {
701 *YAFREE = 1;
702 if( ( Ycol != Acoldst ) && ( mycol == Acoldst ) )
703 TYPE->Cgerv2d( ctxt, Ymp, K, *YAPTR, Yld, myrow,
704 Ycol );
705 else
709 *YAPTR, &Yld );
710 }
711 }
712 }
713 else
714 {
715
716
717
718 if( Ycol == Acol )
719 {
720
721
722
723 *YASUM = 0;
724 *YAPBY = 0;
726 if( ( mycol == Ycol ) && ( Ymp > 0 ) )
727 *YAPTR =
Mptr( Y, Yii, Yjj, Yld,
TYPE->size );
728 }
729 else
730 {
731
732
733
734
735
736
737 *YASUM = 0;
738 *YAPBY = 1;
739 if( Ymp > 0 )
740 {
741 if( mycol == Ycol )
742 {
744 TYPE->Cgesd2d( ctxt, Ymp, K,
Mptr( Y, Yii, Yjj,
745 Yld,
TYPE->size ), Yld, myrow,
746 Acoldst );
747 }
748 else if( mycol == Acoldst )
749 {
750 Yld =
MAX( 1, Ymp ) ;
752 *YAFREE = 1;
753 TYPE->Cgerv2d( ctxt, Ymp, K, *YAPTR, Yld, myrow,
754 Ycol );
755 }
756 }
757 Ycol = Acoldst;
758 }
759 }
760 }
761 }
762
763
764
765
766
767 PB_Cdescset( DYA, M, K, Yimb1, K, Ymb, 1, Yrow, Ycol, ctxt, Yld );
768 return;
769 }
770 }
771
772
773
774 *YAPBY = 1;
775 Amp =
PB_Cnumroc( M, 0, Aimb, Amb, myrow, Arow, nprow );
777
778 if( YisR )
779 {
780
781
782
783
784
785
786 *YASUM = ( AisR ? 0 : ( npcol > 1 ) );
787 if( Amp > 0 )
788 {
790 *YAFREE = 1;
791 if( ( Acoldst >= 0 ) && ( mycol != Acoldst ) )
793 &izero,
TYPE->zero,
TYPE->zero, *YAPTR, &Yld );
794 }
795 }
796 else
797 {
798
799
800
801 if( AisR )
802 {
803
804
805
806
807 *YASUM = 0;
809 if( YisRow )
810 {
812 }
813 else
814 {
815
816
817
818
820 }
821 if( ( mycol == ( Acoldst = DESCA[
CSRC_] ) ) && ( Amp > 0 ) )
822 {
824 *YAFREE = 1;
825 }
826 }
827 else
828 {
829 if(
PB_Cspan( N, 0, Ainb, Anb, Acol, npcol ) )
830 {
831
832
833
834
835 *YASUM = ( npcol > 1 );
836 if( Amp > 0 )
837 {
839 *YAFREE = 1;
840 if( mycol != Acoldst )
842 &K, &izero,
TYPE->zero,
TYPE->zero, *YAPTR,
843 &Yld );
844 }
845 }
846 else
847 {
848
849
850
851
852 *YASUM = 0;
853 if( ( mycol == Acoldst ) && ( Amp > 0 ) )
854 {
856 *YAFREE = 1;
857 }
858 }
859 }
860 }
861
862
863
864
865
866 PB_Cdescset( DYA, M, K, Aimb, K, Amb, 1, Arow, Acoldst, ctxt, Yld );
867
868
869
870 if( YisRow )
871 {
872 PB_Cpaxpby(
TYPE, CONJUG, K, M,
TYPE->one, Y, IY, JY, DESCY,
ROW,
874 }
875 else
876 {
877 PB_Cpaxpby(
TYPE, CONJUG, M, K,
TYPE->one, Y, IY, JY, DESCY,
COLUMN,
879 }
880 }
881
882
883
884}