Skip to content

Commit db1221f

Browse files
authored
Merge pull request #120 from TLCFEM/bug-sync-col-scaling
Sync `COLEQU` for all processes
2 parents 11790f0 + f1ce5c6 commit db1221f

File tree

4 files changed

+68
-8
lines changed

4 files changed

+68
-8
lines changed

SRC/pcgesvx.f

+17-2
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ SUBROUTINE PCGESVX( FACT, TRANS, N, NRHS, A, IA, JA, DESCA, AF,
423423
$ IROFFX, IXCOL, IXROW, J, JJA, JJB, JJX,
424424
$ LCM, LCMQ,
425425
$ LRWMIN, LWMIN, MYCOL, MYROW, NP, NPCOL, NPROW,
426-
$ NQ, NQB, NRHSQ, RFSWRK
426+
$ NQ, NQB, NRHSQ, RFSWRK, ICOLEQU
427427
REAL AMAX, ANORM, BIGNUM, COLCND, RCMAX, RCMIN,
428428
$ ROWCND, SMLNUM
429429
* ..
@@ -656,6 +656,12 @@ SUBROUTINE PCGESVX( 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 PCGESVX( 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 PCGESVX( 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
*
@@ -798,6 +811,8 @@ SUBROUTINE PCGESVX( FACT, TRANS, N, NRHS, A, IA, JA, DESCA, AF,
798811
$ IBCOL )
799812
END IF
800813
*
814+
END IF
815+
IF( COLEQU ) THEN
801816
DO 80 J = JJX, JJX+NRHSQ-1
802817
DO 70 I = IIX, IIX+NP-1
803818
X( I+( J-1 )*DESCX( LLD_ ) ) = RWORK( I )*

SRC/pdgesvx.f

+17-2
Original file line numberDiff line numberDiff line change
@@ -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 )*

SRC/psgesvx.f

+17-2
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ SUBROUTINE PSGESVX( 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
REAL AMAX, ANORM, BIGNUM, COLCND, RCMAX, RCMIN,
427427
$ ROWCND, SMLNUM
428428
* ..
@@ -656,6 +656,12 @@ SUBROUTINE PSGESVX( 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 PSGESVX( 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 PSGESVX( 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 PSGESVX( 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 )*

SRC/pzgesvx.f

+17-2
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ SUBROUTINE PZGESVX( FACT, TRANS, N, NRHS, A, IA, JA, DESCA, AF,
423423
$ IROFFX, IXCOL, IXROW, J, JJA, JJB, JJX,
424424
$ LCM, LCMQ,
425425
$ LRWMIN, LWMIN, MYCOL, MYROW, NP, NPCOL, NPROW,
426-
$ NQ, NQB, NRHSQ, RFSWRK
426+
$ NQ, NQB, NRHSQ, RFSWRK, ICOLEQU
427427
DOUBLE PRECISION AMAX, ANORM, BIGNUM, COLCND, RCMAX, RCMIN,
428428
$ ROWCND, SMLNUM
429429
* ..
@@ -656,6 +656,12 @@ SUBROUTINE PZGESVX( 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 PZGESVX( 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 PZGESVX( 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
*
@@ -798,6 +811,8 @@ SUBROUTINE PZGESVX( FACT, TRANS, N, NRHS, A, IA, JA, DESCA, AF,
798811
$ IBCOL )
799812
END IF
800813
*
814+
END IF
815+
IF( COLEQU ) THEN
801816
DO 80 J = JJX, JJX+NRHSQ-1
802817
DO 70 I = IIX, IIX+NP-1
803818
X( I+( J-1 )*DESCX( LLD_ ) ) = RWORK( I )*

0 commit comments

Comments
 (0)