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, XisR, XisRow, Xjj, Xld, Xlinc, XmyprocD,
223 XmyprocR, XnprocsR, XprocR, Xrow, Ycol, Yii, YisR, YisRow,
224 Yjj, Yld, Ylinc, YmyprocD, YmyprocR, YnprocsR, YprocR, Yrow,
225 csrc, ctxt, ione=1, mycol, myrow, npcol, nprow, rsrc, size;
226
227
228
229 char * buf = NULL;
230
231
232
233
234
235
236
238
239
240
241 PB_Cinfog2l( IX, JX, DESCX, nprow, npcol, myrow, mycol, &Xii, &Xjj,
242 &Xrow, &Xcol );
243 if( ( XisRow = ( INCX == DESCX[
M_] ) ) != 0 )
244 {
245 Xld = DESCX[
LLD_]; Xlinc = Xld;
246 XmyprocD = mycol; XprocR = Xrow; XmyprocR = myrow; XnprocsR = nprow;
247 XisR = ( ( Xrow == -1 ) || ( XnprocsR == 1 ) );
248 }
249 else
250 {
251 Xld = DESCX[
LLD_]; Xlinc = 1;
252 XmyprocD = myrow; XprocR = Xcol; XmyprocR = mycol; XnprocsR = npcol;
253 XisR = ( ( Xcol == -1 ) || ( XnprocsR == 1 ) );
254 }
255
256
257
258 PB_Cinfog2l( IY, JY, DESCY, nprow, npcol, myrow, mycol, &Yii, &Yjj,
259 &Yrow, &Ycol );
260 if( ( YisRow = ( INCY == DESCY[
M_] ) ) != 0 )
261 {
262 Yld = DESCY[
LLD_]; Ylinc = Yld;
263 YmyprocD = mycol; YprocR = Yrow; YmyprocR = myrow; YnprocsR = nprow;
264 YisR = ( ( Yrow == -1 ) || ( YnprocsR == 1 ) );
265 }
266 else
267 {
268 Yld = DESCY[
LLD_]; Ylinc = 1;
269 YmyprocD = myrow; YprocR = Ycol; YmyprocR = mycol; YnprocsR = npcol;
270 YisR = ( ( Ycol == -1 ) || ( YnprocsR == 1 ) );
271 }
272
273
274
275 RRorCC = ( ( XisRow && YisRow ) || ( !( XisRow ) && !( YisRow ) ) );
276
277
278
279 if( !XisR )
280 {
281
282
283
284 if( !( YisR ) )
285 {
286
287
288
289 if( ( XmyprocR != XprocR ) && ( YmyprocR != YprocR ) )
290
291
292
293 return;
294
296
297 if( RRorCC )
298 {
299
300
301
302 if( XprocR == YprocR )
303 {
304
305
306
307 FDOT( &N, DOT,
Mptr( X, Xii, Xjj, Xld, size ), &Xlinc,
Mptr( Y,
308 Yii, Yjj, Yld, size ), &Ylinc );
309 }
310 else
311 {
312
313
314
315 if( XmyprocR == XprocR )
316 {
318
319
320
321
322 if( XisRow )
323 {
324 TYPE->Cgesd2d( ctxt, 1, N,
Mptr( X, Xii, Xjj, Xld, size ),
325 Xld, YprocR, XmyprocD );
326 TYPE->Cgerv2d( ctxt, 1, N, buf, 1, YprocR, XmyprocD );
327 }
328 else
329 {
330 TYPE->Cgesd2d( ctxt, N, 1,
Mptr( X, Xii, Xjj, Xld, size ),
331 Xld, XmyprocD, YprocR );
332 TYPE->Cgerv2d( ctxt, N, 1, buf, N, XmyprocD, YprocR );
333 }
334 FDOT( &N, DOT,
Mptr( X, Xii, Xjj, Xld, size ), &Xlinc, buf,
335 &ione );
336 if( buf ) free( buf );
337 }
338
339 if( YmyprocR == YprocR )
340 {
342
343
344
345
346 if( YisRow )
347 {
348 TYPE->Cgesd2d( ctxt, 1, N,
Mptr( Y, Yii, Yjj, Yld, size ),
349 Yld, XprocR, YmyprocD );
350 TYPE->Cgerv2d( ctxt, 1, N, buf, 1, XprocR, YmyprocD );
351 }
352 else
353 {
354 TYPE->Cgesd2d( ctxt, N, 1,
Mptr( Y, Yii, Yjj, Yld, size ),
355 Yld, YmyprocD, XprocR );
356 TYPE->Cgerv2d( ctxt, N, 1, buf, N, YmyprocD, XprocR );
357 }
358 FDOT( &N, DOT, buf, &ione,
Mptr( Y, Yii, Yjj, Yld, size ),
359 &Ylinc );
360 if( buf ) free( buf );
361 }
362 }
363 }
364 else
365 {
366
367
368
369 if( ( XmyprocR == XprocR ) && ( YmyprocR == YprocR ) )
370 {
371
372
373
374
375 FDOT( &N, DOT,
Mptr( X, Xii, Xjj, Xld, size ), &Xlinc,
Mptr( Y,
376 Yii, Yjj, Yld, size ), &Ylinc );
378 TYPE->Cgebs2d( ctxt,
ROW, top, 1, 1, DOT, 1 );
380 TYPE->Cgebs2d( ctxt,
COLUMN, top, 1, 1, DOT, 1 );
381 }
382 else if( XmyprocR == XprocR )
383 {
384 if( XisRow ) { Xscope =
CROW; rsrc = XprocR; csrc = YprocR; }
385 else { Xscope =
CCOLUMN; rsrc = YprocR; csrc = XprocR; }
387 TYPE->Cgebr2d( ctxt, &Xscope, top, 1, 1, DOT, 1, rsrc, csrc );
388 }
389 else if( YmyprocR == YprocR )
390 {
391 if( YisRow ) { Yscope =
CROW; rsrc = YprocR; csrc = XprocR; }
392 else { Yscope =
CCOLUMN; rsrc = XprocR; csrc = YprocR; }
394 TYPE->Cgebr2d( ctxt, &Yscope, top, 1, 1, DOT, 1, rsrc, csrc );
395 }
396 }
397 }
398 else
399 {
400
401
402
403 if( XmyprocR == XprocR )
404 {
405
406
407
408
410
411 FDOT( &N, DOT,
Mptr( X, Xii, Xjj, Xld, size ), &Xlinc,
Mptr( Y, Yii,
412 Yjj, Yld, size ), &Ylinc );
413
414 if( XisRow )
415 {
417 TYPE->Cgebs2d( ctxt,
COLUMN, top, 1, 1, DOT, 1 );
418 }
419 else
420 {
422 TYPE->Cgebs2d( ctxt,
ROW, top, 1, 1, DOT, 1 );
423 }
424 }
425 else
426 {
427
428
429
430 if( XisRow )
431 {
433 TYPE->Cgebr2d( ctxt,
COLUMN, top, 1, 1, DOT, 1, XprocR,
434 XmyprocD );
435 }
436 else
437 {
439 TYPE->Cgebr2d( ctxt,
ROW, top, 1, 1, DOT, 1, XmyprocD,
440 XprocR );
441 }
442 }
443 }
444 }
445 else
446 {
447
448
449
450 if( YisR || ( YmyprocR == YprocR ) )
451 {
452
453
454
456
457 FDOT( &N, DOT,
Mptr( X, Xii, Xjj, Xld, size ), &Xlinc,
Mptr( Y, Yii,
458 Yjj, Yld, size ), &Ylinc );
459 }
460
461 if( !YisR )
462 {
463
464
465
466
467
468 if( YisRow )
469 {
471 if( YmyprocR == YprocR )
472 TYPE->Cgebs2d( ctxt,
COLUMN, top, 1, 1, DOT, 1 );
473 else
474 TYPE->Cgebr2d( ctxt,
COLUMN, top, 1, 1, DOT, 1, YprocR,
475 YmyprocD );
476 }
477 else
478 {
480 if( YmyprocR == YprocR )
481 TYPE->Cgebs2d( ctxt,
ROW, top, 1, 1, DOT, 1 );
482 else
483 TYPE->Cgebr2d( ctxt,
ROW, top, 1, 1, DOT, 1, YmyprocD, YprocR );
484 }
485 }
486 }
487
488
489
490}