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( * )
15 COMPLEX*16 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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
147 $ LLD_, MB_, M_, NB_, N_, RSRC_
148 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
149 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
150 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
151 INTEGER ITMAX
152 parameter( itmax = 5 )
153 DOUBLE PRECISION ONE, TWO
154 parameter( one = 1.0d+0, two = 2.0d+0 )
155 COMPLEX*16 CZERO, CONE
156 parameter( czero = ( 0.0d+0, 0.0d+0 ),
157 $ cone = ( 1.0d+0, 0.0d+0 ) )
158
159
160 INTEGER I, ICTXT, IIVX, IMAXROW, IOFFVX, IROFF, ITER,
161 $ IVXCOL, JJVX, JUMP
162
163DOUBLE PRECISION ALTSGN, ESTOLD
164COMPLEX*16 JLMAX,
165
166
167 COMPLEX*16
168
169
172 $
173
174
175 INTEGER INDXG2L, INDXG2P, INDXL2G, NUMROC
176 DOUBLE PRECISION PDLAMCH
178
179
180 INTRINSIC abs, dble, dcmplx
181
182
183 SAVE
184
185
186
187
188
189 ictxt = descx( ctxt_ )
191
192 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol,
193 $ iivx, jjvx, ivxrow, ivxcol )
194 IF( mycol.NE.ivxcol )
195 $ RETURN
196 iroff = mod( ix-1, descx( mb_
197 np =
numroc( n+iroff, descx( mb_ ), myrow, ivxrow, nprow )
198 IF( myrow.EQ.ivxrow )
199 $ np = np - iroff
200 ioffvx = iivx + (jjvx-1)*descx( lld_ )
201
202 safmin =
pdlamch( ictxt,
'Safe minimum' )
203 IF( kase.EQ.0 ) THEN
204 DO 10 i = ioffvx, ioffvx+np-1
205 x( i ) = dcmplx( one / dble( n ) )
206 10 CONTINUE
207 kase = 1
208 jump = 1
209 RETURN
210 END IF
211
212 GO TO ( 20, 40, 70, 90, 120 )jump
213
214
215
216
217 20 CONTINUE
218 IF( n.EQ.1 ) THEN
219 IF( myrow.EQ.ivxrow ) THEN
220 v( ioffvx ) = x( ioffvx )
221 est = abs( v( ioffvx ) )
222 CALL dgebs2d( ictxt,
'Columnwise',
' ', 1, 1, est, 1 )
223 ELSE
224 CALL dgebr2d( ictxt,
'Columnwise',
' ', 1, 1, est, 1,
225 $ ivxrow, mycol )
226 END IF
227
228 GO TO 130
229 END IF
230 CALL pdzsum1( n, est, x, ix, jx, descx, 1 )
231 IF( descx( m_ ).EQ.1 .AND. n.EQ.1 ) THEN
232 IF( myrow.EQ.ivxrow ) THEN
233 CALL dgebs2d( ictxt,
'Columnwise',
' ', 1, 1, est, 1 )
234 ELSE
235 CALL dgebr2d( ictxt, 'columnwise
', ' ', 1, 1, EST, 1,
236 $ IVXROW, MYCOL )
237 END IF
238 END IF
239
240 DO 30 I = IOFFVX, IOFFVX+NP-1
241.GT. IF( ABS( X( I ) )SAFMIN ) THEN
242 X( I ) = X( I ) / DCMPLX( ABS( X( I ) ) )
243 ELSE
244 X( I ) = CONE
245 END IF
246 30 CONTINUE
247 KASE = 2
248 JUMP = 2
249 RETURN
250
251
252
253
254 40 CONTINUE
255 CALL PZMAX1( N, XMAX, J, X, IX, JX, DESCX, 1 )
256.EQ..AND..EQ. IF( DESCX( M_ )1 N1 ) THEN
257.EQ. IF( MYROWIVXROW ) THEN
258 WORK( 1 ) = XMAX
259 WORK( 2 ) = DCMPLX( DBLE( J ) )
260 CALL ZGEBS2D( ICTXT, 'columnwise', ' ', 2, 1, WORK, 2 )
261 ELSE
262 CALL ZGEBR2D( ICTXT, 'columnwise', ' ', 2, 1, WORK, 2,
263 $ IVXROW, MYCOL )
264 XMAX = WORK( 1 )
265 J = NINT( DBLE( WORK( 2 ) ) )
266 END IF
267 END IF
268 ITER = 2
269
270
271
272 50 CONTINUE
273 DO 60 I = IOFFVX, IOFFVX+NP-1
274 X( I ) = CZERO
275 60 CONTINUE
276 IMAXROW = INDXG2P( J, DESCX( MB_ ), MYROW, DESCX( RSRC_ ), NPROW )
277.EQ. IF( MYROWIMAXROW ) THEN
278 I = INDXG2L( J, DESCX( MB_ ), MYROW, DESCX( RSRC_ ), NPROW )
279 X( I ) = CONE
280 END IF
281 KASE = 1
282 JUMP = 3
283 RETURN
284
285
286
287
288 70 CONTINUE
289 CALL ZCOPY( NP, X( IOFFVX ), 1, V( IOFFVX ), 1 )
290 ESTOLD = EST
291 CALL PDZSUM1( N, EST, V, IV, JV, DESCV, 1 )
292.EQ..AND..EQ. IF( DESCV( M_ )1 N1 ) THEN
293.EQ. IF( MYROWIVXROW ) THEN
294 CALL DGEBS2D( ICTXT, 'columnwise', ' ', 1, 1, EST, 1 )
295 ELSE
296 CALL DGEBR2D( ICTXT, 'columnwise', ' ', 1, 1, EST, 1,
297 $ IVXROW, MYCOL )
298 END IF
299 END IF
300
301
302.LE. IF( ESTESTOLD )
303 $ GO TO 100
304
305 DO 80 I = IOFFVX, IOFFVX+NP-1
306.GT. IF( ABS( X( I ) )SAFMIN ) THEN
307 X( I ) = X( I ) / DCMPLX( ABS( X( I ) ) )
308 ELSE
309 X( I ) = CONE
310 END IF
311 80 CONTINUE
312 KASE = 2
313 JUMP = 4
314 RETURN
315
316
317
318
319 90 CONTINUE
320 JLAST = J
321 CALL PZMAX1( N, XMAX, J, X, IX, JX, DESCX, 1 )
322.EQ..AND..EQ. IF( DESCX( M_ )1 N1 ) THEN
323.EQ. IF( MYROWIVXROW ) THEN
324 WORK( 1 ) = XMAX
325 WORK( 2 ) = DCMPLX( DBLE( J ) )
326 CALL ZGEBS2D( ICTXT, 'columnwise', ' ', 2, 1, WORK, 2 )
327 ELSE
328 CALL ZGEBR2D( ICTXT, 'columnwise', ' ', 2, 1, WORK, 2,
329 $ IVXROW, MYCOL )
330 XMAX = WORK( 1 )
331 J = NINT( DBLE( WORK( 2 ) ) )
332 END IF
333 END IF
334 CALL PZELGET( 'columnwise', ' ', JLMAX, X, JLAST, JX, DESCX )
335.NE..AND. IF( ( DBLE( JLMAX )ABS( DBLE( XMAX ) ) )
336.LT. $ ( ITERITMAX ) ) THEN
337 ITER = ITER + 1
338 GO TO 50
339 END IF
340
341
342
343 100 CONTINUE
344 DO 110 I = IOFFVX, IOFFVX+NP-1
345 K = INDXL2G( I-IOFFVX+IIVX, DESCX( MB_ ), MYROW,
346 $ DESCX( RSRC_ ), NPROW )-IX+1
347.EQ. IF( MOD( K, 2 )0 ) THEN
348 ALTSGN = -ONE
349 ELSE
350 ALTSGN = ONE
351 END IF
352 X( I ) = DCMPLX( ALTSGN*( ONE+DBLE( K-1 ) / DBLE( N-1 ) ) )
353 110 CONTINUE
354 KASE = 1
355 JUMP = 5
356 RETURN
357
358
359
360
361 120 CONTINUE
362 CALL PDZSUM1( N, TEMP, X, IX, JX, DESCX, 1 )
363.EQ..AND..EQ. IF( DESCX( M_ )1 N1 ) THEN
364.EQ. IF( MYROWIVXROW ) THEN
365 CALL DGEBS2D( ICTXT, 'columnwise', ' ', 1, 1, TEMP, 1 )
366 ELSE
367 CALL DGEBR2D( ICTXT, 'columnwise', ' ', 1, 1, TEMP, 1,
368 $ IVXROW, MYCOL )
369 END IF
370 END IF
371 TEMP = TWO*( TEMP / DBLE( 3*N ) )
372.GT. IF( TEMPEST ) THEN
373 CALL ZCOPY( NP, X( IOFFVX ), 1, V( IOFFVX ), 1 )
374 EST = TEMP
375 END IF
376
377 130 CONTINUE
378 KASE = 0
379
380 RETURN
381
382
383
subroutine zcopy(n, zx, incx, zy, incy)
ZCOPY
integer function indxg2l(indxglob, nb, iproc, isrcproc, nprocs)
integer function indxl2g(indxloc, nb, iproc, isrcproc, nprocs)
subroutine dgebs2d(contxt, scope, top, m, n, a, lda)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
subroutine zgebr2d(contxt, scope, top, m, n, a, lda)
subroutine zgebs2d(contxt, scope, top, m, n, a, lda)
subroutine dgebr2d(contxt, scope, top, m, n, a, lda)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
double precision function pdlamch(ictxt, cmach)
subroutine pdzsum1(n, asum, x, ix, jx, descx, incx)
subroutine pzelget(scope, top, alpha, a, ia, ja, desca)
subroutine pzmax1(n, amax, indx, x, ix, jx, descx, incx)