1 SUBROUTINE pzlacon( N, V, IV, JV, DESCV, X, IX, JX, DESCX, EST,
10 INTEGER IV, IX, JV, JX, KASE, N
14 INTEGER DESCV( * ), ( * )
15 COMPLEX*16 V( * ), X( * )
146 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, , ,
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 )
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 ) )
160 INTEGER I, ICTXT, IIVX, IMAXROW, IOFFVX, IROFF, ITER,
161 $ ivxcol, ivxrow, j, jlast, jjvx, jump, k,
162 $ mycol, myrow, np, npcol, nprow
163 DOUBLE PRECISION ALTSGN, ESTOLD, SAFMIN, TEMP
164 COMPLEX*16 JLMAX, XMAX
175 INTEGER INDXG2L, INDXG2P, INDXL2G, NUMROC
177 EXTERNAL indxg2l, indxg2p, indxl2g, numroc,
pdlamch
180 INTRINSIC abs, dble, dcmplx
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 =
pdlamch( ictxt,
'Safe minimum' )
204 DO 10 i = ioffvx, ioffvx+np-1
205 x( i ) = dcmplx( one / dble( 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 dgebs2d( ictxt,
'Columnwise',
' ', 1, 1, est, 1 )
224 CALL dgebr2d( ictxt,
'Columnwise',
' ', 1, 1, est, 1,
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
235 CALL dgebr2d( 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 ) / dcmplx( abs( x( i ) ) )
255 CALL pzmax1( 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 ) = dcmplx( dble( j ) )
260 CALL zgebs2d( ictxt,
'Columnwise',
' ', 2, 1, work, 2 )
262 CALL zgebr2d( ictxt, 'columnwise
', ' ', 2, 1, WORK, 2,
265 J = NINT( DBLE( 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 ZCOPY( NP, X( IOFFVX ), 1, V( IOFFVX ), 1 )
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 )
296 CALL DGEBR2D( 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 ) / DCMPLX( ABS( X( I ) ) )
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
325 WORK( 2 ) = DCMPLX( DBLE( J ) )
326 CALL ZGEBS2D( ICTXT, 'columnwise
', ' ', 2, 1, WORK, 2 )
328 CALL ZGEBR2D( ICTXT, 'columnwise
', ' ', 2, 1, WORK, 2,
331 J = NINT( DBLE( WORK( 2 ) ) )
334 CALL PZELGET( 'columnwise
', ' ', JLMAX, X, JLAST, JX, DESCX )
335.NE..AND.
IF( ( DBLE( JLMAX )ABS( DBLE( 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 ) = DCMPLX( ALTSGN*( ONE+DBLE( K-1 ) / DBLE( N-1 ) ) )
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 )
367 CALL DGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1, TEMP, 1,
371 TEMP = TWO*( TEMP / DBLE( 3*N ) )
372.GT.
IF( TEMPEST ) THEN
373 CALL ZCOPY( NP, X( IOFFVX ), 1, V( IOFFVX ), 1 )