Browse Source

Merge pull request #4309 from martin-frbg/lapack926

Change ?GECON to return INFO=1 if RCOND is NaN (Reference-LAPACK PR 926)
tags/v0.3.25^2
Martin Kroeker GitHub 2 years ago
parent
commit
feeb10435b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 128 additions and 28 deletions
  1. +32
    -7
      lapack-netlib/SRC/cgecon.f
  2. +32
    -7
      lapack-netlib/SRC/dgecon.f
  3. +32
    -7
      lapack-netlib/SRC/sgecon.f
  4. +32
    -7
      lapack-netlib/SRC/zgecon.f

+ 32
- 7
lapack-netlib/SRC/cgecon.f View File

@@ -105,8 +105,15 @@
*> \verbatim *> \verbatim
*> INFO is INTEGER *> INFO is INTEGER
*> = 0: successful exit *> = 0: successful exit
*> < 0: if INFO = -i, the i-th argument had an illegal value
*> =-5: if ANORM is NAN or negative.
*> < 0: if INFO = -i, the i-th argument had an illegal value.
*> NaNs are illegal values for ANORM, and they propagate to
*> the output parameter RCOND.
*> Infinity is illegal for ANORM, and it propagates to the output
*> parameter RCOND as 0.
*> = 1: if RCOND = NaN, or
*> RCOND = Inf, or
*> the computed norm of the inverse of A is 0.
*> In the latter, RCOND = 0 is returned.
*> \endverbatim *> \endverbatim
* *
* Authors: * Authors:
@@ -117,7 +124,7 @@
*> \author Univ. of Colorado Denver *> \author Univ. of Colorado Denver
*> \author NAG Ltd. *> \author NAG Ltd.
* *
*> \ingroup complexGEcomputational
*> \ingroup gecon
* *
* ===================================================================== * =====================================================================
SUBROUTINE CGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, RWORK, SUBROUTINE CGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, RWORK,
@@ -147,7 +154,7 @@
LOGICAL ONENRM LOGICAL ONENRM
CHARACTER NORMIN CHARACTER NORMIN
INTEGER IX, KASE, KASE1 INTEGER IX, KASE, KASE1
REAL AINVNM, SCALE, SL, SMLNUM, SU
REAL AINVNM, SCALE, SL, SMLNUM, SU, HUGEVAL
COMPLEX ZDUM COMPLEX ZDUM
* .. * ..
* .. Local Arrays .. * .. Local Arrays ..
@@ -172,6 +179,8 @@
CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) ) CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
* .. * ..
* .. Executable Statements .. * .. Executable Statements ..
*
HUGEVAL = SLAMCH( 'Overflow' )
* *
* Test the input parameters. * Test the input parameters.
* *
@@ -183,7 +192,7 @@
INFO = -2 INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4 INFO = -4
ELSE IF( ANORM.LT.ZERO .OR. SISNAN( ANORM ) ) THEN
ELSE IF( ANORM.LT.ZERO ) THEN
INFO = -5 INFO = -5
END IF END IF
IF( INFO.NE.0 ) THEN IF( INFO.NE.0 ) THEN
@@ -199,6 +208,13 @@
RETURN RETURN
ELSE IF( ANORM.EQ.ZERO ) THEN ELSE IF( ANORM.EQ.ZERO ) THEN
RETURN RETURN
ELSE IF( SISNAN( ANORM ) ) THEN
RCOND = ANORM
INFO = -5
RETURN
ELSE IF( ANORM.GT.HUGEVAL ) THEN
INFO = -5
RETURN
END IF END IF
* *
SMLNUM = SLAMCH( 'Safe minimum' ) SMLNUM = SLAMCH( 'Safe minimum' )
@@ -256,8 +272,17 @@
* *
* Compute the estimate of the reciprocal condition number. * Compute the estimate of the reciprocal condition number.
* *
IF( AINVNM.NE.ZERO )
$ RCOND = ( ONE / AINVNM ) / ANORM
IF( AINVNM.NE.ZERO ) THEN
RCOND = ( ONE / AINVNM ) / ANORM
ELSE
INFO = 1
RETURN
END IF
*
* Check for NaNs and Infs
*
IF( SISNAN( RCOND ) .OR. RCOND.GT.HUGEVAL )
$ INFO = 1
* *
20 CONTINUE 20 CONTINUE
RETURN RETURN


