35{
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 char cbtop, cctop, rbtop, rctop;
184 Int Xcol, Xgindx, Xi, Xii, Ximb, Xinb, Xj, Xjj, Xlindx, Xld, Xmb,
185 Xnb, Xnp, Xnq, Xrow, Xsrc, ctxt, dist, dst, idumm, info, k,
186 maxpos, mycol, mydist, myrow, npcol, nprow, src, size;
188
189
190
191 char * Xptr;
194
195
196
197
199#ifndef NO_ARGCHK
200
201
202
204 if( !( info = ( ( nprow == -1 ) ? -( 701 +
CTXT_ ) : 0 ) ) )
205 PB_Cchkvec( ctxt,
"PZAMAX",
"X", *N, 1, Xi, Xj, Xd, *INCX, 7, &info );
206 if( info ) {
PB_Cabort( ctxt,
"PZAMAX", info );
return; }
207#endif
208
209
210
212
213
214
215 if( *N == 0 ) return;
216
217
218
219#ifdef NO_ARGCHK
221#endif
222
223
224
225 PB_Cinfog2l( Xi, Xj, Xd, nprow, npcol, myrow, mycol, &Xii, &Xjj,
226 &Xrow, &Xcol );
227
228
229
230 if( ( *INCX == 1 ) && ( Xd[
M_] == 1 ) && ( *N == 1 ) )
231 {
232
233
234
235 if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
236 ( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
237 {
238 *INDX = *JX;
240 Xptr =
Mptr( ((
char *) X), Xii, Xjj, Xd[
LLD_], type->
size );
243 }
244 return;
245 }
246 else if( *INCX == Xd[
M_] )
247 {
248
249
250
251 if( ( myrow == Xrow ) || ( Xrow < 0 ) )
252 {
254
256 {
257
258
259
261 Xnq =
PB_Cnumroc( *N, Xj, Xinb, Xnb, mycol, Xsrc, npcol );
262
263
264
265 if( Xnq > 0 )
266 {
269 Xlindx = Xjj - 1 +
271 size ), &Xld );
272 Mindxl2g( Xgindx, Xlindx, Xinb, Xnb, mycol, Xsrc, npcol );
273 Xptr =
Mptr( ((
char *) X), Xii, Xlindx, Xld, size );
276 work[1][
REAL_PART] = ((double)( Xgindx+1 ));
278 }
279 else
280 {
285 }
286
287
288
289
290 if( ( npcol >= 2 ) && ( Xcol >= 0 ) )
291 {
292 mydist = mycol;
293 k = 1;
294l_10:
295 if( mydist & 1 )
296 {
297 dist = k * ( mydist - 1 );
299 Czgesd2d( ctxt, 2, 1, ((
char*)work), 2, myrow, dst );
300 goto l_20;
301 }
302 else
303 {
304 dist = mycol + k;
306
307 if( mycol < src )
308 {
309 Czgerv2d( ctxt, 2, 1, ((
char*) work[2]), 2, myrow,
310 src );
315 {
319 }
320 }
321 mydist >>= 1;
322 }
323 k <<= 1;
324
325 if( k < npcol ) goto l_10;
326l_20:
327
328
329
330
332 if( mycol == 0 )
333 {
334 Czgebs2d( ctxt,
ROW, &rbtop, 2, 1, ((
char*)work), 2 );
335 }
336 else
337 {
338 Czgebr2d( ctxt,
ROW, &rbtop, 2, 1, ((
char*)work), 2,
339 myrow, 0 );
340 }
341 }
342
343
344
345
351 }
352 else
353 {
354
355
356
358 Xnq =
PB_Cnumroc( *N, Xj, Xinb, Xnb, mycol, Xsrc, npcol );
359
360
361
362 if( Xnq > 0 )
363 {
364
365
366
369 Xlindx = Xjj - 1 +
371 size ), &Xld );
372 Xptr =
Mptr( ((
char *) X), Xii, Xlindx, Xld, size );
375 }
376 else
377 {
380 }
381
382 if( Xcol >= 0 )
383 {
384
385
386
387
388 Czgamx2d( ctxt,
ROW, &rctop, 1, 1, ((
char*)AMAX), 1,
389 &idumm, &maxpos, 1, -1, mycol );
390
391
392
394 {
396 if( mycol == maxpos )
397 {
398 Mindxl2g( Xgindx, Xlindx, Xinb, Xnb, mycol, Xsrc, npcol );
399 *INDX = Xgindx + 1;
400 Cigebs2d( ctxt,
ROW, &rbtop, 1, 1, ((
char*)INDX), 1 );
401 }
402 else
403 {
404 Cigebr2d( ctxt,
ROW, &rbtop, 1, 1, ((
char*)INDX), 1,
405 myrow, maxpos );
406 }
407 }
408 else
409 {
410
411
412
413 *INDX = *JX;
414 }
415 }
416 else
417 {
418
419
420
423 ( *JX ) : Xlindx + 1 );
424 }
425 }
426 }
427 return;
428 }
429 else
430 {
431
432
433
434 if( ( mycol == Xcol ) || ( Xcol < 0 ) )
435 {
437
439 {
440
441
442
444 Xnp =
PB_Cnumroc( *N, Xi, Ximb, Xmb, myrow, Xsrc, nprow );
445
446
447
448 if( Xnp > 0 )
449 {
452 Xlindx = Xii - 1 +
454 size ), INCX );
455 Mindxl2g( Xgindx, Xlindx, Ximb, Xmb, myrow, Xsrc, nprow );
456 Xptr =
Mptr( ((
char *) X), Xlindx, Xjj, Xld, size );
459 work[1][
REAL_PART] = ((double)( Xgindx+1 ));
461 }
462 else
463 {
468 }
469
470
471
472
473 if( ( nprow >= 2 ) && ( Xrow >= 0 ) )
474 {
475 mydist = myrow;
476 k = 1;
477l_30:
478 if( mydist & 1 )
479 {
480 dist = k * ( mydist - 1 );
482 Czgesd2d( ctxt, 2, 1, ((
char*)work), 2, dst, mycol );
483 goto l_40;
484 }
485 else
486 {
487 dist = myrow + k;
489
490 if( myrow < src )
491 {
492 Czgerv2d( ctxt, 2, 1, ((
char*) work[2]), 2,
493 src, mycol );
498 {
502 }
503 }
504 mydist >>= 1;
505 }
506 k <<= 1;
507
508 if( k < nprow ) goto l_30;
509l_40:
510
511
512
513
515 if( myrow == 0 )
516 {
518 }
519 else
520 {
522 0, mycol );
523 }
524 }
525
526
527
528
534 }
535 else
536 {
537
538
539
541 Xnp =
PB_Cnumroc( *N, Xi, Ximb, Xmb, myrow, Xsrc, nprow );
542
543
544
545
546 if( Xnp > 0 )
547 {
548
549
550
553 Xlindx = Xii - 1 +
555 size ), INCX );
556 Xptr =
Mptr( ((
char *) X), Xlindx, Xjj, Xld, size );
559 }
560 else
561 {
564 }
565
566 if( Xrow >= 0 )
567 {
568
569
570
571
573 &maxpos, &idumm, 1, -1, mycol );
574
575
576
578 {
580 if( myrow == maxpos )
581 {
582 Mindxl2g( Xgindx, Xlindx, Ximb, Xmb, myrow, Xsrc, nprow );
583 *INDX = Xgindx + 1;
585 }
586 else
587 {
589 maxpos, mycol );
590 }
591 }
592 else
593 {
594
595
596
597 *INDX = *IX;
598 }
599 }
600 else
601 {
602
603
604
607 ( *IX ) : Xlindx + 1 );
608 }
609 }
610 }
611 return;
612 }
613
614
615
616}