111 SUBROUTINE sgetri( N, A, LDA, IPIV, WORK, LWORK, INFO )
118 INTEGER INFO, LDA, LWORK, N
122 REAL A( LDA, * ), WORK( * )
129 parameter( zero = 0.0e+0, one = 1.0e+0 )
133 INTEGER I, IWS, J, JB, JJ, JP, LDWORK, LWKOPT, NB,
140 EXTERNAL sroundup_lwork
154 nb = ilaenv( 1,
'SGETRI',
' ', n, -1, -1, -1 )
155 lwkopt = max( 1, n*nb )
156 work( 1 ) = sroundup_lwork( lwkopt )
158 lquery = ( lwork.EQ.-1 )
161 ELSE IF( lda.LT.max( 1, n ) )
THEN
163 ELSE IF( lwork.LT.max( 1, n ) .AND. .NOT.lquery )
THEN
167 CALL xerbla(
'SGETRI', -info )
169 ELSE IF( lquery )
THEN
181 CALL strtri(
'Upper',
'Non-unit', n, a, lda, info )
187 IF( nb.GT.1 .AND. nb.LT.n )
THEN
188 iws = max( ldwork*nb, 1 )
189 IF( lwork.LT.iws )
THEN
191 nbmin = max( 2, ilaenv( 2,
'SGETRI',
' ', n, -1, -1,
200 IF( nb.LT.nbmin .OR. nb.GE.n )
THEN
209 work( i ) = a( i, j )
216 $
CALL sgemv(
'No transpose', n, n-j, -one, a( 1, j+1 ),
217 $ lda, work( j+1 ), 1, one, a( 1, j ), 1 )
223 nn = ( ( n-1 ) / nb )*nb + 1
225 jb = min( nb, n-j+1 )
230 DO 40 jj = j, j + jb - 1
232 work( i+( jj-j )*ldwork ) = a( i, jj )
240 $
CALL sgemm(
'No transpose',
'No transpose', n, jb,
241 $ n-j-jb+1, -one, a( 1, j+jb ), lda,
242 $ work( j+jb ), ldwork, one, a( 1, j ), lda )
243 CALL strsm(
'Right',
'Lower',
'No transpose',
'Unit', n,
245 $ one, work( j ), ldwork, a( 1, j ), lda )
251 DO 60 j = n - 1, 1, -1
254 $
CALL sswap( n, a( 1, j ), 1, a( 1, jp ), 1 )
257 work( 1 ) = sroundup_lwork( iws )
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
subroutine sgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
SGEMV
subroutine sgetri(n, a, lda, ipiv, work, lwork, info)
SGETRI
subroutine strsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
STRSM