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 )