From 825f5199d43526a21a7d99a53b2c2f2004bf686a Mon Sep 17 00:00:00 2001 From: Kyungmin Lee Date: Sun, 3 May 2026 00:56:14 -0700 Subject: [PATCH] fix reduction scope for column scale bounds in p?geequ When calculating the condition numbers and bounds of the column scale factors in P?GEEQU, the reduction scope for RCMAX, RCMIN, and INFO was incorrectly set to 'Columnwise'. Because column scale factors are distributed across process rows, this meant that the bounds were only reduced locally within each process column. This caused the global condition number to be incorrect and prevented the detection of zero scale factors across the process grid, potentially leading to a deadlock when some processes exit with INFO > 0 while others continue. Changed the reduction scope from 'Columnwise' to 'Rowwise' and updated the corresponding topology variable to ROWCTOP. This ensures that column scale factor bounds are correctly reduced across the entire process grid. --- SRC/pcgeequ.f | 6 +++--- SRC/pdgeequ.f | 6 +++--- SRC/psgeequ.f | 6 +++--- SRC/pzgeequ.f | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/SRC/pcgeequ.f b/SRC/pcgeequ.f index 8eaa67ba..ad937b04 100644 --- a/SRC/pcgeequ.f +++ b/SRC/pcgeequ.f @@ -337,9 +337,9 @@ SUBROUTINE PCGEEQU( M, N, A, IA, JA, DESCA, R, C, ROWCND, COLCND, RCMIN = MIN( RCMIN, C( J ) ) RCMAX = MAX( RCMAX, C( J ) ) 100 CONTINUE - CALL SGAMX2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, RCMAX, 1, IDUMM, + CALL SGAMX2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, RCMAX, 1, IDUMM, $ IDUMM, -1, -1, MYCOL ) - CALL SGAMN2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, RCMIN, 1, IDUMM, + CALL SGAMN2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, RCMIN, 1, IDUMM, $ IDUMM, -1, -1, MYCOL ) * IF( RCMIN.EQ.ZERO ) THEN @@ -351,7 +351,7 @@ SUBROUTINE PCGEEQU( M, N, A, IA, JA, DESCA, R, C, ROWCND, COLCND, $ INFO = M + INDXL2G( J, DESCA( NB_ ), MYCOL, $ DESCA( CSRC_ ), NPCOL ) - JA + 1 110 CONTINUE - CALL IGAMX2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, INFO, 1, + CALL IGAMX2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, INFO, 1, $ IDUMM, IDUMM, -1, -1, MYCOL ) IF( INFO.NE.0 ) $ RETURN diff --git a/SRC/pdgeequ.f b/SRC/pdgeequ.f index bfca61cd..e9a4070d 100644 --- a/SRC/pdgeequ.f +++ b/SRC/pdgeequ.f @@ -329,9 +329,9 @@ SUBROUTINE PDGEEQU( M, N, A, IA, JA, DESCA, R, C, ROWCND, COLCND, RCMIN = MIN( RCMIN, C( J ) ) RCMAX = MAX( RCMAX, C( J ) ) 100 CONTINUE - CALL DGAMX2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, RCMAX, 1, IDUMM, + CALL DGAMX2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, RCMAX, 1, IDUMM, $ IDUMM, -1, -1, MYCOL ) - CALL DGAMN2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, RCMIN, 1, IDUMM, + CALL DGAMN2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, RCMIN, 1, IDUMM, $ IDUMM, -1, -1, MYCOL ) * IF( RCMIN.EQ.ZERO ) THEN @@ -343,7 +343,7 @@ SUBROUTINE PDGEEQU( M, N, A, IA, JA, DESCA, R, C, ROWCND, COLCND, $ INFO = M + INDXL2G( J, DESCA( NB_ ), MYCOL, $ DESCA( CSRC_ ), NPCOL ) - JA + 1 110 CONTINUE - CALL IGAMX2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, INFO, 1, + CALL IGAMX2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, INFO, 1, $ IDUMM, IDUMM, -1, -1, MYCOL ) IF( INFO.NE.0 ) $ RETURN diff --git a/SRC/psgeequ.f b/SRC/psgeequ.f index e56c4898..60e2e7e6 100644 --- a/SRC/psgeequ.f +++ b/SRC/psgeequ.f @@ -329,9 +329,9 @@ SUBROUTINE PSGEEQU( M, N, A, IA, JA, DESCA, R, C, ROWCND, COLCND, RCMIN = MIN( RCMIN, C( J ) ) RCMAX = MAX( RCMAX, C( J ) ) 100 CONTINUE - CALL SGAMX2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, RCMAX, 1, IDUMM, + CALL SGAMX2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, RCMAX, 1, IDUMM, $ IDUMM, -1, -1, MYCOL ) - CALL SGAMN2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, RCMIN, 1, IDUMM, + CALL SGAMN2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, RCMIN, 1, IDUMM, $ IDUMM, -1, -1, MYCOL ) * IF( RCMIN.EQ.ZERO ) THEN @@ -343,7 +343,7 @@ SUBROUTINE PSGEEQU( M, N, A, IA, JA, DESCA, R, C, ROWCND, COLCND, $ INFO = M + INDXL2G( J, DESCA( NB_ ), MYCOL, $ DESCA( CSRC_ ), NPCOL ) - JA + 1 110 CONTINUE - CALL IGAMX2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, INFO, 1, + CALL IGAMX2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, INFO, 1, $ IDUMM, IDUMM, -1, -1, MYCOL ) IF( INFO.NE.0 ) $ RETURN diff --git a/SRC/pzgeequ.f b/SRC/pzgeequ.f index 719922ae..77038b2a 100644 --- a/SRC/pzgeequ.f +++ b/SRC/pzgeequ.f @@ -337,9 +337,9 @@ SUBROUTINE PZGEEQU( M, N, A, IA, JA, DESCA, R, C, ROWCND, COLCND, RCMIN = MIN( RCMIN, C( J ) ) RCMAX = MAX( RCMAX, C( J ) ) 100 CONTINUE - CALL DGAMX2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, RCMAX, 1, IDUMM, + CALL DGAMX2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, RCMAX, 1, IDUMM, $ IDUMM, -1, -1, MYCOL ) - CALL DGAMN2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, RCMIN, 1, IDUMM, + CALL DGAMN2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, RCMIN, 1, IDUMM, $ IDUMM, -1, -1, MYCOL ) * IF( RCMIN.EQ.ZERO ) THEN @@ -351,7 +351,7 @@ SUBROUTINE PZGEEQU( M, N, A, IA, JA, DESCA, R, C, ROWCND, COLCND, $ INFO = M + INDXL2G( J, DESCA( NB_ ), MYCOL, $ DESCA( CSRC_ ), NPCOL ) - JA + 1 110 CONTINUE - CALL IGAMX2D( ICTXT, 'Columnwise', COLCTOP, 1, 1, INFO, 1, + CALL IGAMX2D( ICTXT, 'Rowwise', ROWCTOP, 1, 1, INFO, 1, $ IDUMM, IDUMM, -1, -1, MYCOL ) IF( INFO.NE.0 ) $ RETURN