diff --git a/CMAKE/LAPACKTestHelpers.cmake b/CMAKE/LAPACKTestHelpers.cmake index 609f32045..d0f683ab2 100644 --- a/CMAKE/LAPACKTestHelpers.cmake +++ b/CMAKE/LAPACKTestHelpers.cmake @@ -44,9 +44,9 @@ function(lapack_no_constant_propagation_flag out_var) endif() endfunction() -# Disable it for the ?errcxx drivers among ARGN, which manufacture their NaN -# with SQRT( -ONE ). Call this with every source list such a driver is built -# from: the generated _64 and _TEST copies need it as much as the originals. +# Disable it for the CXX and LS error-exit tests among ARGN, which +# manufacture NaNs. Call this with every source list: the generated _64 +# and _TEST copies need it as much as the originals. function(lapack_nag_disable_constant_propagation) lapack_no_constant_propagation_flag(flag) if(NOT flag) @@ -54,7 +54,7 @@ function(lapack_nag_disable_constant_propagation) endif() foreach(source IN LISTS ARGN) get_filename_component(name "${source}" NAME) - if(name MATCHES "^[scdz]errcxx(_[A-Za-z0-9]+)*\\.f$") + if(name MATCHES "^[scdz]err(cxx|ls)(_[A-Za-z0-9]+)*\\.f$") set_source_files_properties("${source}" PROPERTIES COMPILE_OPTIONS "${flag}") endif() diff --git a/SRC/cgelsd.f b/SRC/cgelsd.f index 11ab07ac2..5aa611b46 100644 --- a/SRC/cgelsd.f +++ b/SRC/cgelsd.f @@ -192,6 +192,8 @@ *> > 0: the algorithm for computing the SVD failed to converge; *> if INFO = i, i off-diagonal elements of an intermediate *> bidiagonal form did not converge to zero. +*> INFO = 1 is also returned if A contains a NaN or an +*> infinity. *> \endverbatim * * Authors: diff --git a/SRC/clalsd.f b/SRC/clalsd.f index 3a16ddd13..737eaed8f 100644 --- a/SRC/clalsd.f +++ b/SRC/clalsd.f @@ -153,6 +153,7 @@ *> > 0: The algorithm failed to compute a singular value while *> working on the submatrix lying in rows and columns *> INFO/(N+1) through MOD(INFO,N+1). +*> = 1: also if D or E contains a NaN. *> \endverbatim * * Authors: @@ -212,8 +213,8 @@ SUBROUTINE CLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, * .. External Functions .. INTEGER ISAMAX REAL SLAMCH, SLANST - LOGICAL LSAME - EXTERNAL ISAMAX, SLAMCH, SLANST, LSAME + LOGICAL SISNAN, LSAME + EXTERNAL ISAMAX, SLAMCH, SLANST, SISNAN, LSAME * .. * .. External Subroutines .. EXTERNAL CCOPY, CLACPY, CLALSA, CLASCL, CLASET, @@ -261,6 +262,8 @@ SUBROUTINE CLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, ELSE IF( N.EQ.1 ) THEN IF( D( 1 ).EQ.ZERO ) THEN CALL CLASET( 'A', 1, NRHS, CZERO, CZERO, B, LDB ) + ELSE IF( SISNAN( D( 1 ) ) ) THEN + INFO = 1 ELSE RANK = 1 CALL CLASCL( 'G', 0, 0, D( 1 ), ONE, 1, NRHS, B, LDB, @@ -304,6 +307,9 @@ SUBROUTINE CLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, IF( ORGNRM.EQ.ZERO ) THEN CALL CLASET( 'A', N, NRHS, CZERO, CZERO, B, LDB ) RETURN + ELSE IF( SISNAN( ORGNRM ) ) THEN + INFO = 1 + RETURN END IF * CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO ) diff --git a/SRC/dbdsdc.f b/SRC/dbdsdc.f index 21907669f..8ec720f15 100644 --- a/SRC/dbdsdc.f +++ b/SRC/dbdsdc.f @@ -172,6 +172,8 @@ *> < 0: if INFO = -i, the i-th argument had an illegal value. *> > 0: The algorithm failed to compute a singular value. *> The update process of divide and conquer failed. +*> = 1: also if D or E contains a NaN and the divide and +*> conquer path is taken (COMPQ = 'I' or 'P', N > SMLSIZ). *> \endverbatim * * Authors: @@ -227,10 +229,10 @@ SUBROUTINE DBDSDC( UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT, Q, DOUBLE PRECISION CS, EPS, ORGNRM, P, R, SN * .. * .. External Functions .. - LOGICAL LSAME + LOGICAL DISNAN, LSAME INTEGER ILAENV DOUBLE PRECISION DLAMCH, DLANST - EXTERNAL LSAME, ILAENV, DLAMCH, DLANST + EXTERNAL LSAME, ILAENV, DLAMCH, DLANST, DISNAN * .. * .. External Subroutines .. EXTERNAL DCOPY, DLARTG, DLASCL, DLASD0, DLASDA, @@ -370,8 +372,12 @@ SUBROUTINE DBDSDC( UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT, Q, * Scale. * ORGNRM = DLANST( 'M', N, D, E ) - IF( ORGNRM.EQ.ZERO ) - $ RETURN + IF( ORGNRM.EQ.ZERO ) THEN + RETURN + ELSE IF( DISNAN( ORGNRM ) ) THEN + INFO = 1 + RETURN + END IF CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, IERR ) CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, NM1, 1, E, NM1, IERR ) * diff --git a/SRC/dgelsd.f b/SRC/dgelsd.f index 0043f2593..306e8d8b1 100644 --- a/SRC/dgelsd.f +++ b/SRC/dgelsd.f @@ -176,6 +176,8 @@ *> > 0: the algorithm for computing the SVD failed to converge; *> if INFO = i, i off-diagonal elements of an intermediate *> bidiagonal form did not converge to zero. +*> INFO = 1 is also returned if A contains a NaN or an +*> infinity. *> \endverbatim * * Authors: diff --git a/SRC/dlalsd.f b/SRC/dlalsd.f index f5dbfc601..3355713ec 100644 --- a/SRC/dlalsd.f +++ b/SRC/dlalsd.f @@ -146,6 +146,7 @@ *> > 0: The algorithm failed to compute a singular value while *> working on the submatrix lying in rows and columns *> INFO/(N+1) through MOD(INFO,N+1). +*> = 1: also if D or E contains a NaN. *> \endverbatim * * Authors: @@ -200,8 +201,8 @@ SUBROUTINE DLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, * .. External Functions .. INTEGER IDAMAX DOUBLE PRECISION DLAMCH, DLANST - LOGICAL LSAME - EXTERNAL IDAMAX, DLAMCH, DLANST, LSAME + LOGICAL DISNAN, LSAME + EXTERNAL IDAMAX, DLAMCH, DLANST, DISNAN, LSAME * .. * .. External Subroutines .. EXTERNAL DCOPY, DGEMM, DLACPY, DLALSA, DLARTG, @@ -248,6 +249,8 @@ SUBROUTINE DLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, ELSE IF( N.EQ.1 ) THEN IF( D( 1 ).EQ.ZERO ) THEN CALL DLASET( 'A', 1, NRHS, ZERO, ZERO, B, LDB ) + ELSE IF( DISNAN( D( 1 ) ) ) THEN + INFO = 1 ELSE RANK = 1 CALL DLASCL( 'G', 0, 0, D( 1 ), ONE, 1, NRHS, B, LDB, @@ -291,6 +294,9 @@ SUBROUTINE DLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, IF( ORGNRM.EQ.ZERO ) THEN CALL DLASET( 'A', N, NRHS, ZERO, ZERO, B, LDB ) RETURN + ELSE IF( DISNAN( ORGNRM ) ) THEN + INFO = 1 + RETURN END IF * CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO ) diff --git a/SRC/sbdsdc.f b/SRC/sbdsdc.f index ba285eab4..90135c6c1 100644 --- a/SRC/sbdsdc.f +++ b/SRC/sbdsdc.f @@ -172,6 +172,8 @@ *> < 0: if INFO = -i, the i-th argument had an illegal value. *> > 0: The algorithm failed to compute a singular value. *> The update process of divide and conquer failed. +*> = 1: also if D or E contains a NaN and the divide and +*> conquer path is taken (COMPQ = 'I' or 'P', N > SMLSIZ). *> \endverbatim * * Authors: @@ -227,10 +229,10 @@ SUBROUTINE SBDSDC( UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT, Q, REAL CS, EPS, ORGNRM, P, R, SN * .. * .. External Functions .. - LOGICAL LSAME + LOGICAL SISNAN, LSAME INTEGER ILAENV REAL SLAMCH, SLANST - EXTERNAL SLAMCH, SLANST, ILAENV, LSAME + EXTERNAL SLAMCH, SLANST, ILAENV, LSAME, SISNAN * .. * .. External Subroutines .. EXTERNAL SCOPY, SLARTG, SLASCL, SLASD0, SLASDA, @@ -370,8 +372,12 @@ SUBROUTINE SBDSDC( UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT, Q, * Scale. * ORGNRM = SLANST( 'M', N, D, E ) - IF( ORGNRM.EQ.ZERO ) - $ RETURN + IF( ORGNRM.EQ.ZERO ) THEN + RETURN + ELSE IF( SISNAN( ORGNRM ) ) THEN + INFO = 1 + RETURN + END IF CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, IERR ) CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, NM1, 1, E, NM1, IERR ) * diff --git a/SRC/sgelsd.f b/SRC/sgelsd.f index 423450e1c..ebcfbf334 100644 --- a/SRC/sgelsd.f +++ b/SRC/sgelsd.f @@ -177,6 +177,8 @@ *> > 0: the algorithm for computing the SVD failed to converge; *> if INFO = i, i off-diagonal elements of an intermediate *> bidiagonal form did not converge to zero. +*> INFO = 1 is also returned if A contains a NaN or an +*> infinity. *> \endverbatim * * Authors: diff --git a/SRC/slalsd.f b/SRC/slalsd.f index 722b724d2..d46924abf 100644 --- a/SRC/slalsd.f +++ b/SRC/slalsd.f @@ -146,6 +146,7 @@ *> > 0: The algorithm failed to compute a singular value while *> working on the submatrix lying in rows and columns *> INFO/(N+1) through MOD(INFO,N+1). +*> = 1: also if D or E contains a NaN. *> \endverbatim * * Authors: @@ -200,8 +201,8 @@ SUBROUTINE SLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, * .. External Functions .. INTEGER ISAMAX REAL SLAMCH, SLANST - LOGICAL LSAME - EXTERNAL ISAMAX, SLAMCH, SLANST, LSAME + LOGICAL SISNAN, LSAME + EXTERNAL ISAMAX, SLAMCH, SLANST, SISNAN, LSAME * .. * .. External Subroutines .. EXTERNAL SCOPY, SGEMM, SLACPY, SLALSA, SLARTG, @@ -248,6 +249,8 @@ SUBROUTINE SLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, ELSE IF( N.EQ.1 ) THEN IF( D( 1 ).EQ.ZERO ) THEN CALL SLASET( 'A', 1, NRHS, ZERO, ZERO, B, LDB ) + ELSE IF( SISNAN( D( 1 ) ) ) THEN + INFO = 1 ELSE RANK = 1 CALL SLASCL( 'G', 0, 0, D( 1 ), ONE, 1, NRHS, B, LDB, @@ -291,6 +294,9 @@ SUBROUTINE SLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, IF( ORGNRM.EQ.ZERO ) THEN CALL SLASET( 'A', N, NRHS, ZERO, ZERO, B, LDB ) RETURN + ELSE IF( SISNAN( ORGNRM ) ) THEN + INFO = 1 + RETURN END IF * CALL SLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO ) diff --git a/SRC/zgelsd.f b/SRC/zgelsd.f index c5adf6c9e..6426dc285 100644 --- a/SRC/zgelsd.f +++ b/SRC/zgelsd.f @@ -192,6 +192,8 @@ *> > 0: the algorithm for computing the SVD failed to converge; *> if INFO = i, i off-diagonal elements of an intermediate *> bidiagonal form did not converge to zero. +*> INFO = 1 is also returned if A contains a NaN or an +*> infinity. *> \endverbatim * * Authors: diff --git a/SRC/zlalsd.f b/SRC/zlalsd.f index db4ddec92..0d194db3c 100644 --- a/SRC/zlalsd.f +++ b/SRC/zlalsd.f @@ -154,6 +154,7 @@ *> > 0: The algorithm failed to compute a singular value while *> working on the submatrix lying in rows and columns *> INFO/(N+1) through MOD(INFO,N+1). +*> = 1: also if D or E contains a NaN. *> \endverbatim * * Authors: @@ -213,8 +214,8 @@ SUBROUTINE ZLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, * .. External Functions .. INTEGER IDAMAX DOUBLE PRECISION DLAMCH, DLANST - LOGICAL LSAME - EXTERNAL IDAMAX, DLAMCH, DLANST, LSAME + LOGICAL DISNAN, LSAME + EXTERNAL IDAMAX, DLAMCH, DLANST, DISNAN, LSAME * .. * .. External Subroutines .. EXTERNAL DGEMM, DLARTG, DLASCL, DLASDA, DLASDQ, @@ -262,6 +263,8 @@ SUBROUTINE ZLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, ELSE IF( N.EQ.1 ) THEN IF( D( 1 ).EQ.ZERO ) THEN CALL ZLASET( 'A', 1, NRHS, CZERO, CZERO, B, LDB ) + ELSE IF( DISNAN( D( 1 ) ) ) THEN + INFO = 1 ELSE RANK = 1 CALL ZLASCL( 'G', 0, 0, D( 1 ), ONE, 1, NRHS, B, LDB, @@ -305,6 +308,9 @@ SUBROUTINE ZLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, IF( ORGNRM.EQ.ZERO ) THEN CALL ZLASET( 'A', N, NRHS, CZERO, CZERO, B, LDB ) RETURN + ELSE IF( DISNAN( ORGNRM ) ) THEN + INFO = 1 + RETURN END IF * CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO ) diff --git a/TESTING/LIN/CMakeLists.txt b/TESTING/LIN/CMakeLists.txt index 2313fa0c4..af64f74f4 100644 --- a/TESTING/LIN/CMakeLists.txt +++ b/TESTING/LIN/CMakeLists.txt @@ -222,7 +222,8 @@ else() endif() lapack_nag_disable_constant_propagation( - serrcxx.f cerrcxx.f derrcxx.f zerrcxx.f) + serrcxx.f cerrcxx.f derrcxx.f zerrcxx.f + serrls.f cerrls.f derrls.f zerrls.f) set(DSLINTST dchkab.f ddrvab.f ddrvac.f derrab.f derrac.f dget08.f diff --git a/TESTING/LIN/cerrls.f b/TESTING/LIN/cerrls.f index 5c0daad02..2e97c11ea 100644 --- a/TESTING/LIN/cerrls.f +++ b/TESTING/LIN/cerrls.f @@ -66,18 +66,18 @@ SUBROUTINE CERRLS( PATH, NUNIT ) * ===================================================================== * * .. Parameters .. - INTEGER NMAX - PARAMETER ( NMAX = 2 ) + INTEGER NMAX, LW, LIW + PARAMETER ( NMAX = 2, LW = 1000, LIW = 30 ) * .. * .. Local Scalars .. CHARACTER*2 C2 INTEGER INFO, IRNK - REAL RCOND + REAL NAN, ONE, RCOND * .. * .. Local Arrays .. - INTEGER IP( NMAX ) - REAL RW( NMAX ), S( NMAX ) - COMPLEX A( NMAX, NMAX ), B( NMAX, NMAX ), W( NMAX ) + INTEGER IP( LIW ) + REAL RW( LW ), S( NMAX ) + COMPLEX A( NMAX, NMAX ), B( NMAX, NMAX ), W( LW ) * .. * .. External Functions .. LOGICAL LSAMEN @@ -96,6 +96,9 @@ SUBROUTINE CERRLS( PATH, NUNIT ) COMMON / INFOC / INFOT, NOUT, OK, LERR COMMON / SRNAMC / SRNAMT * .. +* .. Intrinsic Functions .. + INTRINSIC SQRT +* .. * .. Executable Statements .. * NOUT = NUNIT @@ -271,6 +274,26 @@ SUBROUTINE CERRLS( PATH, NUNIT ) CALL CGELSD( 2, 2, 1, A, 2, B, 2, S, RCOND, IRNK, W, 1, $ RW, IP, INFO ) CALL CHKXER( 'CGELSD', INFOT, NOUT, LERR, OK ) +* +* CGELSD must return INFO = 1, without calling XERBLA, when A +* contains a NaN: the NaN norm would otherwise be rejected by +* SLASCL inside CLALSD. +* + ONE = 1.0E+0 + NAN = SQRT( -ONE ) + A( 2, 2 ) = NAN + B( 1, 1 ) = ( 1.0E+0, 0.0E+0 ) + B( 2, 1 ) = ( 1.0E+0, 0.0E+0 ) + RCOND = -1.0E+0 + SRNAMT = 'CGELSD' + INFOT = 0 + LERR = .FALSE. + CALL CGELSD( 2, 2, 1, A, 2, B, 2, S, RCOND, IRNK, W, LW, RW, + $ IP, INFO ) + IF( LERR .OR. INFO.NE.1 ) THEN + WRITE( NOUT, FMT = 9999 )INFO + OK = .FALSE. + END IF END IF * * Print a summary line. @@ -278,6 +301,9 @@ SUBROUTINE CERRLS( PATH, NUNIT ) CALL ALAESM( PATH, OK, NOUT ) * RETURN +* + 9999 FORMAT( ' *** CGELSD on a matrix with a NaN returned INFO = ', I6, + $ ' instead of 1 ***' ) * * End of CERRLS * diff --git a/TESTING/LIN/derrls.f b/TESTING/LIN/derrls.f index d885aab11..1823fb2c6 100644 --- a/TESTING/LIN/derrls.f +++ b/TESTING/LIN/derrls.f @@ -66,18 +66,18 @@ SUBROUTINE DERRLS( PATH, NUNIT ) * ===================================================================== * * .. Parameters .. - INTEGER NMAX - PARAMETER ( NMAX = 2 ) + INTEGER NMAX, LW, LIW + PARAMETER ( NMAX = 2, LW = 1000, LIW = 30 ) * .. * .. Local Scalars .. CHARACTER*2 C2 INTEGER INFO, IRNK - DOUBLE PRECISION RCOND + DOUBLE PRECISION NAN, ONE, RCOND * .. * .. Local Arrays .. - INTEGER IP( NMAX ) + INTEGER IP( LIW ) DOUBLE PRECISION A( NMAX, NMAX ), B( NMAX, NMAX ), S( NMAX ), - $ W( NMAX ) + $ W( LW ) * .. * .. External Functions .. LOGICAL LSAMEN @@ -96,6 +96,9 @@ SUBROUTINE DERRLS( PATH, NUNIT ) COMMON / INFOC / INFOT, NOUT, OK, LERR COMMON / SRNAMC / SRNAMT * .. +* .. Intrinsic Functions .. + INTRINSIC SQRT +* .. * .. Executable Statements .. * NOUT = NUNIT @@ -265,6 +268,26 @@ SUBROUTINE DERRLS( PATH, NUNIT ) CALL DGELSD( 2, 2, 1, A, 2, B, 2, S, RCOND, IRNK, W, 1, IP, $ INFO ) CALL CHKXER( 'DGELSD', INFOT, NOUT, LERR, OK ) +* +* DGELSD must return INFO = 1, without calling XERBLA, when A +* contains a NaN: the NaN norm would otherwise be rejected by +* DLASCL inside DLALSD. +* + ONE = 1.0D+0 + NAN = SQRT( -ONE ) + A( 2, 2 ) = NAN + B( 1, 1 ) = 1.0D+0 + B( 2, 1 ) = 1.0D+0 + RCOND = -1.0D+0 + SRNAMT = 'DGELSD' + INFOT = 0 + LERR = .FALSE. + CALL DGELSD( 2, 2, 1, A, 2, B, 2, S, RCOND, IRNK, W, LW, IP, + $ INFO ) + IF( LERR .OR. INFO.NE.1 ) THEN + WRITE( NOUT, FMT = 9999 )INFO + OK = .FALSE. + END IF END IF * * Print a summary line. @@ -272,6 +295,9 @@ SUBROUTINE DERRLS( PATH, NUNIT ) CALL ALAESM( PATH, OK, NOUT ) * RETURN +* + 9999 FORMAT( ' *** DGELSD on a matrix with a NaN returned INFO = ', I6, + $ ' instead of 1 ***' ) * * End of DERRLS * diff --git a/TESTING/LIN/serrls.f b/TESTING/LIN/serrls.f index e4c0bfe7f..9fa4f1cfc 100644 --- a/TESTING/LIN/serrls.f +++ b/TESTING/LIN/serrls.f @@ -66,18 +66,18 @@ SUBROUTINE SERRLS( PATH, NUNIT ) * ===================================================================== * * .. Parameters .. - INTEGER NMAX - PARAMETER ( NMAX = 2 ) + INTEGER NMAX, LW, LIW + PARAMETER ( NMAX = 2, LW = 1000, LIW = 30 ) * .. * .. Local Scalars .. CHARACTER*2 C2 INTEGER INFO, IRNK - REAL RCOND + REAL NAN, ONE, RCOND * .. * .. Local Arrays .. - INTEGER IP( NMAX ) + INTEGER IP( LIW ) REAL A( NMAX, NMAX ), B( NMAX, NMAX ), S( NMAX ), - $ W( NMAX ) + $ W( LW ) * .. * .. External Functions .. LOGICAL LSAMEN @@ -96,6 +96,9 @@ SUBROUTINE SERRLS( PATH, NUNIT ) COMMON / INFOC / INFOT, NOUT, OK, LERR COMMON / SRNAMC / SRNAMT * .. +* .. Intrinsic Functions .. + INTRINSIC SQRT +* .. * .. Executable Statements .. * NOUT = NUNIT @@ -265,6 +268,26 @@ SUBROUTINE SERRLS( PATH, NUNIT ) CALL SGELSD( 2, 2, 1, A, 2, B, 2, S, RCOND, IRNK, W, 1, IP, $ INFO ) CALL CHKXER( 'SGELSD', INFOT, NOUT, LERR, OK ) +* +* SGELSD must return INFO = 1, without calling XERBLA, when A +* contains a NaN: the NaN norm would otherwise be rejected by +* SLASCL inside SLALSD. +* + ONE = 1.0E+0 + NAN = SQRT( -ONE ) + A( 2, 2 ) = NAN + B( 1, 1 ) = 1.0E+0 + B( 2, 1 ) = 1.0E+0 + RCOND = -1.0E+0 + SRNAMT = 'SGELSD' + INFOT = 0 + LERR = .FALSE. + CALL SGELSD( 2, 2, 1, A, 2, B, 2, S, RCOND, IRNK, W, LW, IP, + $ INFO ) + IF( LERR .OR. INFO.NE.1 ) THEN + WRITE( NOUT, FMT = 9999 )INFO + OK = .FALSE. + END IF END IF * * Print a summary line. @@ -272,6 +295,9 @@ SUBROUTINE SERRLS( PATH, NUNIT ) CALL ALAESM( PATH, OK, NOUT ) * RETURN +* + 9999 FORMAT( ' *** SGELSD on a matrix with a NaN returned INFO = ', I6, + $ ' instead of 1 ***' ) * * End of SERRLS * diff --git a/TESTING/LIN/zerrls.f b/TESTING/LIN/zerrls.f index 2e7b7bcb7..12deae0f4 100644 --- a/TESTING/LIN/zerrls.f +++ b/TESTING/LIN/zerrls.f @@ -66,18 +66,18 @@ SUBROUTINE ZERRLS( PATH, NUNIT ) * ===================================================================== * * .. Parameters .. - INTEGER NMAX - PARAMETER ( NMAX = 2 ) + INTEGER NMAX, LW, LIW + PARAMETER ( NMAX = 2, LW = 1000, LIW = 30 ) * .. * .. Local Scalars .. CHARACTER*2 C2 INTEGER INFO, IRNK - DOUBLE PRECISION RCOND + DOUBLE PRECISION NAN, ONE, RCOND * .. * .. Local Arrays .. - INTEGER IP( NMAX ) - DOUBLE PRECISION RW( NMAX ), S( NMAX ) - COMPLEX*16 A( NMAX, NMAX ), B( NMAX, NMAX ), W( NMAX ) + INTEGER IP( LIW ) + DOUBLE PRECISION RW( LW ), S( NMAX ) + COMPLEX*16 A( NMAX, NMAX ), B( NMAX, NMAX ), W( LW ) * .. * .. External Functions .. LOGICAL LSAMEN @@ -96,6 +96,9 @@ SUBROUTINE ZERRLS( PATH, NUNIT ) COMMON / INFOC / INFOT, NOUT, OK, LERR COMMON / SRNAMC / SRNAMT * .. +* .. Intrinsic Functions .. + INTRINSIC SQRT +* .. * .. Executable Statements .. * NOUT = NUNIT @@ -271,6 +274,26 @@ SUBROUTINE ZERRLS( PATH, NUNIT ) CALL ZGELSD( 2, 2, 1, A, 2, B, 2, S, RCOND, IRNK, W, 1, RW, IP, $ INFO ) CALL CHKXER( 'ZGELSD', INFOT, NOUT, LERR, OK ) +* +* ZGELSD must return INFO = 1, without calling XERBLA, when A +* contains a NaN: the NaN norm would otherwise be rejected by +* DLASCL inside ZLALSD. +* + ONE = 1.0D+0 + NAN = SQRT( -ONE ) + A( 2, 2 ) = NAN + B( 1, 1 ) = ( 1.0D+0, 0.0D+0 ) + B( 2, 1 ) = ( 1.0D+0, 0.0D+0 ) + RCOND = -1.0D+0 + SRNAMT = 'ZGELSD' + INFOT = 0 + LERR = .FALSE. + CALL ZGELSD( 2, 2, 1, A, 2, B, 2, S, RCOND, IRNK, W, LW, RW, + $ IP, INFO ) + IF( LERR .OR. INFO.NE.1 ) THEN + WRITE( NOUT, FMT = 9999 )INFO + OK = .FALSE. + END IF END IF * * Print a summary line. @@ -278,6 +301,9 @@ SUBROUTINE ZERRLS( PATH, NUNIT ) CALL ALAESM( PATH, OK, NOUT ) * RETURN +* + 9999 FORMAT( ' *** ZGELSD on a matrix with a NaN returned INFO = ', I6, + $ ' instead of 1 ***' ) * * End of ZERRLS *