3
4
5
6
7
8
9
10 INTEGER IV, IX, JV, JX, KASE, N
11 DOUBLE PRECISION EST
12
13
14 INTEGER DESCV( * ), DESCX( * ), ISGN( * )
15 DOUBLE PRECISION V( * ), X( * )
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
149 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
150 $ LLD_, MB_, M_, NB_, N_, RSRC_
151 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
152 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
153 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
154 INTEGER ITMAX
155 parameter( itmax = 5 )
156 DOUBLE PRECISION ZERO, ONE, TWO
157 parameter( zero = 0.0d+0, one = 1.0d+0, two = 2.0d+0 )
158
159
160 INTEGER I, ICTXT, IFLAG, IIVX, IMAXROW, IOFFVX, IROFF,
161 $ ITER, IVXCOL, IVXROW, J, JLAST, JJVX, JUMP,
162 $ K, MYCOL, MYROW, NP, NPCOL, NPROW
163 DOUBLE PRECISION ALTSGN, ESTOLD, JLMAX, XMAX
164
165
166 DOUBLE PRECISION ESTWORK( 1 ), TEMP( 1 ), WORK( 2 )
167
168
169 EXTERNAL blacs_gridinfo, dcopy, dgebr2d, dgebs2d,
170 $ igsum2d,
infog2l, pdamax, pdasum,
172
173
174 INTEGER INDXG2L, INDXG2P, INDXL2G, NUMROC
176
177
178 INTRINSIC abs, dble, mod, nint, sign
179
180
181 SAVE
182
183
184
185
186
187 estwork( 1 ) = est
188 ictxt = descx( ctxt_ )
189 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
190
191 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol,
192 $ iivx, jjvx, ivxrow, ivxcol )
193 IF( mycol.NE.ivxcol )
194 $ RETURN
195 iroff = mod( ix-1, descx( mb_ ) )
196 np =
numroc( n+iroff, descx( mb_ ), myrow, ivxrow, nprow )
197 IF( myrow.EQ.ivxrow )
198 $ np = np - iroff
199 ioffvx = iivx + (jjvx-1)*descx( lld_ )
200
201 IF( kase.EQ.0 ) THEN
202 DO 10 i = ioffvx, ioffvx+np-1
203 x( i ) = one / dble( n )
204 10 CONTINUE
205 kase = 1
206 jump = 1
207 RETURN
208 END IF
209
210 GO TO ( 20, 40, 70, 110, 140 )jump
211
212
213
214
215 20 CONTINUE
216 IF( n.EQ.1 ) THEN
217 IF( myrow.EQ.ivxrow ) THEN
218 v( ioffvx ) = x( ioffvx )
219 estwork( 1 ) = abs( v( ioffvx ) )
220 CALL dgebs2d( ictxt, 'Columnwise', ' ', 1, 1, estwork, 1 )
221 ELSE
222 CALL dgebr2d( ictxt, 'Columnwise', ' ', 1, 1, estwork, 1,
223 $ ivxrow, mycol )
224 END IF
225
226 GO TO 150
227 END IF
228 CALL pdasum( n, estwork( 1 ), x, ix, jx, descx, 1 )
229 IF( descx( m_ ).EQ.1 .AND. n.EQ.1 ) THEN
230 IF( myrow.EQ.ivxrow ) THEN
231 CALL dgebs2d( ictxt, 'Columnwise', ' ', 1, 1, estwork, 1 )
232 ELSE
233 CALL dgebr2d( ictxt, 'Columnwise', ' ', 1, 1, estwork, 1,
234 $ ivxrow, mycol )
235 END IF
236 END IF
237
238 DO 30 i = ioffvx, ioffvx+np-1
239 x( i ) = sign( one, x( i ) )
240 isgn( i ) = nint( x( i ) )
241 30 CONTINUE
242 kase = 2
243 jump = 2
244 RETURN
245
246
247
248
249 40 CONTINUE
250 CALL pdamax( n, xmax, j, x, ix, jx, descx, 1 )
251 IF( descx( m_ ).EQ.1 .AND. n.EQ.1 ) THEN
252 IF( myrow.EQ.ivxrow ) THEN
253 work( 1 ) = xmax
254 work( 2 ) = dble( j )
255 CALL dgebs2d( ictxt, 'Columnwise', ' ', 2, 1, work, 2 )
256 ELSE
257 CALL dgebr2d( ictxt, 'Columnwise', ' ', 2, 1, work, 2,
258 $ ivxrow, mycol )
259 xmax = work( 1 )
260 j = nint( work( 2 ) )
261 END IF
262 END IF
263 iter = 2
264
265
266
267 50 CONTINUE
268 DO 60 i = ioffvx, ioffvx+np-1
269 x( i ) = zero
270 60 CONTINUE
271 imaxrow =
indxg2p( j, descx( mb_ ), myrow, descx( rsrc_ ), nprow )
272 IF( myrow.EQ.imaxrow ) THEN
273 i =
indxg2l( j, descx( mb_ ), myrow, descx( rsrc_ ), nprow )
274 x( i ) = one
275 END IF
276 kase = 1
277 jump = 3
278 RETURN
279
280
281
282
283 70 CONTINUE
284 CALL dcopy( np, x( ioffvx ), 1, v( ioffvx ), 1 )
285 estold = estwork( 1 )
286 CALL pdasum( n, estwork( 1 ), v, iv, jv, descv, 1 )
287 IF( descv( m_ ).EQ.1 .AND. n.EQ.1 ) THEN
288 IF( myrow.EQ.ivxrow ) THEN
289 CALL dgebs2d( ictxt, 'Columnwise', ' ', 1, 1, estwork, 1 )
290 ELSE
291 CALL dgebr2d( ictxt, 'Columnwise', ' ', 1, 1, estwork, 1,
292 $ ivxrow, mycol )
293 END IF
294 END IF
295 iflag = 0
296 DO 80 i = ioffvx, ioffvx+np-1
297 IF( nint( sign( one, x( i ) ) ).NE.isgn( i ) ) THEN
298 iflag = 1
299 GO TO 90
300 END IF
301 80 CONTINUE
302
303 90 CONTINUE
304 CALL igsum2d( ictxt, 'C', ' ', 1, 1, iflag, 1, -1, mycol )
305
306
307
308
309 IF( iflag.EQ.0 .OR. estwork( 1 ).LE.estold )
310 $ GO TO 120
311
312 DO 100 i = ioffvx, ioffvx+np-1
313 x( i ) = sign( one, x( i ) )
314 isgn( i ) = nint( x( i ) )
315 100 CONTINUE
316 kase = 2
317 jump = 4
318 RETURN
319
320
321
322
323 110 CONTINUE
324 jlast = j
325 CALL pdamax( n, xmax, j, x, ix, jx, descx, 1 )
326 IF( descx( m_ ).EQ.1 .AND. n.EQ.1 ) THEN
327 IF( myrow.EQ.ivxrow ) THEN
328 work( 1 ) = xmax
329 work( 2 ) = dble( j )
330 CALL dgebs2d( ictxt, 'Columnwise', ' ', 2, 1, work, 2 )
331 ELSE
332 CALL dgebr2d( ictxt, 'Columnwise', ' ', 2, 1, work, 2,
333 $ ivxrow, mycol )
334 xmax = work( 1 )
335 j = nint( work( 2 ) )
336 END IF
337 END IF
338 CALL pdelget(
'Columnwise',
' ', jlmax, x, jlast, jx, descx )
339 IF( ( jlmax.NE.abs( xmax ) ).AND.( iter.LT.itmax ) ) THEN
340 iter = iter + 1
341 GO TO 50
342 END IF
343
344
345
346 120 CONTINUE
347 DO 130 i = ioffvx, ioffvx+np-1
348 k =
indxl2g( i-ioffvx+iivx, descx( mb_ ), myrow,
349 $ descx( rsrc_ ), nprow )-ix+1
350 IF( mod( k, 2 ).EQ.0 ) THEN
351 altsgn = -one
352 ELSE
353 altsgn = one
354 END IF
355 x( i ) = altsgn*( one+dble( k-1 ) / dble( n-1 ) )
356 130 CONTINUE
357 kase = 1
358 jump = 5
359 RETURN
360
361
362
363
364 140 CONTINUE
365 CALL pdasum( n, temp( 1 ), x, ix, jx, descx, 1 )
366 IF( descx( m_ ).EQ.1 .AND. n.EQ.1 ) THEN
367 IF( myrow.EQ.ivxrow ) THEN
368 CALL dgebs2d( ictxt, 'Columnwise', ' ', 1, 1, temp, 1 )
369 ELSE
370 CALL dgebr2d( ictxt, 'Columnwise', ' ', 1, 1, temp, 1,
371 $ ivxrow, mycol )
372 END IF
373 END IF
374 temp( 1 ) = two*( temp( 1 ) / dble( 3*n ) )
375 IF( temp( 1 ).GT.estwork( 1 ) ) THEN
376 CALL dcopy( np, x( ioffvx ), 1, v( ioffvx ), 1 )
377 estwork( 1 ) = temp( 1 )
378 END IF
379
380 150 CONTINUE
381 kase = 0
382
383 est = estwork( 1 )
384 RETURN
385
386
387
integer function indxg2l(indxglob, nb, iproc, isrcproc, nprocs)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
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 pdelget(scope, top, alpha, a, ia, ja, desca)