1 SUBROUTINE pdlacon( N, V, IV, JV, DESCV, X, IX, JX, DESCX, ISGN,
10 INTEGER IV, IX, JV, JX, KASE, N
14 INTEGER DESCV( * ), DESCX( * ), ISGN( * )
15 DOUBLE PRECISION V( * ), X( * )
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 )
155 parameter( itmax = 5 )
156 DOUBLE PRECISION ZERO, ONE, TWO
157 parameter( zero = 0.0d+0, one = 1.0d+0, two = 2.0d+0 )
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
166 DOUBLE PRECISION ESTWORK( 1 ), TEMP( 1 ), WORK( 2 )
169 EXTERNAL blacs_gridinfo, dcopy, dgebr2d, dgebs2d,
170 $ igsum2d,
infog2l, pdamax, pdasum,
174 INTEGER INDXG2L, INDXG2P, INDXL2G, NUMROC
175 EXTERNAL indxg2l, indxg2p, indxl2g, numroc
178 INTRINSIC abs, dble, mod, nint, sign
188 ictxt = descx( ctxt_ )
189 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
191 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol,
192 $ iivx, jjvx, ivxrow, ivxcol )
193 IF( mycol.NE.ivxcol )
195 iroff = mod( ix-1, descx( mb_ ) )
196 np = numroc( n+iroff, descx( mb_ ), myrow, ivxrow, nprow )
197 IF( myrow.EQ.ivxrow )
199 ioffvx = iivx + (jjvx-1)*descx( lld_ )
202 DO 10 i = ioffvx, ioffvx+np-1
203 x( i ) = one / dble( n )
210 GO TO ( 20, 40, 70, 110, 140 )jump
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 )
222 CALL dgebr2d( ictxt,
'Columnwise',
' ', 1, 1, estwork, 1,
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 )
233 CALL dgebr2d( ictxt,
'Columnwise',
' ', 1, 1, estwork, 1,
238 DO 30 i = ioffvx, ioffvx+np-1
239 x( i ) = sign( one, x( i ) )
240 isgn( i ) = nint( x( i ) )
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
254 work( 2 ) = dble( j )
255 CALL dgebs2d( ictxt,
'Columnwise',
' ', 2, 1, work, 2 )
257 CALL dgebr2d( ictxt,
'Columnwise',
' ', 2, 1, work, 2,
260 j = nint( work( 2 ) )
268 DO 60 i = ioffvx, ioffvx+np-1
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 )
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 )
291 CALL dgebr2d( ictxt,
'Columnwise',
' ', 1, 1, estwork, 1,
296 DO 80 i = ioffvx, ioffvx+np-1
297 IF( nint( sign( one, x( i ) ) ).NE.isgn( i ) )
THEN
304 CALL igsum2d( ictxt,
'C',
' ', 1, 1, iflag, 1, -1, mycol )
309 IF( iflag.EQ.0 .OR. estwork( 1 ).LE.estold )
312 DO 100 i = ioffvx, ioffvx+np-1
313 x( i ) = sign( one, x( i ) )
314 isgn( i ) = nint( x( i ) )
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
329 work( 2 ) = dble( j )
330 CALL dgebs2d( ictxt,
'Columnwise',
' ', 2, 1, work, 2 )
332 CALL dgebr2d( ictxt,
'Columnwise',
' ', 2, 1, work, 2,
335 j = nint( work( 2 ) )
338 CALL pdelget(
'Columnwise',
' ', jlmax, x, jlast, jx, descx )
339 IF( ( jlmax.NE.abs( xmax ) ).AND.( iter.LT.itmax ) )
THEN
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
355 x( i ) = altsgn*( one+dble( k-1 ) / dble( n-1 ) )
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 )
370 CALL dgebr2d( ictxt,
'Columnwise',
' ', 1, 1, temp, 1,
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 )