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;
187
188
189
191 float work[4];
192
193
194
195
197#ifndef NO_ARGCHK
198
199
200
202 if( !( info = ( ( nprow == -1 ) ? -( 701 +
CTXT_ ) : 0 ) ) )
203 PB_Cchkvec( ctxt,
"PSAMAX",
"X", *N, 1, Xi, Xj, Xd, *INCX, 7, &info );
204 if( info ) {
PB_Cabort( ctxt,
"PSAMAX", info );
return; }
205#endif
206
207
208
209 *INDX = 0; *AMAX =
ZERO;
210
211
212
213 if( *N == 0 ) return;
214
215
216
217#ifdef NO_ARGCHK
219#endif
220
221
222
223 PB_Cinfog2l( Xi, Xj, Xd, nprow, npcol, myrow, mycol, &Xii, &Xjj,
224 &Xrow, &Xcol );
225
226
227
228 if( ( *INCX == 1 ) && ( Xd[
M_] == 1 ) && ( *N == 1 ) )
229 {
230
231
232
233 if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
234 ( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
235 {
236 *INDX = *JX; *AMAX = X[Xii+Xjj*Xd[
LLD_]];
237 }
238 return;
239 }
240 else if( *INCX == Xd[
M_] )
241 {
242
243
244
245 if( ( myrow == Xrow ) || ( Xrow < 0 ) )
246 {
248
250 {
251
252
253
255 Xnq =
PB_Cnumroc( *N, Xj, Xinb, Xnb, mycol, Xsrc, npcol );
256
257
258
259 if( Xnq > 0 )
260 {
262 Xlindx = Xjj - 1 +
263 isamax_( &Xnq, ((
char*)(
Mptr(X,Xii,Xjj,Xld,1))), &Xld );
264 Mindxl2g( Xgindx, Xlindx, Xinb, Xnb, mycol, Xsrc, npcol );
265 work[0] = X[Xii+Xlindx*Xld];
266 work[1] = ((float )( Xgindx+1 ));
267 }
268 else
269 {
272 }
273
274
275
276
277 if( ( npcol >= 2 ) && ( Xcol >= 0 ) )
278 {
279 mydist = mycol;
280 k = 1;
281l_10:
282 if( mydist & 1 )
283 {
284 dist = k * ( mydist - 1 );
286 Csgesd2d( ctxt, 2, 1, ((
char*)work), 2, myrow, dst );
287 goto l_20;
288 }
289 else
290 {
291 dist = mycol + k;
293
294 if( mycol < src )
295 {
296 Csgerv2d( ctxt, 2, 1, ((
char*) &work[2]), 2, myrow,
297 src );
298 if(
ABS( work[0] ) <
ABS( work[2] ) )
299 { work[0] = work[2]; work[1] = work[3]; }
300 }
301 mydist >>= 1;
302 }
303 k <<= 1;
304
305 if( k < npcol ) goto l_10;
306l_20:
307
308
309
310
312 if( mycol == 0 )
313 {
314 Csgebs2d( ctxt,
ROW, &rbtop, 2, 1, ((
char*)work), 2 );
315 }
316 else
317 {
318 Csgebr2d( ctxt,
ROW, &rbtop, 2, 1, ((
char*)work), 2,
319 myrow, 0 );
320 }
321 }
322
323
324
325
326 *AMAX = work[0];
327 *INDX = ( ( *AMAX ==
ZERO ) ? ( *JX ) : ( (
Int)(work[1]) ) );
328 }
329 else
330 {
331
332
333
335 Xnq =
PB_Cnumroc( *N, Xj, Xinb, Xnb, mycol, Xsrc, npcol );
336
337
338
339 if( Xnq > 0 )
340 {
341
342
343
345 Xlindx = Xjj - 1 +
346 isamax_( &Xnq, ((
char*)(
Mptr(X,Xii,Xjj,Xld, 1))), &Xld );
347 *AMAX = *
Mptr(X,Xii,Xlindx,Xld,1);
348 }
349 else
350 {
352 }
353
354 if( Xcol >= 0 )
355 {
356
357
358
359
360 Csgamx2d( ctxt,
ROW, &rctop, 1, 1, ((
char*)AMAX), 1,
361 &idumm, &maxpos, 1, -1, mycol );
362
363
364
366 {
368 if( mycol == maxpos )
369 {
370 Mindxl2g( Xgindx, Xlindx, Xinb, Xnb, mycol, Xsrc, npcol );
371 *INDX = Xgindx + 1;
372 Cigebs2d( ctxt,
ROW, &rbtop, 1, 1, ((
char*)INDX), 1 );
373 }
374 else
375 {
376 Cigebr2d( ctxt,
ROW, &rbtop, 1, 1, ((
char*)INDX), 1,
377 myrow, maxpos );
378 }
379 }
380 else
381 {
382
383
384
385 *INDX = *JX;
386 }
387 }
388 else
389 {
390
391
392
393 *INDX = ( ( *AMAX ==
ZERO ) ? ( *JX ) : Xlindx + 1 );
394 }
395 }
396 }
397 return;
398 }
399 else
400 {
401
402
403
404 if( ( mycol == Xcol ) || ( Xcol < 0 ) )
405 {
407
409 {
410
411
412
414 Xnp =
PB_Cnumroc( *N, Xi, Ximb, Xmb, myrow, Xsrc, nprow );
415
416
417
418 if( Xnp > 0 )
419 {
421 Xlindx = Xii - 1 +
422 isamax_( &Xnp, ((
char*)
Mptr(X,Xii,Xjj,Xld,1)), INCX );
423 Mindxl2g( Xgindx, Xlindx, Ximb, Xmb, myrow, Xsrc, nprow );
424 work[0] = *
Mptr(X,Xlindx,Xjj,Xld,1);
425 work[1] = ((float )( Xgindx+1 ));
426 }
427 else
428 {
431 }
432
433
434
435
436 if( ( nprow >= 2 ) && ( Xrow >= 0 ) )
437 {
438 mydist = myrow;
439 k = 1;
440l_30:
441 if( mydist & 1 )
442 {
443 dist = k * ( mydist - 1 );
445 Csgesd2d( ctxt, 2, 1, ((
char*)work), 2, dst, mycol );
446 goto l_40;
447 }
448 else
449 {
450 dist = myrow + k;
452
453 if( myrow < src )
454 {
455 Csgerv2d( ctxt, 2, 1, ((
char*) &work[2]), 2,
456 src, mycol );
457 if(
ABS( work[0] ) <
ABS( work[2] ) )
458 { work[0] = work[2]; work[1] = work[3]; }
459 }
460 mydist >>= 1;
461 }
462 k <<= 1;
463
464 if( k < nprow ) goto l_30;
465l_40:
466
467
468
469
471 if( myrow == 0 )
472 {
474 }
475 else
476 {
478 0, mycol );
479 }
480 }
481
482
483
484
485 *AMAX = work[0];
486 *INDX = ( ( *AMAX ==
ZERO ) ? ( *IX ) : ( (
Int)(work[1]) ) );
487 }
488 else
489 {
490
491
492
494 Xnp =
PB_Cnumroc( *N, Xi, Ximb, Xmb, myrow, Xsrc, nprow );
495
496
497
498
499 if( Xnp > 0 )
500 {
501
502
503
505 Xlindx = Xii - 1 +
506 isamax_( &Xnp, ((
char*)(X+(Xii+Xjj*Xld))), INCX );
507 *AMAX = X[Xlindx+Xjj*Xld];
508 }
509 else
510 {
512 }
513
514 if( Xrow >= 0 )
515 {
516
517
518
519
521 &maxpos, &idumm, 1, -1, mycol );
522
523
524
526 {
528 if( myrow == maxpos )
529 {
530 Mindxl2g( Xgindx, Xlindx, Ximb, Xmb, myrow, Xsrc, nprow );
531 *INDX = Xgindx + 1;
533 }
534 else
535 {
537 maxpos, mycol );
538 }
539 }
540 else
541 {
542
543
544
545 *INDX = *IX;
546 }
547 }
548 else
549 {
550
551
552
553 *INDX = ( ( *AMAX ==
ZERO ) ? ( *IX ) : Xlindx + 1 );
554 }
555 }
556 }
557 return;
558 }
559
560
561
562}