2
3
4
5
6
7
8
9 INTEGER INDX, INCX, IX, JX, N
10 COMPLEX*16 AMAX
11
12
13 INTEGER DESCX( * )
14 COMPLEX*16 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*16 ZERO
154 parameter( zero = ( 0.0d+0, 0.0d+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*16 WORK( 2 )
164
165
166 EXTERNAL blacs_gridinfo, igebr2d, igebs2d,
infog2l,
168
169
170 LOGICAL LSAME
171 INTEGER IZMAX1, INDXL2G, NUMROC
173
174
175 INTRINSIC abs, dble, dcmplx, mod, nint
176
177
178
179
180
181 ictxt = descx( ctxt_ )
182 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
183
184
185
186 indx = 0
187 amax = zero
188 IF( n.LE.0 )
189 $ RETURN
190
191
192
193 ldx = descx( lld_ )
194 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix, jjx,
195 $ ixrow, ixcol )
196
197 IF( incx.EQ.1 .AND. descx( m_ ).EQ.1 .AND. n.EQ.1 ) THEN
198 indx = jx
199 amax = x( iix+(jjx-1)*ldx )
200 RETURN
201 END IF
202
203
204
205 IF( incx.EQ.descx( m_ ) ) THEN
206
207 IF( myrow.EQ.ixrow ) THEN
208
209 icoff = mod( jx-1, descx( nb_ ) )
210 nq =
numroc( n+icoff, descx( nb_ ), mycol, ixcol, npcol )
211 IF( mycol.EQ.ixcol )
212 $ nq = nq-icoff
213
214 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rbtop )
215
216 IF(
lsame( rbtop,
' ' ) )
THEN
217
218 IF( nq.GT.0 ) THEN
219 lcindx = jjx-1+izmax1( nq, x( iix+(jjx-1)*ldx ), ldx )
220 work( 1 ) = x( iix+(lcindx-1)*ldx )
221 work( 2 ) = dcmplx( dble(
indxl2g( lcindx,
222 $ descx( nb_ ), mycol, descx( csrc_ ), npcol ) ) )
223 ELSE
224 work( 1 ) = zero
225 work( 2 ) = zero
226 END IF
227
228 CALL pztreecomb( ictxt,
'Row', 2, work, -1, mycol,
230
231 amax = work( 1 )
232 IF( amax.EQ.zero ) THEN
233 indx = jx
234 ELSE
235 indx = nint( dble( work( 2 ) ) )
236 END IF
237
238 ELSE
239
240 CALL pb_topget( ictxt, 'Combine', 'Rowwise', rctop )
241
242 IF( nq.GT.0 ) THEN
243 lcindx = jjx-1+izmax1( nq, x( iix+(jjx-1)*ldx ), ldx )
244 amax = x( iix + (lcindx-1)*ldx )
245 ELSE
246 amax = zero
247 END IF
248
249
250
251 CALL zgamx2d( ictxt, 'Rowwise', rctop, 1, 1, amax, 1,
252 $ idumm, maxpos, 1, -1, myrow )
253
254 IF( amax.NE.zero ) THEN
255
256
257
258 IF( mycol.EQ.maxpos ) THEN
259 indx =
indxl2g( lcindx, descx( nb_ ), mycol,
260 $ descx( csrc_ ), npcol )
261 CALL igebs2d( ictxt, 'Rowwise', rbtop, 1, 1, indx,
262 $ 1 )
263 ELSE
264 CALL igebr2d( ictxt, 'Rowwise', rbtop, 1, 1, indx,
265 $ 1, myrow, maxpos )
266 END IF
267
268 ELSE
269
270 indx = jx
271
272 END IF
273
274 END IF
275
276 END IF
277
278 ELSE
279
280 IF( mycol.EQ.ixcol ) THEN
281
282 iroff = mod( ix-1, descx( mb_ ) )
283 np =
numroc( n+iroff, descx( mb_ ), myrow, ixrow, nprow )
284 IF( myrow.EQ.ixrow )
285 $ np = np-iroff
286
287 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', cbtop )
288
289 IF(
lsame( cbtop,
' ' ) )
THEN
290
291 IF( np.GT.0 ) THEN
292 lcindx = iix-1+izmax1( np, x( iix+(jjx-1)*ldx ), 1 )
293 work( 1 ) = x( lcindx + (jjx-1)*ldx )
294 work( 2 ) = dcmplx( dble(
indxl2g( lcindx,
295 $ descx( mb_ ), myrow, descx( rsrc_ ), nprow ) ) )
296 ELSE
297 work( 1 ) = zero
298 work( 2 ) = zero
299 END IF
300
301 CALL pztreecomb( ictxt,
'Column', 2, work, -1, mycol,
303
304 amax = work( 1 )
305 IF( amax.EQ.zero ) THEN
306 indx = ix
307 ELSE
308 indx = nint( dble( work( 2 ) ) )
309 END IF
310
311 ELSE
312
313 CALL pb_topget( ictxt, 'Combine', 'Columnwise', cctop )
314
315 IF( np.GT.0 ) THEN
316 lcindx = iix-1+izmax1( np, x( iix+(jjx-1)*ldx ), 1 )
317 amax = x( lcindx + (jjx-1)*ldx )
318 ELSE
319 amax = zero
320 END IF
321
322
323
324 CALL zgamx2d( ictxt, 'Columnwise', cctop, 1, 1, amax, 1,
325 $ maxpos, idumm, 1, -1, mycol )
326
327 IF( amax.NE.zero ) THEN
328
329
330
331 IF( myrow.EQ.maxpos ) THEN
332 indx =
indxl2g( lcindx, descx( mb_ ), myrow,
333 $ descx( rsrc_ ), nprow )
334 CALL igebs2d( ictxt, 'Columnwise', cbtop, 1, 1,
335 $ indx, 1 )
336 ELSE
337 CALL igebr2d( ictxt, 'Columnwise', cbtop, 1, 1,
338 $ indx, 1, maxpos, mycol )
339 END IF
340
341 ELSE
342
343 indx = ix
344
345 END IF
346
347 END IF
348
349 END IF
350
351 END IF
352
353 RETURN
354
355
356
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 zcombamax1(v1, v2)
subroutine pztreecomb(ictxt, scope, n, mine, rdest0, cdest0, subptr)