1 SUBROUTINE dgecon( NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK,
12 DOUBLE PRECISION ANORM, RCOND
16 DOUBLE PRECISION A( LDA, * ), WORK( * )
68 DOUBLE PRECISION ONE, ZERO
69 parameter( one = 1.0d+0, zero = 0.0d+0 )
74 INTEGER IX, KASE, KASE1
75 DOUBLE PRECISION AINVNM, SCALE, SL, SMLNUM, SU
80 DOUBLE PRECISION DLAMCH
81 EXTERNAL lsame, idamax, dlamch
94 onenrm = norm.EQ.
'1' .OR. lsame( norm,
'O' )
95 IF( .NOT.onenrm .AND. .NOT.lsame( norm,
'I' ) )
THEN
97 ELSE IF( n.LT.0 )
THEN
99 ELSE IF( lda.LT.max( 1, n ) )
THEN
101 ELSE IF( anorm.LT.zero )
THEN
105 CALL xerbla(
'DGECON', -info )
115 ELSE IF( anorm.EQ.zero )
THEN
119 smlnum = dlamch(
'Safe minimum' )
132 CALL dlacon( n, work( n+1 ), work, iwork, ainvnm, kase )
134 IF( kase.EQ.kase1 )
THEN
138 CALL dlatrs(
'Lower',
'No transpose',
'Unit', normin, n, a,
139 $ lda, work, sl, work( 2*n+1 ), info )
143 CALL dlatrs(
'Upper',
'No transpose',
'Non-unit', normin, n,
144 $ a, lda, work, su, work( 3*n+1 ), info )
149 CALL dlatrs(
'Upper',
'Transpose',
'Non-unit', normin, n, a,
150 $ lda, work, su, work( 3*n+1 ), info )
154 CALL dlatrs(
'Lower',
'Transpose',
'Unit', normin, n, a,
155 $ lda, work, sl, work( 2*n+1 ), info )
162 IF( scale.NE.one )
THEN
163 ix = idamax( n, work, 1 )
164 IF( scale.LT.abs( work( ix ) )*smlnum .OR. scale.EQ.zero )
166 CALL drscl( n, scale, work, 1 )
174 $ rcond = ( one / ainvnm ) / anorm
subroutine dgecon(NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK, INFO)
subroutine dlacon(N, V, X, ISGN, EST, KASE)
subroutine dlatrs(UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE, CNORM, INFO)
subroutine drscl(N, SA, SX, INCX)
subroutine xerbla(SRNAME, INFO)