36{
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 char Xscope, Yscope, * top;
186 Int RRorCC, XYm, XYn, Xcol, Xii, XisR, XisRow, Xjj, Xld, Xlinc,
187 XmyprocD, XmyprocR, XnprocsR, XprocR, Xrow, Ycol, Yii, YisR,
188 YisRow, Yjj, Yld, Ylinc, YmyprocD, YmyprocR, YnprocsR, YprocR,
189 Yrow, csrc, ctxt, mycol, myrow, npcol, nprow, rsrc, size;
190
191
192
193
194
195
196
198
199
200
201 PB_Cinfog2l( IX, JX, DESCX, nprow, npcol, myrow, mycol, &Xii, &Xjj,
202 &Xrow, &Xcol );
203 if( ( XisRow = ( INCX == DESCX[
M_] ) ) != 0 )
204 {
205 Xld = DESCX[
LLD_]; Xlinc = Xld;
206 XmyprocD = mycol; XprocR = Xrow; XmyprocR = myrow; XnprocsR = nprow;
207 XisR = ( ( Xrow == -1 ) || ( XnprocsR == 1 ) );
208 }
209 else
210 {
211 Xld = DESCX[
LLD_]; Xlinc = 1;
212 XmyprocD = myrow; XprocR = Xcol; XmyprocR = mycol; XnprocsR = npcol;
213 XisR = ( ( Xcol == -1 ) || ( XnprocsR == 1 ) );
214 }
215
216
217
218 PB_Cinfog2l( IY, JY, DESCY, nprow, npcol, myrow, mycol, &Yii, &Yjj,
219 &Yrow, &Ycol );
220 if( ( YisRow = ( INCY == DESCY[
M_] ) ) != 0 )
221 {
222 Yld = DESCY[
LLD_]; Ylinc = Yld;
223 YmyprocD = mycol; YprocR = Yrow; YmyprocR = myrow; YnprocsR = nprow;
224 YisR = ( ( Yrow == -1 ) || ( YnprocsR == 1 ) );
225 }
226 else
227 {
228 Yld = DESCY[
LLD_]; Ylinc = 1;
229 YmyprocD = myrow; YprocR = Ycol; YmyprocR = mycol; YnprocsR = npcol;
230 YisR = ( ( Ycol == -1 ) || ( YnprocsR == 1 ) );
231 }
232
233
234
235 RRorCC = ( ( XisRow && YisRow ) || ( !( XisRow ) && !( YisRow ) ) );
236
237
238
239 if( !XisR )
240 {
241
242
243
244 if( !( YisR ) )
245 {
246
247
248
249 if( ( XmyprocR != XprocR ) && ( YmyprocR != YprocR ) )
250
251
252
253 return;
254
256
257 if( RRorCC )
258 {
259
260
261
262 if( XprocR == YprocR )
263 {
264
265
266
267 TYPE->Fswap( &N,
Mptr( X, Xii, Xjj, Xld, size ), &Xlinc,
Mptr( Y,
268 Yii, Yjj, Yld, size ), &Ylinc );
269 }
270 else
271 {
272
273
274
275 if( XmyprocR == XprocR )
276 {
277
278
279
280
281 if( XisRow )
282 {
283 TYPE->Cgesd2d( ctxt, 1, N,
Mptr( X, Xii, Xjj, Xld, size ),
284 Xld, YprocR, XmyprocD );
285 TYPE->Cgerv2d( ctxt, 1, N,
Mptr( X, Xii, Xjj, Xld, size ),
286 Xld, YprocR, XmyprocD );
287 }
288 else
289 {
290 TYPE->Cgesd2d( ctxt, N, 1,
Mptr( X, Xii, Xjj, Xld, size ),
291 Xld, XmyprocD, YprocR );
292 TYPE->Cgerv2d( ctxt, N, 1,
Mptr( X, Xii, Xjj, Xld, size ),
293 Xld, XmyprocD, YprocR );
294 }
295 }
296
297 if( YmyprocR == YprocR )
298 {
299
300
301
302
303 if( YisRow )
304 {
305 TYPE->Cgesd2d( ctxt, 1, N,
Mptr( Y, Yii, Yjj, Yld, size ),
306 Yld, XprocR, YmyprocD );
307 TYPE->Cgerv2d( ctxt, 1, N,
Mptr( Y, Yii, Yjj, Yld, size ),
308 Yld, XprocR, YmyprocD );
309 }
310 else
311 {
312 TYPE->Cgesd2d( ctxt, N, 1,
Mptr( Y, Yii, Yjj, Yld, size ),
313 Yld, YmyprocD, XprocR );
314 TYPE->Cgerv2d( ctxt, N, 1,
Mptr( Y, Yii, Yjj, Yld, size ),
315 Yld, YmyprocD, XprocR );
316 }
317 }
318 }
319 }
320 else
321 {
322
323
324
325 if( XisRow )
326 {
327 XYm = 1; XYn = N;
329 rsrc = XprocR; csrc = YprocR;
330 }
331 else
332 {
333 XYm = N; XYn = 1;
335 rsrc = YprocR; csrc = XprocR;
336 }
337
338 if( ( XmyprocR == XprocR ) && ( YmyprocR == YprocR ) )
339 {
340
341
342
343
344 TYPE->Fswap( &N,
Mptr( X, Xii, Xjj, Xld, size ), &Xlinc,
345 Mptr( Y, Yii, Yjj, Yld, size ), &Ylinc );
347 TYPE->Cgebs2d( ctxt, &Xscope, top, XYm, XYn,
Mptr( X, Xii, Xjj,
348 Xld, size ), Xld );
350 TYPE->Cgebs2d( ctxt, &Yscope, top, XYn, XYm,
Mptr( Y, Yii, Yjj,
351 Yld, size ), Yld );
352 }
353 else if( XmyprocR == XprocR )
354 {
356 TYPE->Cgebr2d( ctxt, &Xscope, top, XYm, XYn,
Mptr( X, Xii, Xjj,
357 Xld, size ), Xld, rsrc, csrc );
358 }
359 else if( YmyprocR == YprocR )
360 {
362 TYPE->Cgebr2d( ctxt, &Yscope, top, XYn, XYm,
Mptr( Y, Yii, Yjj,
363 Yld, size ), Yld, rsrc, csrc );
364 }
365 }
366 }
367 else
368 {
369
370
371
373
374 if( YisRow ) { XYm = 1; XYn = N; }
375 else { XYm = N; XYn = 1; }
376
377 if( XmyprocR == XprocR )
378 {
379
380
381
382
383 TYPE->Fswap( &N,
Mptr( X, Xii, Xjj, Xld, size ), &Xlinc,
Mptr( Y,
384 Yii, Yjj, Yld, size ), &Ylinc );
385
386 if( XisRow )
387 {
390 Yld, size ), Yld );
391 }
392 else
393 {
395 TYPE->Cgebs2d( ctxt,
ROW, top, XYm, XYn,
Mptr( Y, Yii, Yjj,
396 Yld, size ), Yld );
397 }
398 }
399 else
400 {
401
402
403
404 if( XisRow )
405 {
408 Yld, size ), Yld, XprocR, XmyprocD );
409 }
410 else
411 {
413 TYPE->Cgebr2d( ctxt,
ROW, top, XYm, XYn,
Mptr( Y, Yii, Yjj,
414 Yld, size ), Yld, XmyprocD, XprocR );
415 }
416 }
417 }
418 }
419 else
420 {
421
422
423
425
426 if( YisR || ( YmyprocR == YprocR ) )
427 {
428
429
430
431 TYPE->Fswap( &N,
Mptr( X, Xii, Xjj, Xld, size ), &Xlinc,
Mptr( Y, Yii,
432 Yjj, Yld, size ), &Ylinc );
433 }
434
435 if( !YisR )
436 {
437
438
439
440
441
442 if( XisRow ) { XYm = 1; XYn = N; }
443 else { XYm = N; XYn = 1; }
444
445 if( YisRow )
446 {
448 if( YmyprocR == YprocR )
450 Xld, size ), Xld );
451 else
453 Xld, size ), Xld, YprocR, YmyprocD );
454 }
455 else
456 {
458 if( YmyprocR == YprocR )
459 TYPE->Cgebs2d( ctxt,
ROW, top, XYm, XYn,
Mptr( X, Xii, Xjj,
460 Xld, size ), Xld );
461 else
462 TYPE->Cgebr2d( ctxt,
ROW, top, XYm, XYn,
Mptr( X, Xii, Xjj,
463 Xld, size ), Xld, YmyprocD, YprocR );
464 }
465 }
466 }
467
468
469
470}