From 4a31fcfba4d0750e5f2b79710f2918363c52dbd2 Mon Sep 17 00:00:00 2001 From: Simon Maertens Date: Wed, 9 Sep 2026 11:34:01 +0100 Subject: [PATCH] TESTING: scale the RFP xTFSM forward error by the solution norm The unnormalised difference against xTRSM failed the threshold at a relative error under 2 ulp, on a solve whose solution reaches 4e6. The floor of 1 covers ALPHA = 0, where the solution is exactly zero. Co-Authored-By: Claude Opus 5 (1M context) --- TESTING/LIN/cdrvrf3.f | 6 +++++- TESTING/LIN/ddrvrf3.f | 6 +++++- TESTING/LIN/sdrvrf3.f | 6 +++++- TESTING/LIN/zdrvrf3.f | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/TESTING/LIN/cdrvrf3.f b/TESTING/LIN/cdrvrf3.f index 19358acd2..61d60d49f 100644 --- a/TESTING/LIN/cdrvrf3.f +++ b/TESTING/LIN/cdrvrf3.f @@ -150,7 +150,7 @@ SUBROUTINE CDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, INTEGER I, IFORM, IIM, IIN, INFO, IUPLO, J, M, N, NA, + NFAIL, NRUN, ISIDE, IDIAG, IALPHA, ITRANS COMPLEX ALPHA - REAL EPS + REAL EPS, SOLNRM * .. * .. Local Arrays .. CHARACTER UPLOS( 2 ), FORMS( 2 ), TRANSS( 2 ), @@ -361,6 +361,9 @@ SUBROUTINE CDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, + LDA ) * * Check that the result agrees. +* + SOLNRM = CLANGE( 'I', M, N, B1, LDA, + + S_WORK_CLANGE ) * DO J = 1, N DO I = 1, M @@ -373,6 +376,7 @@ SUBROUTINE CDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, * RESULT( 1 ) = RESULT( 1 ) / SQRT( EPS ) + / REAL( MAX( M, N, 1 ) ) + + / MAX( SOLNRM, 1.0E+0 ) * IF( RESULT( 1 ).GE.THRESH ) THEN IF( NFAIL.EQ.0 ) THEN diff --git a/TESTING/LIN/ddrvrf3.f b/TESTING/LIN/ddrvrf3.f index bf493f5ca..730f91dc3 100644 --- a/TESTING/LIN/ddrvrf3.f +++ b/TESTING/LIN/ddrvrf3.f @@ -146,7 +146,7 @@ SUBROUTINE DDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, CHARACTER UPLO, CFORM, DIAG, TRANS, SIDE INTEGER I, IFORM, IIM, IIN, INFO, IUPLO, J, M, N, NA, + NFAIL, NRUN, ISIDE, IDIAG, IALPHA, ITRANS - DOUBLE PRECISION EPS, ALPHA + DOUBLE PRECISION EPS, ALPHA, SOLNRM * .. * .. Local Arrays .. CHARACTER UPLOS( 2 ), FORMS( 2 ), TRANSS( 2 ), @@ -346,6 +346,9 @@ SUBROUTINE DDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, + LDA ) * * Check that the result agrees. +* + SOLNRM = DLANGE( 'I', M, N, B1, LDA, + + D_WORK_DLANGE ) * DO J = 1, N DO I = 1, M @@ -358,6 +361,7 @@ SUBROUTINE DDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, * RESULT( 1 ) = RESULT( 1 ) / SQRT( EPS ) + / MAX ( MAX( M, N ), 1 ) + + / MAX( SOLNRM, 1.0D+0 ) * IF( RESULT( 1 ).GE.THRESH ) THEN IF( NFAIL.EQ.0 ) THEN diff --git a/TESTING/LIN/sdrvrf3.f b/TESTING/LIN/sdrvrf3.f index 6b9be58f8..ea3fb6d44 100644 --- a/TESTING/LIN/sdrvrf3.f +++ b/TESTING/LIN/sdrvrf3.f @@ -146,7 +146,7 @@ SUBROUTINE SDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, CHARACTER UPLO, CFORM, DIAG, TRANS, SIDE INTEGER I, IFORM, IIM, IIN, INFO, IUPLO, J, M, N, NA, + NFAIL, NRUN, ISIDE, IDIAG, IALPHA, ITRANS - REAL EPS, ALPHA + REAL EPS, ALPHA, SOLNRM * .. * .. Local Arrays .. CHARACTER UPLOS( 2 ), FORMS( 2 ), TRANSS( 2 ), @@ -346,6 +346,9 @@ SUBROUTINE SDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, + LDA ) * * Check that the result agrees. +* + SOLNRM = SLANGE( 'I', M, N, B1, LDA, + + S_WORK_SLANGE ) * DO J = 1, N DO I = 1, M @@ -358,6 +361,7 @@ SUBROUTINE SDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, * RESULT( 1 ) = RESULT( 1 ) / SQRT( EPS ) + / REAL( MAX( M, N, 1 ) ) + + / MAX( SOLNRM, 1.0E+0 ) * IF( RESULT( 1 ).GE.THRESH ) THEN IF( NFAIL.EQ.0 ) THEN diff --git a/TESTING/LIN/zdrvrf3.f b/TESTING/LIN/zdrvrf3.f index 8ff14e9c7..748c7240d 100644 --- a/TESTING/LIN/zdrvrf3.f +++ b/TESTING/LIN/zdrvrf3.f @@ -150,7 +150,7 @@ SUBROUTINE ZDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, INTEGER I, IFORM, IIM, IIN, INFO, IUPLO, J, M, N, NA, + NFAIL, NRUN, ISIDE, IDIAG, IALPHA, ITRANS COMPLEX*16 ALPHA - DOUBLE PRECISION EPS + DOUBLE PRECISION EPS, SOLNRM * .. * .. Local Arrays .. CHARACTER UPLOS( 2 ), FORMS( 2 ), TRANSS( 2 ), @@ -361,6 +361,9 @@ SUBROUTINE ZDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, + LDA ) * * Check that the result agrees. +* + SOLNRM = ZLANGE( 'I', M, N, B1, LDA, + + D_WORK_ZLANGE ) * DO J = 1, N DO I = 1, M @@ -373,6 +376,7 @@ SUBROUTINE ZDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2, * RESULT( 1 ) = RESULT( 1 ) / SQRT( EPS ) + / MAX ( MAX( M, N ), 1 ) + + / MAX( SOLNRM, 1.0D+0 ) * IF( RESULT( 1 ).GE.THRESH ) THEN IF( NFAIL.EQ.0 ) THEN