35{
36
37
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 char Xscope, Yscope, * one, * top, tran, * zero;
179 Int OneBlock, OneDgrid, RRorCC, Square, Xcol, Xi, XisD, XisR,
180 Xinb1D, XinbD, XisRow, Xii, Xj, Xjj, Xld, Xlinc, Xm, XmyprocD,
181 XmyprocR, Xn, XnbD, XnpD, XnprocsD, XnprocsR, XprocD, XprocR,
182 Xroc, Xrow, Ycol, Yi, Yii, Yinb1D, YinbD, YisD, YisR, YisRow,
183 Yj, Yjj, Yld, Ylinc, Ym, YmyprocD, YmyprocR, Yn, YnbD, YnpD,
184 YnprocsD, YnprocsR, YprocD, YprocR, Yroc, Yrow, cdst, csrc,
185 ctxt, dst, gcdPQ, info, ione=1, k, l, lcmPQ, lcmb, mycol,
186 myrow, npcol, npq, nprow, p, q, rdst, rsrc, src, size;
189
190
191
193 char * buf = NULL;
194
195
196
197
200#ifndef NO_ARGCHK
201
202
203
205 if( !( info = ( ( nprow == -1 ) ? -( 501 +
CTXT_ ) : 0 ) ) )
206 {
207 PB_Cchkvec( ctxt,
"PDSWAP",
"X", *N, 1, Xi, Xj, Xd, *INCX, 5, &info );
208 PB_Cchkvec( ctxt,
"PDSWAP",
"Y", *N, 1, Yi, Yj, Yd, *INCY, 10, &info );
209 }
210 if( info ) {
PB_Cabort( ctxt,
"PDSWAP", info );
return; }
211#endif
212
213
214
215 if( *N == 0 ) return;
216
217
218
219#ifdef NO_ARGCHK
221#endif
222
223
224
225 if( ( XisRow = ( *INCX == Xd[
M_] ) ) != 0 )
226 XisD = ( ( Xd[
CSRC_] >= 0 ) && ( ( XnprocsD = npcol ) > 1 ) );
227 else
228 XisD = ( ( Xd[
RSRC_] >= 0 ) && ( ( XnprocsD = nprow ) > 1 ) );
229
230
231
232 if( ( YisRow = ( *INCY == Yd[
M_] ) ) != 0 )
233 YisD = ( ( Yd[
CSRC_] >= 0 ) && ( ( YnprocsD = npcol ) > 1 ) );
234 else
235 YisD = ( ( Yd[
RSRC_] >= 0 ) && ( ( YnprocsD = nprow ) > 1 ) );
236
237
238
239 RRorCC = ( ( XisRow && YisRow ) || ( !( XisRow ) && !( YisRow ) ) );
240
241
242
243 if( XisD && YisD )
244 {
245
246
247
248 PB_Cinfog2l( Xi, Xj, Xd, nprow, npcol, myrow, mycol, &Xii, &Xjj,
249 &Xrow, &Xcol );
250 if( XisRow )
251 {
252 XinbD = Xd[
INB_ ]; XnbD = Xd[
NB_ ]; Xld = Xd[
LLD_];
253 Xlinc = Xld;
254 XprocD = Xcol; XmyprocD = mycol;
255 XprocR = Xrow; XmyprocR = myrow; XnprocsR = nprow;
256 XisR = ( ( Xrow == -1 ) || ( XnprocsR == 1 ) );
257 Mfirstnb( Xinb1D, *N, Xj, XinbD, XnbD );
258 }
259 else
260 {
261 XinbD = Xd[
IMB_ ]; XnbD = Xd[
MB_ ]; Xld = Xd[
LLD_];
262 Xlinc = 1;
263 XprocD = Xrow; XmyprocD = myrow;
264 XprocR = Xcol; XmyprocR = mycol; XnprocsR = npcol;
265 XisR = ( ( Xcol == -1 ) || ( XnprocsR == 1 ) );
266 Mfirstnb( Xinb1D, *N, Xi, XinbD, XnbD );
267 }
268
269
270
271 PB_Cinfog2l( Yi, Yj, Yd, nprow, npcol, myrow, mycol, &Yii, &Yjj,
272 &Yrow, &Ycol );
273 if( YisRow )
274 {
275 YinbD = Yd[
INB_ ]; YnbD = Yd[
NB_ ]; Yld = Yd[
LLD_];
276 Ylinc = Yld;
277 YprocD = Ycol; YmyprocD = mycol;
278 YprocR = Yrow; YmyprocR = myrow; YnprocsR = nprow;
279 YisR = ( ( Yrow == -1 ) || ( YnprocsR == 1 ) );
280 Mfirstnb( Yinb1D, *N, Yj, YinbD, YnbD );
281 }
282 else
283 {
284 YinbD = Yd[
IMB_ ]; YnbD = Yd[
MB_ ]; Yld = Yd[
LLD_];
285 Ylinc = 1;
286 YprocD = Yrow; YmyprocD = myrow;
287 YprocR = Ycol; YmyprocR = mycol; YnprocsR = npcol;
288 YisR = ( ( Ycol == -1 ) || ( YnprocsR == 1 ) );
289 Mfirstnb( Yinb1D, *N, Yi, YinbD, YnbD );
290 }
291
292
293
294 OneDgrid = ( ( XnprocsD == 1 ) && ( YnprocsD == 1 ) );
295 OneBlock = ( ( Xinb1D >= *N ) && ( Yinb1D >= *N ) );
296
297
298
299 Square = ( ( Xinb1D == Yinb1D ) && ( XnbD == YnbD ) &&
300 ( XnprocsD == YnprocsD ) );
301
302 if( !( XisR ) )
303 {
304
305
306
307 if( YisR )
308 {
309
310
311
312
313
314 if( RRorCC )
315 {
316
317
318
319 if( ( OneDgrid || OneBlock || Square ) && ( XprocD == YprocD ) )
320 {
321
322
323
324
325 YprocR = XprocR;
326 }
327 else
328 {
329
330
331
332
333 YprocR =
MModAdd1( XprocR, XnprocsR );
334 }
335 }
336 else
337 {
338
339
340
341
342 YprocR = XprocD;
343 }
344 }
345 else
346 {
347
348
349
350
351 if( ( XmyprocR != XprocR ) && ( YmyprocR != YprocR ) )
352 return;
353 }
354 }
355 else
356 {
357
358
359
360 if( YisR )
361 {
362
363
364
365 if( RRorCC )
366 {
367
368
369
370 if( ( OneDgrid || OneBlock || Square ) && ( XprocD == YprocD ) )
371 {
372
373
374
375
376
377 XprocR = YprocR = 0;
378 }
379 else
380 {
381
382
383
384
385
386 YprocR = 0;
387 XprocR =
MModAdd1( YprocR, YnprocsR );
388 }
389 }
390 else
391 {
392
393
394
395
396 XprocR = YprocD;
397 YprocR = XprocD;
398 }
399 }
400 else
401 {
402
403
404
405 if( RRorCC )
406 {
407
408
409
410 if( ( OneDgrid || OneBlock || Square ) && ( XprocD == YprocD ) )
411 {
412
413
414
415
416 XprocR = YprocR;
417 }
418 else
419 {
420
421
422
423
424 XprocR =
MModAdd1( YprocR, YnprocsR );
425 }
426 }
427 else
428 {
429
430
431
432
433 XprocR = YprocD;
434 }
435 }
436 }
437
438
439
440
441
443
444
445
446
447
448 if( ( ( RRorCC && ( XprocD == YprocD ) && ( XprocR == YprocR ) ) ||
449 ( !( RRorCC ) && ( XprocD == YprocR ) && ( XprocR == YprocD ) ) ) &&
450 ( OneDgrid || OneBlock || ( RRorCC && Square ) ) )
451 {
452 if( ( !XisR && ( XmyprocR == XprocR ) &&
453 !YisR && ( YmyprocR == YprocR ) ) ||
454 ( !XisR && YisR && ( YmyprocR == YprocR ) ) ||
455 ( !YisR && XisR && ( XmyprocR == XprocR ) ) ||
456 ( XisR && YisR ) )
457 {
458 XnpD =
PB_Cnumroc( *N, 0, Xinb1D, XnbD, XmyprocD, XprocD,
459 XnprocsD );
460 YnpD =
PB_Cnumroc( *N, 0, Yinb1D, YnbD, YmyprocD, YprocD,
461 YnprocsD );
462 if( ( XnpD > 0 ) && ( YnpD > 0 ) )
463 {
465 Mptr( ((
char *) X), Xii, Xjj, Xld, size ), &Xlinc,
466 Mptr( ((
char *) Y), Yii, Yjj, Yld, size ), &Ylinc );
467 }
468 if( RRorCC && XisR && YisR ) return;
469 }
470 }
471 else if( ( RRorCC && OneDgrid ) || OneBlock || Square )
472 {
473
474
475
476
477
478
479 if( RRorCC && ( XprocR != YprocR ) )
480 {
481
482
483
484
485 if( XmyprocR == XprocR )
486 {
487 XnpD =
PB_Cnumroc( *N, 0, Xinb1D, XnbD, XmyprocD, XprocD,
488 XnprocsD );
489 if( XnpD > 0 )
490 {
491 dst = YprocD +
MModSub( XmyprocD, XprocD, XnprocsD );
492 dst =
MPosMod( dst, YnprocsD );
493 if( XisRow )
494 {
496 Xld, size ), Xld, YprocR, dst );
498 Xld, size ), Xld, YprocR, dst );
499 }
500 else
501 {
502
504 Xld, size ), Xld, dst, YprocR );
506 Xld, size ), Xld, dst, YprocR );
507 }
508 }
509 }
510 if( YmyprocR == YprocR )
511 {
512 YnpD =
PB_Cnumroc( *N, 0, Yinb1D, YnbD, YmyprocD, YprocD,
513 YnprocsD );
514 if( YnpD > 0 )
515 {
516 dst = XprocD +
MModSub( YmyprocD, YprocD, YnprocsD );
517 dst =
MPosMod( dst, XnprocsD );
518 if( YisRow )
519 {
521 Yld, size ), Yld, XprocR, dst );
523 Yld, size ), Yld, XprocR, dst );
524 }
525 else
526 {
528 Yld, size ), Yld, dst, XprocR );
530 Yld, size ), Yld, dst, XprocR );
531 }
532 }
533 }
534 }
535 else
536 {
537
538
539
540 if( XmyprocR == XprocR )
541 {
542
543
544
545
546 XnpD =
PB_Cnumroc( *N, 0, Xinb1D, XnbD, XmyprocD, XprocD,
547 XnprocsD );
548 if( XnpD > 0 )
549 {
550 dst = YprocD +
MModSub( XmyprocD, XprocD, XnprocsD );
551 dst =
MPosMod( dst, YnprocsD );
552 if( YisRow ) { rdst = YprocR; cdst = dst; }
553 else { rdst = dst; cdst = YprocR; }
554
555 if( ( myrow == rdst ) && ( mycol == cdst ) )
556 {
557 dswap_( &XnpD,
Mptr( ((
char *) X), Xii, Xjj, Xld,
558 size ), &Xlinc,
Mptr( ((
char *) Y), Yii, Yjj, Yld,
559 size ), &Ylinc );
560 }
561 else
562 {
563 if( XisRow )
565 Xjj, Xld, size ), Xld, rdst, cdst );
566 else
568 Xjj, Xld, size ), Xld, rdst, cdst );
569 }
570 }
571 }
572 if( YmyprocR == YprocR )
573 {
574
575
576
577
578 YnpD =
PB_Cnumroc( *N, 0, Yinb1D, YnbD, YmyprocD, YprocD,
579 YnprocsD );
580 if( YnpD > 0 )
581 {
582 src = XprocD +
MModSub( YmyprocD, YprocD, YnprocsD );
583 src =
MPosMod( src, XnprocsD );
584 if( XisRow ) { rsrc = XprocR; csrc = src; }
585 else { rsrc = src; csrc = XprocR; }
586
587 if( ( myrow != rsrc ) || ( mycol != csrc ) )
588 {
590 if( XisRow )
591 Cdgerv2d( ctxt, 1, YnpD, buf, 1, rsrc, csrc );
592 else
593 Cdgerv2d( ctxt, YnpD, 1, buf, YnpD, rsrc, csrc );
594 if( YisRow )
596 Yjj, Yld, size ), Yld, rsrc, csrc );
597 else
599 Yjj, Yld, size ), Yld, rsrc, csrc );
600 dcopy_( &YnpD, buf, &ione,
Mptr( ((
char *) Y), Yii,
601 Yjj, Yld, size ), &Ylinc );
602 if( buf ) free( buf );
603 }
604 }
605 }
606 if( XmyprocR == XprocR )
607 {
608
609
610
611
612 if( XnpD > 0 )
613 {
614 if( ( myrow != rdst ) || ( mycol != cdst ) )
615 {
617 if( YisRow )
618 Cdgerv2d( ctxt, 1, XnpD, buf, 1, rdst, cdst );
619 else
620 Cdgerv2d( ctxt, XnpD, 1, buf, XnpD, rdst, cdst );
621 dcopy_( &XnpD, buf, &ione,
Mptr( ((
char *) X), Xii,
622 Xjj, Xld, size ), &Xlinc );
623 if( buf ) free( buf );
624 }
625 }
626 }
627 }
628 }
629 else if( ( XmyprocR == XprocR ) || ( YmyprocR == YprocR ) )
630 {
631
632
633
635 if( XisRow ) { Xscope =
CCOLUMN; Xm = 1; rsrc = XprocR; }
636 else { Xscope =
CROW; Xn = 1; csrc = XprocR; }
637 if( YisRow ) { Yscope =
CCOLUMN; Ym = 1; rdst = YprocR; }
638 else { Yscope =
CROW; Yn = 1; cdst = YprocR; }
639 lcmb =
PB_Clcm( XnprocsD * XnbD, YnprocsD * YnbD );
640 one = type->
one; zero = type->
zero;
641 gcdPQ =
PB_Cgcd( XnprocsD, YnprocsD );
642 lcmPQ = ( XnprocsD / gcdPQ ) * YnprocsD;
643
644 for( k = 0; k < gcdPQ; k++ )
645 {
646 p = 0; q = k;
647
648 for( l = 0; l < lcmPQ; l++ )
649 {
650 Xroc =
MModAdd( XprocD, p, XnprocsD );
651 Yroc =
MModAdd( YprocD, q, YnprocsD );
652
653 if( ( XmyprocD == Xroc ) || ( YmyprocD == Yroc ) )
654 {
655 XnpD =
PB_Cnumroc( *N, 0, Xinb1D, XnbD, Xroc, XprocD,
656 XnprocsD );
657 YnpD =
PB_Cnumroc( *N, 0, Yinb1D, YnbD, Yroc, YprocD,
658 YnprocsD );
659 PB_CVMinit( &VM, 0, XnpD, YnpD, Xinb1D, Yinb1D, XnbD, YnbD,
660 p, q, XnprocsD, YnprocsD, lcmb );
662 {
663 if( ( RRorCC && ( Xroc == Yroc ) &&
664 ( XprocR == YprocR ) ) ||
665 ( !( RRorCC ) && ( Xroc == YprocR ) &&
666 ( XprocR == Yroc ) ) )
667 {
668
669
670
671
672 if( ( YmyprocD == Yroc ) && ( YmyprocR == YprocR ) )
673 {
675 Mptr( ((
char *) X), Xii, Xjj, Xld, size ),
676 Xlinc,
Mptr( ((
char *) Y), Yii, Yjj, Yld,
677 size ), Ylinc );
678 }
679 }
680 else
681 {
682
683
684
685
686 if( ( XmyprocR == XprocR ) && ( XmyprocD == Xroc ) )
687 {
688 if( XisRow ) { Xn = npq; }
689 else { Xm = npq; }
690 if( YisRow ) { Yn = npq; cdst = Yroc; }
691 else { Ym = npq; rdst = Yroc; }
694 npq, 1, one,
Mptr( ((
char *) X), Xii,
695 Xjj, Xld, size ), Xld, zero, buf, Xm );
696 Cdgesd2d( ctxt, Xm, Xn, buf, Xm, rdst, cdst );
697 Cdgerv2d( ctxt, Ym, Yn, buf, Ym, rdst, cdst );
699 &tran, npq, 1, zero,
Mptr( ((
char *) X),
700 Xii, Xjj, Xld, size ), Xld, one, buf,
701 Ym );
702 if( buf ) free ( buf );
703 }
704 if( ( YmyprocR == YprocR ) && ( YmyprocD == Yroc ) )
705 {
706 if( XisRow ) { Xn = npq; csrc = Xroc; }
707 else { Xm = npq; rsrc = Xroc; }
708 if( YisRow ) { Yn = npq; }
709 else { Ym = npq; }
713 Yii, Yjj, Yld, size ), Yld, zero, buf,
714 Ym );
715 Cdgesd2d( ctxt, Ym, Yn, buf, Ym, rsrc, csrc );
716 Cdgerv2d( ctxt, Xm, Xn, buf, Xm, rsrc, csrc );
718 &tran, npq, 1, zero,
Mptr( ((
char *) Y),
719 Yii, Yjj, Yld, size ), Yld, one, buf,
720 Xm );
721 if( buf ) free ( buf );
722 }
723 }
724 }
725 }
728 }
729 }
730 }
731
732 if( XisR )
733 {
734
735
736
737 XnpD =
PB_Cnumroc( *N, 0, Xinb1D, XnbD, XmyprocD, XprocD, XnprocsD );
738 if( XnpD > 0 )
739 {
740 if( XisRow )
741 {
743 if( XmyprocR == XprocR )
745 Xii, Xjj, Xld, size ), Xld );
746 else
748 Xii, Xjj, Xld, size ), Xld, XprocR, XmyprocD );
749 }
750 else
751 {
753 if( XmyprocR == XprocR )
755 Xii, Xjj, Xld, size ), Xld );
756 else
758 Xii, Xjj, Xld, size ), Xld, XmyprocD, XprocR );
759 }
760 }
761 }
762
763 if( YisR )
764 {
765
766
767
768 YnpD =
PB_Cnumroc( *N, 0, Yinb1D, YnbD, YmyprocD, YprocD, YnprocsD );
769 if( YnpD > 0 )
770 {
771 if( YisRow )
772 {
774 if( YmyprocR == YprocR )
776 Yii, Yjj, Yld, size ), Yld );
777 else
779 Yii, Yjj, Yld, size ), Yld, YprocR, YmyprocD );
780 }
781 else
782 {
784 if( YmyprocR == YprocR )
786 Yii, Yjj, Yld, size ), Yld );
787 else
789 Yii, Yjj, Yld, size ), Yld, YmyprocD, YprocR );
790 }
791 }
792 }
793 }
794 else if( !( XisD ) && YisD )
795 {
796
797
798
800 ((char *) Y), Yi, Yj, Yd, *INCY );
801 }
802 else if( XisD && !( YisD ) )
803 {
804
805
806
808 ((char *) X), Xi, Xj, Xd, *INCX );
809 }
810 else
811 {
812
813
814
816 ((char *) Y), Yi, Yj, Yd, *INCY );
817 }
818
819
820
821}