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 char ascope, bscope, * buf = NULL, * one, * top, tran, * zero;
217 Int Acol, Aii, AinbD, Ainb1D, AisD, AisR, AisRow, AiD, Ajj, Ald,
218 AmyprocD, AmyprocR, AnbD, AnD, AnR, AnpD, AnprocsD, AnprocsR,
219 AprocD, AprocR, Aroc, Arow, Bcol, Bii, BinbD, Binb1D, BisD,
220 BisR, BisRow, BiD, Bjj, Bld, BmyprocD, BmyprocR, BnbD, BnD,
221 BnR, BnpD, BnprocsD, BnprocsR, BprocD, BprocR, Broc, Brow,
222 BsrcD, OneBlock, OneDgrid, RRorCC, Square, cdst, csrc, ctxt,
223 dst, gcdPQ, k, l, lcmPQ, lcmb, ma, mb, mycol, myrow, na, nb,
224 npcol, npq, nprow, p, q, rdst, rsrc, size, src;
227
228
229
230
231
232
233
234 if( ( M <= 0 ) || ( N <= 0 ) ) return;
235
236
237
239
240
241
242 if( ( AisRow = (
Mupcase( AROC[0] ) ==
CROW ) ) != 0 )
243 AisD = ( ( DESCA[
CSRC_] >= 0 ) && ( ( AnprocsD = npcol ) > 1 ) );
244 else
245 AisD = ( ( DESCA[
RSRC_] >= 0 ) && ( ( AnprocsD = nprow ) > 1 ) );
246
247
248
249 if( ( BisRow = (
Mupcase( BROC[0] ) ==
CROW ) ) != 0 )
250 BisD = ( ( DESCB[
CSRC_] >= 0 ) && ( ( BnprocsD = npcol ) > 1 ) );
251 else
252 BisD = ( ( DESCB[
RSRC_] >= 0 ) && ( ( BnprocsD = nprow ) > 1 ) );
253
254
255
256 if( AisD && BisD )
257 {
258
259
260
261 PB_Cinfog2l( IA, JA, DESCA, nprow, npcol, myrow, mycol, &Aii, &Ajj, &Arow,
262 &Acol );
263 if( AisRow )
264 {
265 AinbD = DESCA[
INB_]; AnbD = DESCA[
NB_]; Ald = DESCA[
LLD_];
266 AiD = JA; AnD = N; AnR = M;
267 AprocD = Acol; AmyprocD = mycol;
268 AprocR = Arow; AmyprocR = myrow; AnprocsR = nprow;
269 AisR = ( ( DESCA[
RSRC_ ] == -1 ) || ( AnprocsR == 1 ) );
270 }
271 else
272 {
273 AinbD = DESCA[
IMB_]; AnbD = DESCA[
MB_]; Ald = DESCA[
LLD_];
274 AiD = IA; AnD = M; AnR = N;
275 AprocD = Arow; AmyprocD = myrow;
276 AprocR = Acol; AmyprocR = mycol; AnprocsR = npcol;
277 AisR = ( ( DESCA[
CSRC_ ] == -1 ) || ( AnprocsR == 1 ) );
278 }
280
281
282
283 PB_Cinfog2l( IB, JB, DESCB, nprow, npcol, myrow, mycol, &Bii, &Bjj, &Brow,
284 &Bcol );
285 if( BisRow )
286 {
287 BinbD = DESCB[
INB_ ]; BnbD = DESCB[
NB_ ];
288 BsrcD = DESCB[
CSRC_ ]; Bld = DESCB[
LLD_ ];
289 BiD = JB;
290 if( AisRow ) { BnD = N; BnR = M; } else { BnD = M; BnR = N; }
291 BprocD = Bcol; BmyprocD = mycol;
292 BprocR = Brow; BmyprocR = myrow; BnprocsR = nprow;
293 BisR = ( ( DESCB[
RSRC_ ] == -1 ) || ( BnprocsR == 1 ) );
294 }
295 else
296 {
297 BinbD = DESCB[
IMB_ ]; BnbD = DESCB[
MB_ ];
298 BsrcD = DESCB[
RSRC_ ]; Bld = DESCB[
LLD_ ];
299 BiD = IB;
300 if( AisRow ) { BnD = N; BnR = M; } else { BnD = M; BnR = N; }
301 BprocD = Brow; BmyprocD = myrow;
302 BprocR = Bcol; BmyprocR = mycol; BnprocsR = npcol;
303 BisR = ( ( DESCB[
CSRC_ ] == -1 ) || ( BnprocsR == 1 ) );
304 }
306
307
308
309 RRorCC = ( ( AisRow && BisRow ) || ( !( AisRow ) && !( BisRow ) ) );
310
311
312
313 OneDgrid = ( ( AnprocsD == 1 ) && ( BnprocsD == 1 ) );
314 OneBlock = ( ( Ainb1D >= AnD ) && ( Binb1D >= BnD ) );
315
316
317
318 Square = ( ( Ainb1D == Binb1D ) && ( AnbD == BnbD ) &&
319 ( AnprocsD == BnprocsD ) );
320
321 if( !( AisR ) )
322 {
323
324
325
326 if( BisR )
327 {
328
329
330
331
332
333 if( RRorCC )
334 {
335
336
337
338 if( ( OneDgrid || OneBlock || Square ) && ( AprocD == BprocD ) )
339 {
340
341
342
343
344 BprocR = AprocR;
345 }
346 else
347 {
348
349
350
351
352 BprocR =
MModAdd1( AprocR, AnprocsR );
353 }
354 }
355 else
356 {
357
358
359
360
361 BprocR = AprocD;
362 }
363 }
364 else
365 {
366
367
368
369
370 if( ( AmyprocR != AprocR ) && ( BmyprocR != BprocR ) )
371 return;
372 }
373 }
374 else
375 {
376
377
378
379 if( BisR )
380 {
381
382
383
384 if( RRorCC )
385 {
386
387
388
389 if( ( OneDgrid || OneBlock || Square ) && ( AprocD == BprocD ) )
390 {
391
392
393
394
395
396 AprocR = BprocR = 0;
397 }
398 else
399 {
400
401
402
403
404
405 BprocR = 0;
406 AprocR =
MModAdd1( BprocR, BnprocsR );
407 }
408 }
409 else
410 {
411
412
413
414
415 AprocR = BprocD;
416 BprocR = AprocD;
417 }
418 }
419 else
420 {
421
422
423
424 if( RRorCC )
425 {
426
427
428
429 if( ( OneDgrid || OneBlock || Square ) && ( AprocD == BprocD ) )
430 {
431
432
433
434
435 AprocR = BprocR;
436 if( ( AmyprocR != AprocR ) && ( BmyprocR != BprocR ) ) return;
437 }
438 else
439 {
440
441
442
443
444 AprocR =
MModAdd1( BprocR, BnprocsR );
445 }
446 }
447 else
448 {
449
450
451
452
453 AprocR = BprocD;
454 if( ( OneDgrid || OneBlock || Square ) &&
455 ( AmyprocR != AprocR ) && ( BmyprocR != BprocR ) ) return;
456 }
457 }
458 }
459
460
461
462
463
465
466
467
468
469
470 if( ( ( RRorCC && ( AprocD == BprocD ) &&
471 ( AisR || BisR || ( AprocR == BprocR ) ) ) ||
472 ( !( RRorCC ) && ( BisR || ( AprocD == BprocR ) ) &&
473 ( AisR || ( AprocR == BprocD ) ) ) ) &&
474 ( OneDgrid || OneBlock || ( RRorCC && Square ) ) )
475 {
476 if( ( !AisR && ( AmyprocR == AprocR ) ) ||
477 ( AisR && ( BisR || BmyprocR == BprocR ) ) )
478 {
479 AnpD =
PB_Cnumroc( AnD, 0, Ainb1D, AnbD, AmyprocD, AprocD,
480 AnprocsD );
481 BnpD =
PB_Cnumroc( BnD, 0, Binb1D, BnbD, BmyprocD, BprocD,
482 BnprocsD );
483 if( ( AnpD > 0 ) && ( BnpD > 0 ) )
484 {
485
486
487
488 if( RRorCC )
489 {
491 else add =
TYPE->Fmmadd;
492 }
493 else
494 {
496 else add =
TYPE->Fmmtadd;
497 }
498
499
500
501 if( AisRow )
502 add( &AnR, &AnpD, ALPHA,
Mptr( A, Aii, Ajj, Ald, size ), &Ald,
503 BETA,
Mptr( B, Bii, Bjj, Bld, size ), &Bld );
504 else
505 add( &AnpD, &AnR, ALPHA,
Mptr( A, Aii, Ajj, Ald, size ), &Ald,
506 BETA,
Mptr( B, Bii, Bjj, Bld, size ), &Bld );
507 }
508 }
509 if( RRorCC && AisR && BisR ) return;
510 }
511 else if( ( RRorCC && OneDgrid ) || OneBlock || Square )
512 {
513
514
515
516
517
518
519 if( RRorCC )
520 {
522 else add =
TYPE->Fmmadd;
523 }
524 else
525 {
527 else add =
TYPE->Fmmtadd;
528 }
529
530 if( ( AisR && BisR ) || ( AmyprocR == AprocR ) )
531 {
532
533 AnpD =
PB_Cnumroc( AnD, 0, Ainb1D, AnbD, AmyprocD, AprocD,
534 AnprocsD );
535 if( AnpD > 0 )
536 {
537 dst = BprocD +
MModSub( AmyprocD, AprocD, AnprocsD );
538 dst =
MPosMod( dst, BnprocsD );
539 if( AisRow ) { ma = AnR; na = AnpD; }
540 else { ma = AnpD; na = AnR; }
541 if( !( AisR && BisR ) )
542 {
543 if( BisRow ) { rdst = BprocR; cdst = dst; }
544 else { rdst = dst; cdst = BprocR; }
545 }
546 else
547 {
548 if( BisRow )
549 {
550 if( !AisRow ) { rdst = AmyprocR; }
551 else { rdst =
MModAdd1( BmyprocR, BnprocsR ); }
552 cdst = dst;
553 }
554 else
555 {
556 rdst = dst;
557 if( AisRow ) { cdst = AmyprocR; }
558 else { cdst =
MModAdd1( BmyprocR, BnprocsR ); }
559 }
560 }
561 if( ( myrow == rdst ) && ( mycol == cdst ) )
562 {
563 add( &ma, &na, ALPHA,
Mptr( A, Aii, Ajj, Ald, size ), &Ald,
564 BETA,
Mptr( B, Bii, Bjj, Bld, size ), &Bld );
565 }
566 else
567 {
568 TYPE->Cgesd2d( ctxt, ma, na,
Mptr( A, Aii, Ajj, Ald, size ),
569 Ald, rdst, cdst );
570 }
571 }
572 }
573
574 if( ( AisR && BisR ) || ( BmyprocR == BprocR ) )
575 {
576 BnpD =
PB_Cnumroc( BnD, 0, Binb1D, BnbD, BmyprocD, BprocD,
577 BnprocsD );
578 if( BnpD > 0 )
579 {
580 src = AprocD +
MModSub( BmyprocD, BprocD, BnprocsD );
581 src =
MPosMod( src, AnprocsD );
582 if( AisRow ) { ma = BnR; na = BnpD; }
583 else { ma = BnpD; na = BnR; }
584 if( !( AisR && BisR ) )
585 {
586 if( AisRow ) { rsrc = AprocR; csrc = src; }
587 else { rsrc = src; csrc = AprocR; }
588 }
589 else
590 {
591 if( AisRow )
592 {
593 if( !BisRow ) { rsrc = BmyprocR; }
594 else { rsrc =
MModSub1( AmyprocR, AnprocsR ); }
595 csrc = src;
596 }
597 else
598 {
599 rsrc = src;
600 if( BisRow ) { csrc = BmyprocR; }
601 else { csrc =
MModSub1( AmyprocR, AnprocsR ); }
602 }
603 }
604 if( ( myrow != rsrc ) || ( mycol != csrc ) )
605 {
607 TYPE->Cgerv2d( ctxt, ma, na, buf, ma, rsrc, csrc );
608 add( &ma, &na, ALPHA, buf, &ma, BETA,
Mptr( B, Bii, Bjj, Bld,
609 size ), &Bld );
610 if( buf ) free( buf );
611 }
612 }
613 }
614 if( AisR && BisR ) return;
615 }
616 else
617 {
618
619
620
621 if( RRorCC )
622 {
625 }
626 else
627 {
630 }
631
632 if( AisRow ) { ascope =
CCOLUMN; ma = AnR; }
633 else { ascope =
CROW; na = AnR; }
635 lcmb =
PB_Clcm( AnprocsD * AnbD, BnprocsD * BnbD );
637 gcdPQ =
PB_Cgcd( AnprocsD, BnprocsD );
638 lcmPQ = ( AnprocsD / gcdPQ ) * BnprocsD;
639
640 for( k = 0; k < gcdPQ; k++ )
641 {
642 p = 0; q = k;
643
644 for( l = 0; l < lcmPQ; l++ )
645 {
646 Aroc =
MModAdd( AprocD, p, AnprocsD );
647 Broc =
MModAdd( BprocD, q, BnprocsD );
648
649 if( ( AmyprocD == Aroc ) || ( BmyprocD == Broc ) )
650 {
651 AnpD =
PB_Cnumroc( AnD, 0, Ainb1D, AnbD, Aroc, AprocD,
652 AnprocsD );
653 BnpD =
PB_Cnumroc( BnD, 0, Binb1D, BnbD, Broc, BprocD,
654 BnprocsD );
655 PB_CVMinit( &VM, 0, AnpD, BnpD, Ainb1D, Binb1D, AnbD, BnbD,
656 p, q, AnprocsD, BnprocsD, lcmb );
658 {
659 if( ( RRorCC && ( Aroc == Broc ) &&
660 ( AisR || ( AprocR == BprocR ) ) ) ||
661 ( !( RRorCC ) && ( Aroc == BprocR ) &&
662 ( AisR || ( AprocR == Broc ) ) ) )
663 {
664 if( ( BmyprocD == Broc ) && ( BmyprocR == BprocR ) )
665 {
667 npq, AnR, ALPHA,
Mptr( A, Aii, Ajj, Ald,
668 size ), Ald, BETA,
Mptr( B, Bii, Bjj, Bld,
669 size ), Bld );
670 }
671 }
672 else
673 {
674 if( ( AmyprocR == AprocR ) && ( AmyprocD == Aroc ) )
675 {
676 if( AisRow ) { na = npq; } else { ma = npq; }
679 npq, AnR, one,
Mptr( A, Aii, Ajj, Ald,
680 size ), Ald, zero, buf, ma );
681 if( BisRow ) { rdst = BprocR; cdst = Broc; }
682 else { rdst = Broc; cdst = BprocR; }
683 TYPE->Cgesd2d( ctxt, ma, na, buf, ma, rdst, cdst );
684 if( buf ) free ( buf );
685 }
686 if( ( BmyprocR == BprocR ) && ( BmyprocD == Broc ) )
687 {
688 if( AisRow )
689 { na = npq; rsrc = AprocR; csrc = Aroc; }
690 else
691 { ma = npq; rsrc = Aroc; csrc = AprocR; }
693 TYPE->Cgerv2d( ctxt, ma, na, buf, ma, rsrc, csrc );
695 &tran, npq, AnR, BETA,
Mptr( B, Bii, Bjj,
696 Bld, size ), Bld, ALPHA, buf, ma );
697 if( buf ) free ( buf );
698 }
699 }
700 }
701 }
704 }
705 if( AisR ) AprocR =
MModAdd1( AprocR, AnprocsR );
706 }
707 }
708
709 if( BisR )
710 {
711
712
713
714 BnpD =
PB_Cnumroc( BnD, BiD, BinbD, BnbD, BmyprocD, BsrcD, BnprocsD );
715 if( BnpD > 0 )
716 {
717 if( BisRow )
718 {
719 bscope =
CCOLUMN; mb = BnR; nb = BnpD;
720 rsrc = BprocR; csrc = BmyprocD;
721 }
722 else
723 {
724 bscope =
CROW; mb = BnpD; nb = BnR;
725 rsrc = BmyprocD; csrc = BprocR;
726 }
728 if( BmyprocR == BprocR )
729 {
730 TYPE->Cgebs2d( ctxt, &bscope, top, mb, nb,
Mptr( B, Bii, Bjj,
731 Bld, size ), Bld );
732 }
733 else
734 {
735 TYPE->Cgebr2d( ctxt, &bscope, top, mb, nb,
Mptr( B, Bii, Bjj,
736 Bld, size ), Bld, rsrc, csrc );
737 }
738 }
739 }
740 }
741 else if( !( AisD ) && BisD )
742 {
743
744
745
746 PB_CpaxpbyND(
TYPE, CONJUG, M, N, ALPHA, A, IA, JA, DESCA, AROC, BETA, B,
747 IB, JB, DESCB, BROC );
748 }
749 else if( AisD && !( BisD ) )
750 {
751
752
753
754 PB_CpaxpbyDN(
TYPE, CONJUG, M, N, ALPHA, A, IA, JA, DESCA, AROC, BETA, B,
755 IB, JB, DESCB, BROC );
756 }
757 else
758 {
759
760
761
762 PB_CpaxpbyNN(
TYPE, CONJUG, M, N, ALPHA, A, IA, JA, DESCA, AROC, BETA, B,
763 IB, JB, DESCB, BROC );
764 }
765
766
767
768}