+ 32
- 7
lapack-netlib/SRC/dgecon.f View File

@@ -105,8 +105,15 @@
*> \verbatim *> \verbatim
*> INFO is INTEGER *> INFO is INTEGER
*> = 0: successful exit *> = 0: successful exit
*> < 0: if INFO = -i, the i-th argument had an illegal value
*> =-5: if ANORM is NAN or negative.
*> < 0: if INFO = -i, the i-th argument had an illegal value.
*> NaNs are illegal values for ANORM, and they propagate to
*> the output parameter RCOND.
*> Infinity is illegal for ANORM, and it propagates to the output
*> parameter RCOND as 0.
*> = 1: if RCOND = NaN, or
*> RCOND = Inf, or
*> the computed norm of the inverse of A is 0.
*> In the latter, RCOND = 0 is returned.
*> \endverbatim *> \endverbatim
* *
* Authors: * Authors:
@@ -117,7 +124,7 @@
*> \author Univ. of Colorado Denver *> \author Univ. of Colorado Denver
*> \author NAG Ltd. *> \author NAG Ltd.
* *
*> \ingroup doubleGEcomputational
*> \ingroup gecon
* *
* ===================================================================== * =====================================================================
SUBROUTINE DGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK, SUBROUTINE DGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK,
@@ -147,7 +154,7 @@
LOGICAL ONENRM LOGICAL ONENRM
CHARACTER NORMIN CHARACTER NORMIN
INTEGER IX, KASE, KASE1 INTEGER IX, KASE, KASE1
DOUBLE PRECISION AINVNM, SCALE, SL, SMLNUM, SU
DOUBLE PRECISION AINVNM, SCALE, SL, SMLNUM, SU, HUGEVAL
* .. * ..
* .. Local Arrays .. * .. Local Arrays ..
INTEGER ISAVE( 3 ) INTEGER ISAVE( 3 )
@@ -165,6 +172,8 @@
INTRINSIC ABS, MAX INTRINSIC ABS, MAX
* .. * ..
* .. Executable Statements .. * .. Executable Statements ..
*
HUGEVAL = DLAMCH( 'Overflow' )
* *
* Test the input parameters. * Test the input parameters.
* *
@@ -176,7 +185,7 @@
INFO = -2 INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4 INFO = -4
ELSE IF( ANORM.LT.ZERO .OR. DISNAN( ANORM ) ) THEN
ELSE IF( ANORM.LT.ZERO ) THEN
INFO = -5 INFO = -5
END IF END IF
IF( INFO.NE.0 ) THEN IF( INFO.NE.0 ) THEN
@@ -192,6 +201,13 @@
RETURN RETURN
ELSE IF( ANORM.EQ.ZERO ) THEN ELSE IF( ANORM.EQ.ZERO ) THEN
RETURN RETURN
ELSE IF( DISNAN( ANORM ) ) THEN
RCOND = ANORM
INFO = -5
RETURN
ELSE IF( ANORM.GT.HUGEVAL ) THEN
INFO = -5
RETURN
END IF END IF
* *
SMLNUM = DLAMCH( 'Safe minimum' ) SMLNUM = DLAMCH( 'Safe minimum' )
@@ -248,8 +264,17 @@
* *
* Compute the estimate of the reciprocal condition number. * Compute the estimate of the reciprocal condition number.
* *
IF( AINVNM.NE.ZERO )
$ RCOND = ( ONE / AINVNM ) / ANORM
IF( AINVNM.NE.ZERO ) THEN
RCOND = ( ONE / AINVNM ) / ANORM
ELSE
INFO = 1
RETURN
END IF
*
* Check for NaNs and Infs
*
IF( DISNAN( RCOND ) .OR. RCOND.GT.HUGEVAL )
$ INFO = 1
* *
20 CONTINUE 20 CONTINUE
RETURN RETURN


