From 971961bd21bc413c0b3ed694f5c88e1fe6d8dc9b Mon Sep 17 00:00:00 2001 From: Kyungmin Lee Date: Sat, 9 May 2026 03:50:46 -0700 Subject: [PATCH] Gate SGGEV3 workspace query on ILV, not ILVL The actual SLAQZ0 call uses 'S' when ILV is true and 'E' otherwise, but the query gated that choice on ILVL, undersizing LWORK for JOBVL='N', JOBVR='V'. Mirror DGGEV3: gate SLAQZ0 and SGGHD3 on ILV, SORGQR on ILVL. --- SRC/sggev3.f | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/SRC/sggev3.f b/SRC/sggev3.f index 2935541d5..9fbe6bafe 100644 --- a/SRC/sggev3.f +++ b/SRC/sggev3.f @@ -329,19 +329,23 @@ LWKOPT = MAX( LWKMIN, 3*N+INT( WORK( 1 ) ) ) CALL SORMQR( 'L', 'T', N, N, N, B, LDB, WORK, A, LDA, WORK, $ -1, IERR ) - LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) ) - CALL SGGHD3( JOBVL, JOBVR, N, 1, N, A, LDA, - $ B, LDB, VL, LDVL, - $ VR, LDVR, WORK, -1, IERR ) LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) ) IF( ILVL ) THEN CALL SORGQR( N, N, N, VL, LDVL, WORK, WORK, -1, IERR ) LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) ) + END IF + IF( ILV ) THEN + CALL SGGHD3( JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, VL, + $ LDVL, VR, LDVR, WORK, -1, IERR ) + LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) ) CALL SLAQZ0( 'S', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, $ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR, $ WORK, -1, 0, IERR ) LWKOPT = MAX( LWKOPT, 2*N+INT( WORK( 1 ) ) ) ELSE + CALL SGGHD3( 'N', 'N', N, 1, N, A, LDA, B, LDB, VL, LDVL, + $ VR, LDVR, WORK, -1, IERR ) + LWKOPT = MAX( LWKOPT, 3*N+INT( WORK( 1 ) ) ) CALL SLAQZ0( 'E', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, $ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR, $ WORK, -1, 0, IERR )