@@ -422,7 +422,7 @@ SUBROUTINE PDGESVX( FACT, TRANS, N, NRHS, A, IA, JA, DESCA, AF,
422422 $ IROFFX, IXCOL, IXROW, J, JJA, JJB, JJX,
423423 $ LCM, LCMQ,
424424 $ LIWMIN, LWMIN, MYCOL, MYROW, NP, NPCOL, NPROW,
425- $ NQ, NQB, NRHSQ, RFSWRK
425+ $ NQ, NQB, NRHSQ, RFSWRK, ICOLEQU
426426 DOUBLE PRECISION AMAX, ANORM, BIGNUM, COLCND, RCMAX, RCMIN,
427427 $ ROWCND, SMLNUM
428428* ..
@@ -656,6 +656,12 @@ SUBROUTINE PDGESVX( FACT, TRANS, N, NRHS, A, IA, JA, DESCA, AF,
656656 RETURN
657657 END IF
658658*
659+ * COLEQU is local but when it is required, the column scaling factors need to be
660+ * broadcast to all processes.
661+ * The variable ICOLEQU is used to label if the current processs applies column
662+ * equilibration, it is later communicated to all processes via a amx operation.
663+ *
664+ ICOLEQU = 0
659665 IF ( EQUIL ) THEN
660666*
661667* Compute row and column scalings to equilibrate the matrix A.
@@ -670,6 +676,7 @@ SUBROUTINE PDGESVX( FACT, TRANS, N, NRHS, A, IA, JA, DESCA, AF,
670676 $ AMAX, EQUED )
671677 ROWEQU = LSAME( EQUED, ' R' ) .OR. LSAME( EQUED, ' B' )
672678 COLEQU = LSAME( EQUED, ' C' ) .OR. LSAME( EQUED, ' B' )
679+ IF ( COLEQU ) ICOLEQU = 1
673680 END IF
674681 END IF
675682*
@@ -781,7 +788,13 @@ SUBROUTINE PDGESVX( FACT, TRANS, N, NRHS, A, IA, JA, DESCA, AF,
781788 $ NRHSQ = NRHSQ- ICOFFX
782789*
783790 IF ( NOTRAN ) THEN
784- IF ( COLEQU ) THEN
791+ *
792+ * Apply a `amx` operation to see if any process requires column scaling
793+ * factors.
794+ *
795+ CALL IGAMX2D( ICTXT, ' All' , ' ' , 1 , 1 , ICOLEQU, 1 , 0 , 0 , - 1 ,
796+ $ - 1 , - 1 )
797+ IF ( ICOLEQU.EQ. 1 ) THEN
785798*
786799* Transpose the column scaling factors
787800*
@@ -797,6 +810,8 @@ SUBROUTINE PDGESVX( FACT, TRANS, N, NRHS, A, IA, JA, DESCA, AF,
797810 $ WORK( IIX ), DESCX( LLD_ ), MYROW, IBCOL )
798811 END IF
799812*
813+ END IF
814+ IF ( COLEQU ) THEN
800815 DO 80 J = JJX, JJX+ NRHSQ-1
801816 DO 70 I = IIX, IIX+ NP-1
802817 X( I+ ( J-1 )* DESCX( LLD_ ) ) = WORK( I )*
0 commit comments