+ 32
- 7
lapack-netlib/SRC/sgecon.f View File

@@ -105,8 +105,15 @@
*> \verbatim *> \verbatim
*> INFO is INTEGER *> INFO is INTEGER
*> = 0: successful exit *> = 0: successful exit
*> < 0: if INFO = -i, the i-th argument had an illegal value
*> =-5: if ANORM is NAN or negative.
*> < 0: if INFO = -i, the i-th argument had an illegal value.
*> NaNs are illegal values for ANORM, and they propagate to
*> the output parameter RCOND.
*> Infinity is illegal for ANORM, and it propagates to the output
*> parameter RCOND as 0.
*> = 1: if RCOND = NaN, or
*> RCOND = Inf, or
*> the computed norm of the inverse of A is 0.
*> In the latter, RCOND = 0 is returned.
*> \endverbatim *> \endverbatim
* *
* Authors: * Authors:
@@ -117,7 +124,7 @@
*> \author Univ. of Colorado Denver *> \author Univ. of Colorado Denver
*> \author NAG Ltd. *> \author NAG Ltd.
* *
*> \ingroup realGEcomputational
*> \ingroup gecon
* *
* ===================================================================== * =====================================================================
SUBROUTINE SGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK, SUBROUTINE SGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK,
@@ -147,7 +154,7 @@
LOGICAL ONENRM LOGICAL ONENRM
CHARACTER NORMIN CHARACTER NORMIN
INTEGER IX, KASE, KASE1 INTEGER IX, KASE, KASE1
REAL AINVNM, SCALE, SL, SMLNUM, SU
REAL AINVNM, SCALE, SL, SMLNUM, SU, HUGEVAL
* .. * ..
* .. Local Arrays .. * .. Local Arrays ..
INTEGER ISAVE( 3 ) INTEGER ISAVE( 3 )
@@ -165,6 +172,8 @@
INTRINSIC ABS, MAX INTRINSIC ABS, MAX
* .. * ..
* .. Executable Statements .. * .. Executable Statements ..
*
HUGEVAL = SLAMCH( 'Overflow' )
* *
* Test the input parameters. * Test the input parameters.
* *
@@ -176,7 +185,7 @@
INFO = -2 INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4 INFO = -4
ELSE IF( ANORM.LT.ZERO .OR. SISNAN( ANORM ) ) THEN
ELSE IF( ANORM.LT.ZERO ) THEN
INFO = -5 INFO = -5
END IF END IF
IF( INFO.NE.0 ) THEN IF( INFO.NE.0 ) THEN
@@ -192,6 +201,13 @@
RETURN RETURN
ELSE IF( ANORM.EQ.ZERO ) THEN ELSE IF( ANORM.EQ.ZERO ) THEN
RETURN RETURN
ELSE IF( SISNAN( ANORM ) ) THEN
RCOND = ANORM
INFO = -5
RETURN
ELSE IF( ANORM.GT.HUGEVAL ) THEN
INFO = -5
RETURN
END IF END IF
* *
SMLNUM = SLAMCH( 'Safe minimum' ) SMLNUM = SLAMCH( 'Safe minimum' )
@@ -248,8 +264,17 @@
* *
* Compute the estimate of the reciprocal condition number. * Compute the estimate of the reciprocal condition number.
* *
IF( AINVNM.NE.ZERO )
$ RCOND = ( ONE / AINVNM ) / ANORM
IF( AINVNM.NE.ZERO ) THEN
RCOND = ( ONE / AINVNM ) / ANORM
ELSE
INFO = 1
RETURN
END IF
*
* Check for NaNs and Infs
*
IF( SISNAN( RCOND ) .OR. RCOND.GT.HUGEVAL )
$ INFO = 1
* *
20 CONTINUE 20 CONTINUE
RETURN RETURN


