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 char Xscope, Yscope, * top;
222 Int RRorCC, Xcol, Xii, XisD, XisOne, XisR, XisRow, Xjj, Xld,
223 Xlinc, XmyprocD, XmyprocR, XprocD, XprocR, Xrow, Ycol, Yii,
224 YisD, YisOne, YisR, YisRow, Yjj, YmyprocD, YmyprocR, YprocD,
225 YprocR, Yrow, cdst, ctxt, ione=1, mycol, myrow, npcol, nprow,
226 rdst;
227
228
229
231 char * buf = NULL;
232
233
234
235
236
237
238
240
241
242
243 PB_Cinfog2l( IX, JX, DESCX, nprow, npcol, myrow, mycol, &Xii, &Xjj,
244 &Xrow, &Xcol );
245 if( ( XisRow = ( INCX == DESCX[
M_ ] ) ) != 0 )
246 {
247 Xld = DESCX[
LLD_ ]; Xlinc = Xld;
248 XprocD = Xcol; XmyprocD = mycol; XprocR = Xrow; XmyprocR = myrow;
249 XisR = ( ( Xrow == -1 ) || ( nprow == 1 ) );
250 XisD = ( ( Xcol >= 0 ) && ( npcol > 1 ) );
251 }
252 else
253 {
254 Xld = DESCX[
LLD_ ]; Xlinc = 1;
255 XprocD = Xrow; XmyprocD = myrow; XprocR = Xcol; XmyprocR = mycol;
256 XisR = ( ( Xcol == -1 ) || ( npcol == 1 ) );
257 XisD = ( ( Xrow >= 0 ) && ( nprow > 1 ) );
258 }
259 XisOne = ( ( N == 1 ) && ( DESCX[
M_ ] == 1 ) );
260
261
262
263 PB_Cinfog2l( IY, JY, DESCY, nprow, npcol, myrow, mycol, &Yii, &Yjj,
264 &Yrow, &Ycol );
265 if( ( YisRow = ( INCY == DESCY[
M_ ] ) ) != 0 )
266 {
267 YprocD = Ycol; YmyprocD = mycol; YprocR = Yrow; YmyprocR = myrow;
268 YisR = ( ( Yrow == -1 ) || ( nprow == 1 ) );
269 YisD = ( ( Ycol >= 0 ) && ( npcol > 1 ) );
270 }
271 else
272 {
273 YprocD = Yrow; YmyprocD = myrow; YprocR = Ycol; YmyprocR = mycol;
274 YisR = ( ( Ycol == -1 ) || ( npcol == 1 ) );
275 YisD = ( ( Yrow >= 0 ) && ( nprow > 1 ) );
276 }
277 YisOne = ( ( N == 1 ) && ( DESCY[
M_ ] == 1 ) );
278
279
280
281 RRorCC = ( ( XisRow && YisRow ) || ( !( XisRow ) && !( YisRow ) ) );
282
283
284
285 PB_Cdescset( dbuf, 1, 1, 1, 1, 1, 1, Xrow, Xcol, ctxt, 1 );
290
291
292
293 if( XisR || ( XmyprocR == XprocR ) )
294 {
295 if( ( XisD && ( XmyprocD == XprocD ) ) || ( !XisD ) )
296 FDOT( &ione, DOT,
Mptr( X, Xii, Xjj, Xld,
TYPE->size ), &Xlinc, buf,
297 &ione );
298 if( XisD && !XisOne )
299 {
302 TYPE->Cgsum2d( ctxt, &Xscope, top, 1, 1, DOT, 1, -1, 0 );
303 }
304 }
305 if( buf ) free( buf );
306
307
308
309 if( XisD && XisOne )
310 {
311
312
313
314 if( XisR )
315 {
316
317
318
319 if( RRorCC )
320 {
321
322
323
324 if( YisR || YmyprocR == YprocR )
325 {
326
327
328
329 if( YisD && YisOne )
330 {
331
332
333
334 if( XprocD != YprocD )
335 {
336 if( XmyprocD == XprocD )
337 TYPE->Cgesd2d( ctxt, 1, 1, DOT, 1, XmyprocR, YprocD );
338 else if( YmyprocD == YprocD )
339 TYPE->Cgerv2d( ctxt, 1, 1, DOT, 1, XmyprocR, XprocD );
340 }
341 }
342 else
343 {
344
345
346
348 if( XmyprocD == XprocD )
349 TYPE->Cgebs2d( ctxt,
ROW, top, 1, 1, DOT, 1 );
350 else
351 TYPE->Cgebr2d( ctxt,
ROW, top, 1, 1, DOT, 1, XmyprocR,
352 XprocD );
353 }
354 }
355 }
356 else
357 {
358
359
360
361 if( YisR )
362 {
363
364
365
367 if( XmyprocD == XprocD )
368 TYPE->Cgebs2d( ctxt,
ROW, top, 1, 1, DOT, 1 );
369 else
370 TYPE->Cgebr2d( ctxt,
ROW, top, 1, 1, DOT, 1, XmyprocR,
371 XprocD );
372 }
373 else if( XprocD != YprocR )
374 {
375
376
377
378 if( XmyprocD == XprocD )
379 TYPE->Cgesd2d( ctxt, 1, 1, DOT, 1, XmyprocR, YprocR );
380 if( YmyprocR == YprocR )
381 TYPE->Cgerv2d( ctxt, 1, 1, DOT, 1, XmyprocR, XprocD );
382 }
383 }
384 }
385 else
386 {
387
388
389
390 if( YisD && YisOne )
391 {
392
393
394
395
396 if( ( XprocD != YprocD ) || ( !YisR && ( XprocR != YprocR ) ) )
397 {
398
399
400
401
402 rdst = ( YisR ? XprocR : YprocR );
403 if( ( XmyprocR == XprocR ) && ( XmyprocD == XprocD ) )
404 TYPE->Cgesd2d( ctxt, 1, 1, DOT, 1, rdst, YprocD );
405 if( ( YmyprocR == rdst ) && ( YmyprocD == YprocD ) )
406 TYPE->Cgerv2d( ctxt, 1, 1, DOT, 1, XprocR, XprocD );
407 }
408
409 if( YisR && ( YmyprocD == YprocD ) )
410 {
411
412
413
415 if( XmyprocR == XprocR )
416 TYPE->Cgebs2d( ctxt,
COLUMN, top, 1, 1, DOT, 1 );
417 else
418 TYPE->Cgebr2d( ctxt,
COLUMN, top, 1, 1, DOT, 1, XprocR,
419 YprocD );
420 }
421 }
422 else if( !YisR )
423 {
424
425
426
427 if( YisRow ) { Yscope =
CROW; rdst = YprocR; cdst = XprocD; }
428 else { Yscope =
CCOLUMN; rdst = XprocR; cdst = YprocR; }
429
430
431
432
433
434
435 if( ( RRorCC && ( XprocR != YprocR ) ) ||
436 ( !( RRorCC ) && ( XprocD != YprocR ) ) )
437 {
438 if( ( XmyprocR == XprocR ) && ( XmyprocD == XprocD ) )
439 TYPE->Cgesd2d( ctxt, 1, 1, DOT, 1, rdst, cdst );
440 if( ( myrow == rdst ) && ( mycol == cdst ) )
441 TYPE->Cgerv2d( ctxt, 1, 1, DOT, 1, XprocR, XprocD );
442 }
443
444
445
446 if( ( myrow == rdst ) && ( mycol == cdst ) )
447 {
449 TYPE->Cgebs2d( ctxt, &Yscope, top, 1, 1, DOT, 1 );
450 }
451 else if( ( YisRow && ( myrow == rdst ) ) ||
452 ( !( YisRow ) && ( mycol == cdst ) ) )
453 {
455 TYPE->Cgebr2d( ctxt, &Yscope, top, 1, 1, DOT, 1, rdst, cdst );
456 }
457 }
458 else
459 {
460
461
462
464 if( ( XmyprocR == XprocR ) && ( XmyprocD == XprocD ) )
465 {
466 TYPE->Cgebs2d( ctxt,
ALL, top, 1, 1, DOT, 1 );
467 }
468 else
469 {
470 TYPE->Cgebr2d( ctxt,
ALL, top, 1, 1, DOT, 1, XprocR, XprocD );
471 }
472 }
473 }
474 }
475 else
476 {
477
478
479
480 if( XisR ) return;
481
482 if( RRorCC )
483 {
484
485
486
487
488 if( YisD && YisOne && ( YmyprocD != YprocD ) ) return;
489
490 if( YisR )
491 {
492
493
494
495 if( XisRow )
496 {
498 if( XmyprocR == XprocR )
499 TYPE->Cgebs2d( ctxt,
COLUMN, top, 1, 1, DOT, 1 );
500 else
501 TYPE->Cgebr2d( ctxt,
COLUMN, top, 1, 1, DOT, 1, XprocR,
502 XmyprocD );
503 }
504 else
505 {
507 if( XmyprocR == XprocR )
508 TYPE->Cgebs2d( ctxt,
ROW, top, 1, 1, DOT, 1 );
509 else
510 TYPE->Cgebr2d( ctxt,
ROW, top, 1, 1, DOT, 1, XmyprocD,
511 XprocR );
512 }
513 }
514 else if( XprocR != YprocR )
515 {
516
517
518
519 if( XisRow )
520 {
521 if( XmyprocR == XprocR )
522 TYPE->Cgesd2d( ctxt, 1, 1, DOT, 1, YprocR, YmyprocD );
523 if( YmyprocR == YprocR )
524 TYPE->Cgerv2d( ctxt, 1, 1, DOT, 1, XprocR, XmyprocD );
525 }
526 else
527 {
528 if( XmyprocR == XprocR )
529 TYPE->Cgesd2d( ctxt, 1, 1, DOT, 1, YmyprocD, YprocR );
530 if( YmyprocR == YprocR )
531 TYPE->Cgerv2d( ctxt, 1, 1, DOT, 1, XmyprocD, XprocR );
532 }
533 }
534 }
535 else
536 {
537
538
539
540
541
542
543 if( XisRow || !( YisD ) || ( YisD && !( YisOne ) ) )
544 {
545 if( YisR || YmyprocR == YprocR )
546 {
547 if( XisRow )
548 {
550 if( XmyprocR == XprocR )
551 TYPE->Cgebs2d( ctxt,
COLUMN, top, 1, 1, DOT, 1 );
552 else
553 TYPE->Cgebr2d( ctxt,
COLUMN, top, 1, 1, DOT, 1, XprocR,
554 XmyprocD );
555 }
556 else
557 {
559 if( XmyprocR == XprocR )
560 TYPE->Cgebs2d( ctxt,
ROW, top, 1, 1, DOT, 1 );
561 else
562 TYPE->Cgebr2d( ctxt,
ROW, top, 1, 1, DOT, 1, XmyprocD,
563 XprocR );
564 }
565 }
566 }
567 else if( XprocR != YprocD )
568 {
569
570
571
572
573
574 if( YisR || YmyprocR == YprocR )
575 {
576 if( XmyprocR == XprocR )
577 {
578 TYPE->Cgesd2d( ctxt, 1, 1, DOT, 1, YmyprocR, YprocD );
579 }
580 if( YmyprocD == YprocD )
581 {
582 TYPE->Cgerv2d( ctxt, 1, 1, DOT, 1, YmyprocR, XprocR );
583 }
584 }
585 }
586 }
587 }
588
589
590
591}