2
3
4
5
6
7
8
9 INTEGER INDX, INCX, IX, JX, N
10 COMPLEX AMAX
11
12
13 INTEGER DESCX( * )
14 COMPLEX X( * )
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
149 $ LLD_, MB_, M_, NB_, N_, RSRC_
150 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
151 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
152 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
153 COMPLEX ZERO
154 parameter( zero = ( 0.0e+0, 0.0e+0 ) )
155
156
157 CHARACTER CBTOP, CCTOP, RBTOP, RCTOP
158 INTEGER ICOFF, ICTXT, IDUMM, IIX, IROFF, IXCOL, IXROW,
159 $ JJX, LCINDX, LDX, MAXPOS, MYCOL, MYROW, NP,
160 $ NPCOL, NPROW, NQ
161
162
163 COMPLEX WORK( 2 )
164
165
168 $ pb_topget
169
170
171 LOGICAL LSAME
172 INTEGER ICMAX1, INDXL2G, NUMROC
174
175
176 INTRINSIC abs,
cmplx, mod, nint, real
177
178
179
180
181
182 ictxt = descx( ctxt_ )
183 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
184
185
186
187 indx = 0
188 amax = zero
189 IF( n.LE.0 )
190 $ RETURN
191
192
193
194 ldx = descx( lld_ )
195 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix, jjx,
196 $ ixrow, ixcol )
197
198 IF( incx.EQ.1 .AND. descx( m_ ).EQ.1 .AND. n.EQ.1 ) THEN
199 indx = jx
200 amax = x( iix+(jjx-1)*ldx )
201 RETURN
202 END IF
203
204
205
206 IF( incx.EQ.descx( m_ ) ) THEN
207
208 IF( myrow.EQ.ixrow ) THEN
209
210 icoff = mod( jx-1, descx( nb_ ) )
211 nq =
numroc( n+icoff, descx( nb_ ), mycol, ixcol, npcol )
212 IF( mycol.EQ.ixcol )
213 $ nq = nq-icoff
214
215 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rbtop )
216
217 IF(
lsame( rbtop,
' ' ) )
THEN
218
219 IF( nq.GT.0 ) THEN
220 lcindx = jjx-1+icmax1( nq, x( iix+(jjx-1)*ldx ), ldx )
221 work( 1 ) = x( iix+(lcindx-1)*ldx )
223 $ descx( nb_ ), mycol, descx( csrc_ ), npcol ) ) )
224 ELSE
225 work( 1 ) = zero
226 work( 2 ) = zero
227 END IF
228
229 CALL pctreecomb( ictxt,
'Row', 2, work, -1, mycol,
231
232 amax = work( 1 )
233 IF( amax.EQ.zero ) THEN
234 indx = jx
235 ELSE
236 indx = nint( real( work( 2 ) ) )
237 END IF
238
239 ELSE
240
241 CALL pb_topget( ictxt, 'Combine', 'Rowwise', rctop )
242
243 IF( nq.GT.0 ) THEN
244 lcindx = jjx-1+icmax1( nq, x( iix+(jjx-1)*ldx ), ldx )
245 amax = x( iix + (lcindx-1)*ldx )
246 ELSE
247 amax = zero
248 END IF
249
250
251
252 CALL cgamx2d( ictxt, 'Rowwise', rctop, 1, 1, amax, 1,
253 $ idumm, maxpos, 1, -1, myrow )
254
255 IF( amax.NE.zero ) THEN
256
257
258
259 IF( mycol.EQ.maxpos ) THEN
260 indx =
indxl2g( lcindx, descx( nb_ ), mycol,
261 $ descx( csrc_ ), npcol )
262 CALL igebs2d( ictxt, 'Rowwise', rbtop, 1, 1, indx,
263 $ 1 )
264 ELSE
265 CALL igebr2d( ictxt, 'Rowwise', rbtop, 1, 1, indx,
266 $ 1, myrow, maxpos )
267 END IF
268
269 ELSE
270
271 indx = jx
272
273 END IF
274
275 END IF
276
277 END IF
278
279 ELSE
280
281 IF( mycol.EQ.ixcol ) THEN
282
283 iroff = mod( ix-1, descx( mb_ ) )
284 np =
numroc( n+iroff, descx( mb_ ), myrow, ixrow, nprow )
285 IF( myrow.EQ.ixrow )
286 $ np = np-iroff
287
288 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', cbtop )
289
290 IF(
lsame( cbtop,
' ' ) )
THEN
291
292 IF( np.GT.0 ) THEN
293 lcindx = iix-1+icmax1( np, x( iix+(jjx-1)*ldx ), 1 )
294 work( 1 ) = x( lcindx + (jjx-1)*ldx )
296 $ descx( mb_ ), myrow, descx( rsrc_ ), nprow ) ) )
297 ELSE
298 work( 1 ) = zero
299 work( 2 ) = zero
300 END IF
301
302 CALL pctreecomb( ictxt,
'Column', 2, work, -1, mycol,
304
305 amax = work( 1 )
306 IF( amax.EQ.zero ) THEN
307 indx = ix
308 ELSE
309 indx = nint( real( work( 2 ) ) )
310 END IF
311
312 ELSE
313
314 CALL pb_topget( ictxt, 'Combine', 'Columnwise', cctop )
315
316 IF( np.GT.0 ) THEN
317 lcindx = iix-1+icmax1( np, x( iix+(jjx-1)*ldx ), 1 )
318 amax = x( lcindx + (jjx-1)*ldx )
319 ELSE
320 amax = zero
321 END IF
322
323
324
325 CALL cgamx2d( ictxt, 'Columnwise', cctop, 1, 1, amax, 1,
326 $ maxpos, idumm, 1, -1, mycol )
327
328 IF( amax.NE.zero ) THEN
329
330
331
332 IF( myrow.EQ.maxpos ) THEN
333 indx =
indxl2g( lcindx, descx( mb_ ), myrow,
334 $ descx( rsrc_ ), nprow )
335 CALL igebs2d( ictxt, 'Columnwise', cbtop, 1, 1,
336 $ indx, 1 )
337 ELSE
338 CALL igebr2d( ictxt, 'Columnwise', cbtop, 1, 1,
339 $ indx, 1, maxpos, mycol )
340 END IF
341
342 ELSE
343
344 indx = ix
345
346 END IF
347
348 END IF
349
350 END IF
351
352 END IF
353
354 RETURN
355
356
357
integer function indxl2g(indxloc, nb, iproc, isrcproc, nprocs)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine ccombamax1(v1, v2)
subroutine pctreecomb(ictxt, scope, n, mine, rdest0, cdest0, subptr)