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 char * top;
205 Int AColSpan, ARowSpan, Acol, Aimb, Ainb, AisD, Amb, Amp, Anb,
206 Anq, Arow, Xcol, Xii, Ximb, Ximb1, Xinb, Xinb1, XisD, XisR,
207 XisRow, Xjj, Xld=1, Xmb, Xmp, Xnb, Xnq, Xrow, ctxt, mycol,
208 myrow, npcol, nprow;
209
210
211
212
213
214
215
216 *XAFREE = 0;
217 *XAPTR = NULL;
218
219
220
221 if( ( M <= 0 ) || ( N <= 0 ) || ( K <= 0 ) )
222 {
224 {
227 }
228 else
229 {
232 }
233 return;
234 }
235
236
237
239
240
241
242 Minfog2l( IX, JX, DESCX, nprow, npcol, myrow, mycol, Xii, Xjj, Xrow, Xcol );
243
244
245
246 if( ( XisRow = (
Mupcase( XROC[0] ) ==
CROW ) ) != 0 )
247 {
248 XisD = ( ( Xcol >= 0 ) && ( npcol > 1 ) );
249 XisR = ( ( Xrow == -1 ) || ( nprow == 1 ) );
250 }
251 else
252 {
253 XisD = ( ( Xrow >= 0 ) && ( nprow > 1 ) );
254 XisR = ( ( Xcol == -1 ) || ( npcol == 1 ) );
255 }
256
258
260 {
261
262
263
264 Ainb = DESCA[
INB_ ]; Anb = DESCA[
NB_ ];
265 Mnumroc( Anq, N, 0, Ainb, Anb, mycol, Acol, npcol );
266
267
268
269 ARowSpan = ( Arow < 0 ) ||
271
273 {
274
275
276
277
278 AisD = ( ( Acol >= 0 ) && ( npcol > 1 ) );
279
280 Xinb = DESCX[
INB_ ]; Xnb = DESCX[
NB_ ];
281 Mfirstnb( Xinb1, N, JX, Xinb, Xnb );
282
283
284
285
286
287
288 if( ( !AisD && !XisD ) ||
289 ( ( AisD && XisD ) &&
290 ( ( Acol == Xcol ) &&
291 ( ( ( Ainb >= N ) && ( Xinb1 >= N ) ) ||
292 ( ( Ainb == Xinb1 ) && ( Anb == Xnb ) ) ) ) ) )
293 {
294
295
296
297 Ximb = DESCX[
IMB_ ]; Xmb = DESCX[
MB_ ];
298 Mfirstnb( Ximb1, K, IX, Ximb, Xmb );
299
300 if( XisR || ( !ARowSpan && ( Arow == Xrow ) ) )
301 {
302
303
304
305
306
307 if( Anq > 0 )
308 {
310 if( ARowSpan || ( myrow == Arow ) )
311 *XAPTR =
Mptr( X, Xii, Xjj, Xld,
TYPE->size );
312 }
313 else
314 {
315 Xld = 1;
316 }
317 MDescSet( DXA, K, N, K, Xinb1, 1, Xnb, ( ARowSpan ? -1 : Arow ),
318 Xcol, ctxt, Xld );
319 }
320 else if( ARowSpan )
321 {
322
323
324
325
326
327 if( myrow == Xrow )
328 {
330 if( Anq > 0 )
331 {
332 *XAPTR =
Mptr( X, Xii, Xjj, Xld,
TYPE->size );
334 TYPE->Cgebs2d( ctxt,
COLUMN, top, K, Anq, *XAPTR, Xld );
335 }
336 }
337 else
338 {
340 if( Anq > 0 )
341 {
343 *XAFREE = 1;
345 TYPE->Cgebr2d( ctxt,
COLUMN, top, K, Anq, *XAPTR, Xld,
346 Xrow, mycol );
347 }
348 }
349 PB_Cdescset( DXA, K, N, K, Xinb1, 1, Xnb, -1, Xcol, ctxt, Xld );
350 }
351 else
352 {
353
354
355
356
357 if( myrow == Xrow )
358 {
360 if( Anq > 0 )
361 {
362 *XAPTR =
Mptr( X, Xii, Xjj, Xld,
TYPE->size );
363 TYPE->Cgesd2d( ctxt, K, Anq, *XAPTR, Xld, Arow, mycol );
364 }
365 }
366 else if( myrow == Arow )
367 {
369 if( Anq > 0 )
370 {
372 *XAFREE = 1;
373 TYPE->Cgerv2d( ctxt, K, Anq, *XAPTR, Xld, Xrow, mycol );
374 }
375 }
376 PB_Cdescset( DXA, K, N, K, Xinb1, 1, Xnb, Arow, Xcol, ctxt,
377 Xld );
378 }
379 return;
380 }
381 }
382
383
384
385 PB_Cdescset( DXA, K, N, K, Ainb, 1, Anb, ( ARowSpan ? -1 : Arow ), Acol,
386 ctxt, K );
387 Xmp = ( ARowSpan ? K : ( ( myrow == Arow ) ? K : 0 ) );
388 if( Xmp > 0 && Anq > 0 )
389 {
391 *XAFREE = 1;
392 }
393 if( XisRow )
394 {
395 PB_Cpaxpby(
TYPE, CONJUG, K, N,
TYPE->one, X, IX, JX, DESCX, XROC,
396 TYPE->zero, *XAPTR, 0, 0, DXA,
ROW );
397 }
398 else
399 {
400 PB_Cpaxpby(
TYPE, CONJUG, N, K,
TYPE->one, X, IX, JX, DESCX, XROC,
401 TYPE->zero, *XAPTR, 0, 0, DXA,
ROW );
402 }
403 }
404 else
405 {
406
407
408
409 Aimb = DESCA[
IMB_]; Amb = DESCA[
MB_];
410 Mnumroc( Amp, M, 0, Aimb, Amb, myrow, Arow, nprow );
411
412
413
414 AColSpan = ( Acol < 0 ) ||
416
418 {
419
420
421
422
423 AisD = ( ( Arow >= 0 ) && ( nprow > 1 ) );
424
425 Ximb = DESCX[
IMB_ ]; Xmb = DESCX[
MB_ ];
426 Mfirstnb( Ximb1, M, IX, Ximb, Xmb );
427
428
429
430
431
432
433 if( ( !AisD && !XisD ) ||
434 ( ( AisD && XisD ) &&
435 ( ( Arow == Xrow ) &&
436 ( ( ( Aimb >= M ) && ( Ximb1 >= M ) ) ||
437 ( ( Aimb == Ximb1 ) && ( Amb == Xmb ) ) ) ) ) )
438 {
439
440
441
442 Xinb = DESCX[
INB_ ]; Xnb = DESCX[
NB_ ];
443 Mfirstnb( Xinb1, K, JX, Xinb, Xnb );
444
445 if( XisR || ( !AColSpan && ( Acol == Xcol ) ) )
446 {
447
448
449
450
451
452 if( Amp > 0 )
453 {
455 if( AColSpan || ( mycol == Acol ) )
456 *XAPTR =
Mptr( X, Xii, Xjj, Xld,
TYPE->size );
457 }
458 else
459 {
460 Xld = 1;
461 }
462 MDescSet( DXA, M, K, Ximb1, K, Xmb, 1, Xrow,
463 ( AColSpan ? -1 : Acol ), ctxt, Xld );
464 }
465 else if( AColSpan )
466 {
467
468
469
470
471
472 if( mycol == Xcol )
473 {
475 if( Amp > 0 )
476 {
477 *XAPTR =
Mptr( X, Xii, Xjj, Xld,
TYPE->size );
479 TYPE->Cgebs2d( ctxt,
ROW, top, Amp, K, *XAPTR, Xld );
480 }
481 }
482 else
483 {
485 if( Amp > 0 )
486 {
488 *XAFREE = 1;
490 TYPE->Cgebr2d( ctxt,
ROW, top, Amp, K, *XAPTR, Xld, myrow,
491 Xcol );
492 }
493 }
494 PB_Cdescset( DXA, M, K, Ximb1, K, Xmb, 1, Xrow, -1, ctxt, Xld );
495 }
496 else
497 {
498
499
500
501
502 if( mycol == Xcol )
503 {
505 if( Amp > 0 )
506 {
507 *XAPTR =
Mptr( X, Xii, Xjj, Xld,
TYPE->size );
508 TYPE->Cgesd2d( ctxt, Amp, K, *XAPTR, Xld, myrow, Acol );
509 }
510 }
511 else if( mycol == Acol )
512 {
514 if( Amp > 0 )
515 {
517 *XAFREE = 1;
518 TYPE->Cgerv2d( ctxt, Amp, K, *XAPTR, Xld, myrow, Xcol );
519 }
520 }
521 PB_Cdescset( DXA, M, K, Ximb1, K, Xmb, 1, Xrow, Acol, ctxt,
522 Xld );
523 }
524 return;
525 }
526 }
527
528
529
530 PB_Cdescset( DXA, M, K, Aimb, K, Amb, 1, Arow, ( AColSpan ? -1 : Acol ),
531 ctxt,
MAX( 1, Amp ) );
532 Xnq = ( AColSpan ? K : ( ( mycol == Acol ) ? K : 0 ) );
533 if( Xnq > 0 && Amp > 0 )
534 {
536 *XAFREE = 1;
537 }
538 if( XisRow )
539 {
540 PB_Cpaxpby(
TYPE, CONJUG, K, M,
TYPE->one, X, IX, JX, DESCX, XROC,
542 }
543 else
544 {
545 PB_Cpaxpby(
TYPE, CONJUG, M, K,
TYPE->one, X, IX, JX, DESCX, XROC,
547 }
548 }
549
550
551
552}