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