135 SUBROUTINE strcon( NORM, UPLO, DIAG, N, A, LDA, RCOND, WORK,
143 CHARACTER DIAG, NORM, UPLO
149 REAL A( lda, * ), WORK( * )
156 parameter( one = 1.0e+0, zero = 0.0e+0 )
159 LOGICAL NOUNIT, ONENRM, UPPER
161 INTEGER IX, KASE, KASE1
162 REAL AINVNM, ANORM, SCALE, SMLNUM, XNORM
171 EXTERNAL lsame, isamax, slamch, slantr
177 INTRINSIC abs, max, real
184 upper = lsame( uplo,
'U' )
185 onenrm = norm.EQ.
'1' .OR. lsame( norm,
'O' )
186 nounit = lsame( diag,
'N' )
188 IF( .NOT.onenrm .AND. .NOT.lsame( norm,
'I' ) )
THEN 190 ELSE IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN 192 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN 194 ELSE IF( n.LT.0 )
THEN 196 ELSE IF( lda.LT.max( 1, n ) )
THEN 200 CALL xerbla(
'STRCON', -info )
212 smlnum = slamch(
'Safe minimum' )*
REAL( MAX( 1, N ) )
216 anorm = slantr( norm, uplo, diag, n, n, a, lda, work )
220 IF( anorm.GT.zero )
THEN 233 CALL slacn2( n, work( n+1 ), work, iwork, ainvnm, kase, isave )
235 IF( kase.EQ.kase1 )
THEN 239 CALL slatrs( uplo,
'No transpose', diag, normin, n, a,
240 $ lda, work, scale, work( 2*n+1 ), info )
245 CALL slatrs( uplo,
'Transpose', diag, normin, n, a, lda,
246 $ work, scale, work( 2*n+1 ), info )
252 IF( scale.NE.one )
THEN 253 ix = isamax( n, work, 1 )
254 xnorm = abs( work( ix ) )
255 IF( scale.LT.xnorm*smlnum .OR. scale.EQ.zero )
257 CALL srscl( n, scale, work, 1 )
265 $ rcond = ( one / anorm ) / ainvnm
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slatrs(UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE, CNORM, INFO)
SLATRS solves a triangular system of equations with the scale factor set to prevent overflow...
subroutine strcon(NORM, UPLO, DIAG, N, A, LDA, RCOND, WORK, IWORK, INFO)
STRCON
subroutine slacn2(N, V, X, ISGN, EST, KASE, ISAVE)
SLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matrix-vec...
subroutine srscl(N, SA, SX, INCX)
SRSCL multiplies a vector by the reciprocal of a real scalar.