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
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 char scope, * top;
209 Int OneBlock, OneDgrid, RRorCC, Square, Xcol, Xi, Xii, XinbD,
210 Xinb1D, XisD, XisR, XisRow, Xj, Xjj, Xld, Xlinc, XmyprocD,
211 XmyprocR, XnbD, XnpD, XnprocsD, XnprocsR, XprocD, XprocR,
212 Xrow, Ycol, Yi, Yii, YinbD, Yinb1D, YisD, YisR, YisRow, Yj,
213 Yjj, Yld, Ylinc, YmyprocD, YmyprocR, YnbD, YnpD, YnprocsD,
214 YnprocsR, YprocD, YprocR, Yrow, cdst, csrc, ctxt, dst, info,
215 ione=1, mycol, myrow, npcol, nprow, rdst, rsrc, size, src;
218
219
220
221 char * buf = NULL;
223
224
225
226
229#ifndef NO_ARGCHK
230
231
232
234 if( !( info = ( ( nprow == -1 ) ? -( 601 +
CTXT_ ) : 0 ) ) )
235 {
236 PB_Cchkvec( ctxt,
"PSDOT",
"X", *N, 1, Xi, Xj, Xd, *INCX, 6, &info );
237 PB_Cchkvec( ctxt,
"PSDOT",
"Y", *N, 1, Yi, Yj, Yd, *INCY, 11, &info );
238 }
239 if( info ) {
PB_Cabort( ctxt,
"PSDOT", info );
return; }
240#endif
242
243
244
245 if( *N == 0 ) return;
246
247
248
249 if( ( *N == 1 ) && ( ( Xd[
M_ ] == 1 ) || ( Yd[
M_ ] == 1 ) ) )
250 {
252 PB_Cpdot11( type, *N, ((
char *) DOT), ((
char *) X), Xi, Xj, Xd, *INCX,
253 ((
char *) Y), Yi, Yj, Yd, *INCY, type->
Fvvdotu );
254 return;
255 }
256
257
258
259#ifdef NO_ARGCHK
261#endif
262
263
264
265 if( ( XisRow = ( *INCX == Xd[
M_] ) ) != 0 )
266 XisD = ( ( Xd[
CSRC_] >= 0 ) && ( ( XnprocsD = npcol ) > 1 ) );
267 else
268 XisD = ( ( Xd[
RSRC_] >= 0 ) && ( ( XnprocsD = nprow ) > 1 ) );
269
270
271
272 if( ( YisRow = ( *INCY == Yd[
M_] ) ) != 0 )
273 YisD = ( ( Yd[
CSRC_] >= 0 ) && ( ( YnprocsD = npcol ) > 1 ) );
274 else
275 YisD = ( ( Yd[
RSRC_] >= 0 ) && ( ( YnprocsD = nprow ) > 1 ) );
276
277
278
279 RRorCC = ( ( XisRow && YisRow ) || ( !( XisRow ) && !( YisRow ) ) );
280
281
282
283 if( XisD && YisD )
284 {
285
286
287
288 PB_Cinfog2l( Xi, Xj, Xd, nprow, npcol, myrow, mycol, &Xii, &Xjj,
289 &Xrow, &Xcol );
290 if( XisRow )
291 {
292 XinbD = Xd[
INB_]; XnbD = Xd[
NB_];
293 Xld = Xd[
LLD_]; Xlinc = Xld;
294 XprocD = Xcol; XmyprocD = mycol;
295 XprocR = Xrow; XmyprocR = myrow; XnprocsR = nprow;
296 XisR = ( ( Xrow == -1 ) || ( XnprocsR == 1 ) );
297 Mfirstnb( Xinb1D, *N, Xj, XinbD, XnbD );
298 }
299 else
300 {
301 XinbD = Xd[
IMB_]; XnbD = Xd[
MB_];
302 Xld = Xd[
LLD_]; Xlinc = 1;
303 XprocD = Xrow; XmyprocD = myrow;
304 XprocR = Xcol; XmyprocR = mycol; XnprocsR = npcol;
305 XisR = ( ( Xcol == -1 ) || ( XnprocsR == 1 ) );
306 Mfirstnb( Xinb1D, *N, Xi, XinbD, XnbD );
307 }
308
309
310
311 PB_Cinfog2l( Yi, Yj, Yd, nprow, npcol, myrow, mycol, &Yii, &Yjj,
312 &Yrow, &Ycol );
313 if( YisRow )
314 {
315 YinbD = Yd[
INB_]; YnbD = Yd[
NB_];
316 Yld = Yd[
LLD_]; Ylinc = Yld;
317 YprocD = Ycol; YmyprocD = mycol;
318 YprocR = Yrow; YmyprocR = myrow; YnprocsR = nprow;
319 YisR = ( ( Yrow == -1 ) || ( YnprocsR == 1 ) );
320 Mfirstnb( Yinb1D, *N, Yj, YinbD, YnbD );
321 }
322 else
323 {
324 YinbD = Yd[
IMB_]; YnbD = Yd[
MB_];
325 Yld = Yd[
LLD_]; Ylinc = 1;
326 YprocD = Yrow; YmyprocD = myrow;
327 YprocR = Ycol; YmyprocR = mycol; YnprocsR = npcol;
328 YisR = ( ( Ycol == -1 ) || ( YnprocsR == 1 ) );
329 Mfirstnb( Yinb1D, *N, Yi, YinbD, YnbD );
330 }
331
332
333
334 OneDgrid = ( ( XnprocsD == 1 ) && ( YnprocsD == 1 ) );
335 OneBlock = ( ( Xinb1D >= *N ) && ( Yinb1D >= *N ) );
336
337
338
339 Square = ( ( Xinb1D == Yinb1D ) && ( XnbD == YnbD ) &&
340 ( XnprocsD == YnprocsD ) );
341
342 if( !( XisR ) )
343 {
344
345
346
347 if( YisR )
348 {
349
350
351
352
353
354 if( RRorCC )
355 {
356
357
358
359 if( ( OneDgrid || OneBlock || Square ) && ( XprocD == YprocD ) )
360 {
361
362
363
364
365 YprocR = XprocR;
366 }
367 else
368 {
369
370
371
372
373 YprocR =
MModAdd1( XprocR, XnprocsR );
374 }
375 }
376 else
377 {
378
379
380
381
382 YprocR = XprocD;
383 }
384 }
385 else
386 {
387
388
389
390
391 if( ( XmyprocR != XprocR ) && ( YmyprocR != YprocR ) )
392 return;
393 }
394 }
395 else
396 {
397
398
399
400 if( YisR )
401 {
402
403
404
405 if( RRorCC )
406 {
407
408
409
410 if( ( OneDgrid || OneBlock || Square ) && ( XprocD == YprocD ) )
411 {
412
413
414
415
416
417 XprocR = YprocR = 0;
418 }
419 else
420 {
421
422
423
424
425
426 YprocR = 0;
427 XprocR =
MModAdd1( YprocR, YnprocsR );
428 }
429 }
430 else
431 {
432
433
434
435
436 XprocR = YprocD;
437 YprocR = XprocD;
438 }
439 }
440 else
441 {
442
443
444
445 if( RRorCC )
446 {
447
448
449
450 if( ( OneDgrid || OneBlock || Square ) && ( XprocD == YprocD ) )
451 {
452
453
454
455
456 XprocR = YprocR;
457 }
458 else
459 {
460
461
462
463
464 XprocR =
MModAdd1( YprocR, YnprocsR );
465 }
466 }
467 else
468 {
469
470
471
472
473 XprocR = YprocD;
474 }
475 }
476 }
477
478
479
480
481
483
484
485
486
487
488 if( ( ( RRorCC && ( XprocD == YprocD ) && ( XprocR == YprocR ) ) ||
489 ( !( RRorCC ) && ( XprocD == YprocR ) && ( XprocR == YprocD ) ) ) &&
490 ( OneDgrid || OneBlock || ( RRorCC && Square ) ) )
491 {
492 if( ( !XisR && ( XmyprocR == XprocR ) &&
493 !YisR && ( YmyprocR == YprocR ) ) ||
494 ( !XisR && YisR && ( YmyprocR == YprocR ) ) ||
495 ( !YisR && XisR && ( XmyprocR == XprocR ) ) ||
496 ( XisR && YisR ) )
497 {
498 XnpD =
PB_Cnumroc( *N, 0, Xinb1D, XnbD, XmyprocD, XprocD,
499 XnprocsD );
500 YnpD =
PB_Cnumroc( *N, 0, Yinb1D, YnbD, YmyprocD, YprocD,
501 YnprocsD );
502 if( ( XnpD > 0 ) && ( YnpD > 0 ) )
503 {
504 dot( &XnpD, ((
char *) DOT),
Mptr( ((
char *) X), Xii, Xjj, Xld,
505 size ), &Xlinc,
Mptr( ((
char *) Y), Yii, Yjj, Yld, size ),
506 &Ylinc );
507 }
508 }
509
510
511
512 if( ( XisR && YisR ) || ( XmyprocR == XprocR ) )
513 {
516 Csgsum2d( ctxt, &scope, top, 1, 1, ((
char *) DOT), 1, -1, 0 );
517 }
518 if( RRorCC && XisR && YisR ) return;
519 }
520 else if( ( RRorCC && OneDgrid ) || OneBlock || Square )
521 {
522
523
524
525
526
527
528 if( ( YmyprocR == YprocR ) )
529 {
530
531
532
533
534 YnpD =
PB_Cnumroc( *N, 0, Yinb1D, YnbD, YmyprocD, YprocD,
535 YnprocsD );
536 if( YnpD > 0 )
537 {
538 dst = XprocD +
MModSub( YmyprocD, YprocD, YnprocsD );
539 dst =
MPosMod( dst, XnprocsD );
540 if( XisRow ) { rdst = XprocR; cdst = dst; }
541 else { rdst = dst; cdst = XprocR; }
542
543 if( ( myrow == rdst ) && ( mycol == cdst ) )
544 {
545 dot( &YnpD, ((
char *) DOT),
Mptr( ((
char *) X), Xii, Xjj, Xld,
546 size ), &Xlinc,
Mptr( ((
char *) Y), Yii, Yjj, Yld,
547 size ), &Ylinc );
548 }
549 else
550 {
551 if( YisRow )
553 Yld, size ), Yld, rdst, cdst );
554 else
556 Yld, size ), Yld, rdst, cdst );
557 }
558 }
559 }
560 if( XmyprocR == XprocR )
561 {
562
563
564
565
566
567 XnpD =
PB_Cnumroc( *N, 0, Xinb1D, XnbD, XmyprocD, XprocD,
568 XnprocsD );
569 if( XnpD > 0 )
570 {
571 src = YprocD +
MModSub( XmyprocD, XprocD, XnprocsD );
572 src =
MPosMod( src, YnprocsD );
573 if( YisRow ) { rsrc = YprocR; csrc = src; }
574 else { rsrc = src; csrc = YprocR; }
575 if( ( myrow != rsrc ) || ( mycol != csrc ) )
576 {
578 if( YisRow )
579 Csgerv2d( ctxt, 1, XnpD, buf, 1, rsrc, csrc );
580 else
581 Csgerv2d( ctxt, XnpD, 1, buf, XnpD, rsrc, csrc );
582 dot( &XnpD, ((
char *) DOT),
Mptr( ((
char *) X), Xii, Xjj, Xld,
583 size ), &Xlinc, buf, &ione );
584 if( buf ) free( buf );
585 }
586 }
587 if( XisRow )
588 {
590 Csgsum2d( ctxt,
ROW, top, 1, 1, ((
char*)DOT), 1, -1, 0 );
591 }
592 else
593 {
596 }
597 }
598 }
599 else
600 {
601
602
603
604
605 XnpD =
PB_Cnumroc( *N, 0, Xinb1D, XnbD, XmyprocD, XprocD, XnprocsD );
606
607 if( XisRow )
608 {
609 PB_Cdescset( dbuf, 1, *N, 1, Xinb1D, 1, XnbD, XprocR, XprocD, ctxt,
610 1 );
611 }
612 else
613 {
614 PB_Cdescset( dbuf, *N, 1, Xinb1D, 1, XnbD, 1, XprocD, XprocR, ctxt,
616 }
617 if( ( XmyprocR == XprocR ) && ( XnpD > 0 ) )
619
620 if( YisRow )
621 {
623 Yd,
ROW, type->
zero, buf, 0, 0, dbuf, ( XisRow ?
ROW :
625 }
626 else
627 {
629 Yd,
COLUMN, type->
zero, buf, 0, 0, dbuf, ( XisRow ?
631 }
632
633 if( XmyprocR == XprocR )
634 {
635 if( XnpD > 0 )
636 {
637 dot( &XnpD, ((
char *) DOT),
Mptr( ((
char *) X), Xii, Xjj, Xld,
638 size ), &Xlinc, buf, &ione );
639 if( buf ) free( buf );
640 }
641 if( XisRow )
642 {
644 Csgsum2d( ctxt,
ROW, top, 1, 1, ((
char*)DOT), 1, -1, 0 );
645 }
646 else
647 {
650 }
651 }
652 }
653
654
655
656 if( XisR || YisR )
657 {
658
659
660
661
662 if( XisRow )
663 {
665 if( XmyprocR == XprocR )
667 else
669 XmyprocD );
670 }
671 else
672 {
674 if( XmyprocR == XprocR )
676 else
677 Csgebr2d( ctxt,
ROW, top, 1, 1, ((
char*)DOT), 1, XmyprocD,
678 XprocR );
679 }
680 }
681 else
682 {
683
684
685
686 if( RRorCC )
687 {
688
689
690
691
692 if( XprocR != YprocR )
693 {
694 if( XmyprocR == XprocR )
695 {
696 if( XisRow )
697 Csgesd2d( ctxt, 1, 1, ((
char *) DOT), 1, YprocR,
698 YmyprocD );
699 else
700 Csgesd2d( ctxt, 1, 1, ((
char *) DOT), 1, YmyprocD,
701 YprocR );
702 }
703 else if( YmyprocR == YprocR )
704 {
705 if( XisRow )
706 Csgerv2d( ctxt, 1, 1, ((
char *) DOT), 1, XprocR,
707 XmyprocD );
708 else
709 Csgerv2d( ctxt, 1, 1, ((
char *) DOT), 1, XmyprocD,
710 XprocR );
711 }
712 }
713 }
714 else
715 {
716
717
718
719
720 if( YmyprocR == YprocR )
721 {
722 if( YisRow )
723 {
725 if( YmyprocD == XprocR )
727 else
729 YprocR, XprocR );
730 }
731 else
732 {
734 if( YmyprocD == XprocR )
736 else
738 XprocR, YprocR );
739 }
740 }
741 }
742 }
743 }
744 else if( !( XisD ) && YisD )
745 {
746
747
748
750 PB_CpdotND( type, *N, ((
char *) DOT), ((
char *) X), Xi, Xj, Xd, *INCX,
751 ((
char *) Y), Yi, Yj, Yd, *INCY, type->
Fvvdotu );
752 }
753 else if( XisD && !( YisD ) )
754 {
755
756
757
759 PB_CpdotND( type, *N, ((
char *) DOT), ((
char *) Y), Yi, Yj, Yd, *INCY,
760 ((
char *) X), Xi, Xj, Xd, *INCX, type->
Fvvdotu );
761 }
762 else
763 {
764
765
766
768 PB_CpdotNN( type, *N, ((
char *) DOT), ((
char *) X), Xi, Xj, Xd, *INCX,
769 ((
char *) Y), Yi, Yj, Yd, *INCY, type->
Fvvdotu );
770 }
771
772
773
774}