+ 32
- 7
lapack-netlib/SRC/zgecon.f View File

@@ -105,8 +105,15 @@
*> \verbatim *> \verbatim
*> INFO is INTEGER *> INFO is INTEGER
*> = 0: successful exit *> = 0: successful exit
*> < 0: if INFO = -i, the i-th argument had an illegal value
*> =-5: if ANORM is NAN or negative.
*> < 0: if INFO = -i, the i-th argument had an illegal value.
*> NaNs are illegal values for ANORM, and they propagate to
*> the output parameter RCOND.
*> Infinity is illegal for ANORM, and it propagates to the output
*> parameter RCOND as 0.
*> = 1: if RCOND = NaN, or
*> RCOND = Inf, or
*> the computed norm of the inverse of A is 0.
*> In the latter, RCOND = 0 is returned.
*> \endverbatim *> \endverbatim
* *
* Authors: * Authors:
@@ -117,7 +124,7 @@
*> \author Univ. of Colorado Denver *> \author Univ. of Colorado Denver
*> \author NAG Ltd. *> \author NAG Ltd.
* *
*> \ingroup complex16GEcomputational
*> \ingroup gecon
* *
* ===================================================================== * =====================================================================
SUBROUTINE ZGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, RWORK, SUBROUTINE ZGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, RWORK,
@@ -147,7 +154,7 @@
LOGICAL ONENRM LOGICAL ONENRM
CHARACTER NORMIN CHARACTER NORMIN
INTEGER IX, KASE, KASE1 INTEGER IX, KASE, KASE1
DOUBLE PRECISION AINVNM, SCALE, SL, SMLNUM, SU
DOUBLE PRECISION AINVNM, SCALE, SL, SMLNUM, SU, HUGEVAL
COMPLEX*16 ZDUM COMPLEX*16 ZDUM
* .. * ..
* .. Local Arrays .. * .. Local Arrays ..
@@ -172,6 +179,8 @@
CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) ) CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
* .. * ..
* .. Executable Statements .. * .. Executable Statements ..
*
HUGEVAL = DLAMCH( 'Overflow' )
* *
* Test the input parameters. * Test the input parameters.
* *
@@ -183,7 +192,7 @@
INFO = -2 INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4 INFO = -4
ELSE IF( ANORM.LT.ZERO .OR. DISNAN( ANORM ) ) THEN
ELSE IF( ANORM.LT.ZERO ) THEN
INFO = -5 INFO = -5
END IF END IF
IF( INFO.NE.0 ) THEN IF( INFO.NE.0 ) THEN
@@ -199,6 +208,13 @@
RETURN RETURN
ELSE IF( ANORM.EQ.ZERO ) THEN ELSE IF( ANORM.EQ.ZERO ) THEN
RETURN RETURN
ELSE IF( DISNAN( ANORM ) ) THEN
RCOND = ANORM
INFO = -5
RETURN
ELSE IF( ANORM.GT.HUGEVAL ) THEN
INFO = -5
RETURN
END IF END IF
* *
SMLNUM = DLAMCH( 'Safe minimum' ) SMLNUM = DLAMCH( 'Safe minimum' )
@@ -256,8 +272,17 @@
* *
* Compute the estimate of the reciprocal condition number. * Compute the estimate of the reciprocal condition number.
* *
IF( AINVNM.NE.ZERO )
$ RCOND = ( ONE / AINVNM ) / ANORM
IF( AINVNM.NE.ZERO ) THEN
RCOND = ( ONE / AINVNM ) / ANORM
ELSE
INFO = 1
RETURN
END IF
*
* Check for NaNs and Infs
*
IF( DISNAN( RCOND ) .OR. RCOND.GT.HUGEVAL )
$ INFO = 1
* *
20 CONTINUE 20 CONTINUE
RETURN RETURN


Loading…
Cancel
Save