1 SUBROUTINE pclacon( N, V, IV, JV, DESCV, X, IX, JX, DESCX, EST,
10 INTEGER IV, IX, JV, JX, KASE, N
14 INTEGER DESCV( * ), DESCX( * )
15 COMPLEX V( * ), X( * )
146 INTEGER BLOCK_CYCLIC_2D, , 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 )
152 parameter( itmax = 5 )
154 parameter( one = 1.0e+0, two = 2.0e+0 )
156 parameter( czero = ( 0.0e+0, 0.0e+0 ),
157 $ cone = ( 1.0e+0, 0.0e+0 ) )
160 INTEGER I, ICTXT, IIVX, IMAXROW, IOFFVX, IROFF, ITER,
161 $ ivxcol, ivxrow, j, jlast, jjvx, jump, k,
162 $ mycol, myrow, np, npcol, nprow
163 REAL ALTSGN, ESTOLD, SAFMIN, TEMP
175 INTEGER INDXG2L, INDXG2P, INDXL2G, NUMROC
177 EXTERNAL indxg2l, indxg2p, indxl2g, numroc, pslamch
180 INTRINSIC abs,
cmplx, real
189 ictxt = descx( ctxt_ )
192 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol,
193 $ iivx, jjvx, ivxrow, ivxcol )
194 IF( mycol.NE.ivxcol )
196 iroff = mod( ix-1, descx( mb_ ) )
197 np = numroc( n+iroff, descx( mb_ ), myrow, ivxrow, nprow )
198 IF( myrow.EQ.ivxrow )
200 ioffvx = iivx + (jjvx-1)*descx( lld_ )
202 safmin = pslamch( ictxt,
'Safe minimum' )
204 DO 10 i = ioffvx, ioffvx+np-1
205 x( i ) =
cmplx( one / real( n ) )
212 GO TO ( 20, 40, 70, 90, 120 )jump
219 IF( myrow.EQ.ivxrow )
THEN
220 v( ioffvx ) = x( ioffvx )
221 est = abs( v( ioffvx ) )
222 CALL sgebs2d( ictxt,
'Columnwise',
' ', 1, 1, est, 1 )
224 CALL sgebr2d( ictxt,
'Columnwise',
' ', 1, 1, est, 1,
230 CALL pscsum1( 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 sgebs2d( ictxt,
'Columnwise',
' ', 1, 1, est, 1 )
235 CALL sgebr2d( ictxt,
'Columnwise',
' ', 1, 1, est, 1,
240 DO 30 i = ioffvx, ioffvx+np-1
241 IF( abs( x( i ) ).GT.safmin )
THEN
242 x( i ) = x( i ) /
cmplx( abs( x( i ) ) )
255 CALL pcmax1( n, xmax, j, x, ix, jx, descx, 1 )
256 IF( descx( m_ ).EQ.1 .AND. n.EQ.1 )
THEN
257 IF( myrow.EQ.ivxrow )
THEN
259 work( 2 ) =
cmplx( real( j ) )
260 CALL cgebs2d( ictxt, 'columnwise
', ' ', 2, 1, WORK, 2 )
262 CALL CGEBR2D( ICTXT, 'columnwise
', ' ', 2, 1, WORK, 2,
265 J = NINT( REAL( WORK( 2 ) ) )
273 DO 60 I = IOFFVX, IOFFVX+NP-1
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 )
289 CALL CCOPY( NP, X( IOFFVX ), 1, V( IOFFVX ), 1 )
291 CALL PSCSUM1( N, EST, V, IV, JV, DESCV, 1 )
292.EQ..AND..EQ.
IF( DESCV( M_ )1 N1 ) THEN
293.EQ.
IF( MYROWIVXROW ) THEN
294 CALL SGEBS2D( ICTXT, 'columnwise
', ' ', 1, 1, EST, 1 )
296 CALL SGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1, EST, 1,
305 DO 80 I = IOFFVX, IOFFVX+NP-1
306.GT.
IF( ABS( X( I ) )SAFMIN ) THEN
307 X( I ) = X( I ) / CMPLX( ABS( X( I ) ) )
321 CALL PCMAX1( N, XMAX, J, X, IX, JX, DESCX, 1 )
322.EQ..AND..EQ.
IF( DESCX( M_ )1 N1 ) THEN
323.EQ.
IF( MYROWIVXROW ) THEN
325 WORK( 2 ) = CMPLX( REAL( J ) )
326 CALL CGEBS2D( ICTXT, 'columnwise
', ' ', 2, 1, WORK, 2 )
328 CALL CGEBR2D( ICTXT, 'columnwise
', ' ', 2, 1, WORK, 2,
331 J = NINT( REAL( WORK( 2 ) ) )
334 CALL PCELGET( 'columnwise
', ' ', JLMAX, X, JLAST, JX, DESCX )
335.NE..AND.
IF( ( REAL( JLMAX )ABS( REAL( XMAX ) ) )
336.LT.
$ ( ITERITMAX ) ) THEN
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
352 X( I ) = CMPLX( ALTSGN*( ONE+REAL( K-1 ) / REAL( N-1 ) ) )
362 CALL PSCSUM1( N, TEMP, X, IX, JX, DESCX, 1 )
363.EQ..AND..EQ.
IF( DESCX( M_ )1 N1 ) THEN
364.EQ.
IF( MYROWIVXROW ) THEN
365 CALL SGEBS2D( ICTXT, 'columnwise
', ' ', 1, 1, TEMP, 1 )
367 CALL SGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1, TEMP, 1,
371 TEMP = TWO*( TEMP / REAL( 3*N ) )
372.GT.
IF( TEMPEST ) THEN
373 CALL CCOPY( NP, X( IOFFVX ), 1, V( IOFFVX ), 1 )