Those are just cosmetic changes to update version number and various other minor change.
204 lines
5.9 KiB
FortranFixed
204 lines
5.9 KiB
FortranFixed
SUBROUTINE STBCON( NORM, UPLO, DIAG, N, KD, AB, LDAB, RCOND, WORK,
|
|
$ IWORK, INFO )
|
|
*
|
|
* -- LAPACK routine (version 3.2) --
|
|
* -- LAPACK is a software package provided by Univ. of Tennessee, --
|
|
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
|
|
* November 2006
|
|
*
|
|
* Modified to call SLACN2 in place of SLACON, 7 Feb 03, SJH.
|
|
*
|
|
* .. Scalar Arguments ..
|
|
CHARACTER DIAG, NORM, UPLO
|
|
INTEGER INFO, KD, LDAB, N
|
|
REAL RCOND
|
|
* ..
|
|
* .. Array Arguments ..
|
|
INTEGER IWORK( * )
|
|
REAL AB( LDAB, * ), WORK( * )
|
|
* ..
|
|
*
|
|
* Purpose
|
|
* =======
|
|
*
|
|
* STBCON estimates the reciprocal of the condition number of a
|
|
* triangular band matrix A, in either the 1-norm or the infinity-norm.
|
|
*
|
|
* The norm of A is computed and an estimate is obtained for
|
|
* norm(inv(A)), then the reciprocal of the condition number is
|
|
* computed as
|
|
* RCOND = 1 / ( norm(A) * norm(inv(A)) ).
|
|
*
|
|
* Arguments
|
|
* =========
|
|
*
|
|
* NORM (input) CHARACTER*1
|
|
* Specifies whether the 1-norm condition number or the
|
|
* infinity-norm condition number is required:
|
|
* = '1' or 'O': 1-norm;
|
|
* = 'I': Infinity-norm.
|
|
*
|
|
* UPLO (input) CHARACTER*1
|
|
* = 'U': A is upper triangular;
|
|
* = 'L': A is lower triangular.
|
|
*
|
|
* DIAG (input) CHARACTER*1
|
|
* = 'N': A is non-unit triangular;
|
|
* = 'U': A is unit triangular.
|
|
*
|
|
* N (input) INTEGER
|
|
* The order of the matrix A. N >= 0.
|
|
*
|
|
* KD (input) INTEGER
|
|
* The number of superdiagonals or subdiagonals of the
|
|
* triangular band matrix A. KD >= 0.
|
|
*
|
|
* AB (input) REAL array, dimension (LDAB,N)
|
|
* The upper or lower triangular band matrix A, stored in the
|
|
* first kd+1 rows of the array. The j-th column of A is stored
|
|
* in the j-th column of the array AB as follows:
|
|
* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
|
|
* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd).
|
|
* If DIAG = 'U', the diagonal elements of A are not referenced
|
|
* and are assumed to be 1.
|
|
*
|
|
* LDAB (input) INTEGER
|
|
* The leading dimension of the array AB. LDAB >= KD+1.
|
|
*
|
|
* RCOND (output) REAL
|
|
* The reciprocal of the condition number of the matrix A,
|
|
* computed as RCOND = 1/(norm(A) * norm(inv(A))).
|
|
*
|
|
* WORK (workspace) REAL array, dimension (3*N)
|
|
*
|
|
* IWORK (workspace) INTEGER array, dimension (N)
|
|
*
|
|
* INFO (output) INTEGER
|
|
* = 0: successful exit
|
|
* < 0: if INFO = -i, the i-th argument had an illegal value
|
|
*
|
|
* =====================================================================
|
|
*
|
|
* .. Parameters ..
|
|
REAL ONE, ZERO
|
|
PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
|
|
* ..
|
|
* .. Local Scalars ..
|
|
LOGICAL NOUNIT, ONENRM, UPPER
|
|
CHARACTER NORMIN
|
|
INTEGER IX, KASE, KASE1
|
|
REAL AINVNM, ANORM, SCALE, SMLNUM, XNORM
|
|
* ..
|
|
* .. Local Arrays ..
|
|
INTEGER ISAVE( 3 )
|
|
* ..
|
|
* .. External Functions ..
|
|
LOGICAL LSAME
|
|
INTEGER ISAMAX
|
|
REAL SLAMCH, SLANTB
|
|
EXTERNAL LSAME, ISAMAX, SLAMCH, SLANTB
|
|
* ..
|
|
* .. External Subroutines ..
|
|
EXTERNAL SLACN2, SLATBS, SRSCL, XERBLA
|
|
* ..
|
|
* .. Intrinsic Functions ..
|
|
INTRINSIC ABS, MAX, REAL
|
|
* ..
|
|
* .. Executable Statements ..
|
|
*
|
|
* Test the input parameters.
|
|
*
|
|
INFO = 0
|
|
UPPER = LSAME( UPLO, 'U' )
|
|
ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
|
|
NOUNIT = LSAME( DIAG, 'N' )
|
|
*
|
|
IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
|
|
INFO = -1
|
|
ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
|
|
INFO = -2
|
|
ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
|
|
INFO = -3
|
|
ELSE IF( N.LT.0 ) THEN
|
|
INFO = -4
|
|
ELSE IF( KD.LT.0 ) THEN
|
|
INFO = -5
|
|
ELSE IF( LDAB.LT.KD+1 ) THEN
|
|
INFO = -7
|
|
END IF
|
|
IF( INFO.NE.0 ) THEN
|
|
CALL XERBLA( 'STBCON', -INFO )
|
|
RETURN
|
|
END IF
|
|
*
|
|
* Quick return if possible
|
|
*
|
|
IF( N.EQ.0 ) THEN
|
|
RCOND = ONE
|
|
RETURN
|
|
END IF
|
|
*
|
|
RCOND = ZERO
|
|
SMLNUM = SLAMCH( 'Safe minimum' )*REAL( MAX( 1, N ) )
|
|
*
|
|
* Compute the norm of the triangular matrix A.
|
|
*
|
|
ANORM = SLANTB( NORM, UPLO, DIAG, N, KD, AB, LDAB, WORK )
|
|
*
|
|
* Continue only if ANORM > 0.
|
|
*
|
|
IF( ANORM.GT.ZERO ) THEN
|
|
*
|
|
* Estimate the norm of the inverse of A.
|
|
*
|
|
AINVNM = ZERO
|
|
NORMIN = 'N'
|
|
IF( ONENRM ) THEN
|
|
KASE1 = 1
|
|
ELSE
|
|
KASE1 = 2
|
|
END IF
|
|
KASE = 0
|
|
10 CONTINUE
|
|
CALL SLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE )
|
|
IF( KASE.NE.0 ) THEN
|
|
IF( KASE.EQ.KASE1 ) THEN
|
|
*
|
|
* Multiply by inv(A).
|
|
*
|
|
CALL SLATBS( UPLO, 'No transpose', DIAG, NORMIN, N, KD,
|
|
$ AB, LDAB, WORK, SCALE, WORK( 2*N+1 ), INFO )
|
|
ELSE
|
|
*
|
|
* Multiply by inv(A').
|
|
*
|
|
CALL SLATBS( UPLO, 'Transpose', DIAG, NORMIN, N, KD, AB,
|
|
$ LDAB, WORK, SCALE, WORK( 2*N+1 ), INFO )
|
|
END IF
|
|
NORMIN = 'Y'
|
|
*
|
|
* Multiply by 1/SCALE if doing so will not cause overflow.
|
|
*
|
|
IF( SCALE.NE.ONE ) THEN
|
|
IX = ISAMAX( N, WORK, 1 )
|
|
XNORM = ABS( WORK( IX ) )
|
|
IF( SCALE.LT.XNORM*SMLNUM .OR. SCALE.EQ.ZERO )
|
|
$ GO TO 20
|
|
CALL SRSCL( N, SCALE, WORK, 1 )
|
|
END IF
|
|
GO TO 10
|
|
END IF
|
|
*
|
|
* Compute the estimate of the reciprocal condition number.
|
|
*
|
|
IF( AINVNM.NE.ZERO )
|
|
$ RCOND = ( ONE / ANORM ) / AINVNM
|
|
END IF
|
|
*
|
|
20 CONTINUE
|
|
RETURN
|
|
*
|
|
* End of STBCON
|
|
*
|
|
END
|