101 SUBROUTINE sgetrf ( M, N, A, LDA, IPIV, INFO)
108 INTEGER INFO, LDA, M, N
122 INTEGER I, IINFO, J, JB, K, NB
141 ELSE IF( n.LT.0 )
THEN
143 ELSE IF( lda.LT.
max( 1, m ) )
THEN
147 CALL xerbla(
'SGETRF', -info )
153 IF( m.EQ.0 .OR. n.EQ.0 )
158 nb = ilaenv( 1,
'SGETRF',
' ', m, n, -1, -1 )
159 IF( nb.LE.1 .OR. nb.GE.
min( m, n ) )
THEN
163 CALL sgetf2( m, n, a, lda, ipiv, info )
169 DO 20 j = 1,
min( m, n ), nb
170 jb =
min(
min( m, n )-j+1, nb )
175 DO 30 k = 1, j-nb, nb
179 CALL slaswp( jb, a(1, j), lda, k, k+nb-1, ipiv, 1 )
183 CALL strsm(
'Left',
'Lower',
'No transpose',
'Unit',
184 $ nb, jb, one, a( k, k ), lda,
189 CALL sgemm(
'No transpose',
'No transpose',
190 $ m-k-nb+1, jb, nb, -one,
191 $ a( k+nb, k ), lda, a( k, j ), lda, one,
192 $ a( k+nb, j ), lda )
198 CALL sgetf2( m-j+1, jb, a( j, j ), lda, ipiv( j ), iinfo )
202 IF( info.EQ.0 .AND. iinfo.GT.0 )
203 $ info = iinfo + j - 1
204 DO 10 i = j,
min( m, j+jb-1 )
205 ipiv( i ) = j - 1 + ipiv( i )
213 DO 40 k = 1,
min( m, n ), nb
214 CALL slaswp( k-1, a( 1, 1 ), lda, k,
215 $
min(k+nb-1,
min( m, n )), ipiv, 1 )
222 CALL slaswp( n-m, a(1, m+1), lda, 1, m, ipiv, 1 )
226 jb =
min( m-k+1, nb )
228 CALL strsm(
'Left',
'Lower',
'No transpose',
'Unit',
229 $ jb, n-m, one, a( k, k ), lda,
233 IF ( k+nb.LE.m )
THEN
234 CALL sgemm(
'No transpose',
'No transpose',
235 $ m-k-nb+1, n-m, nb, -one,
236 $ a( k+nb, k ), lda, a( k, m+1 ), lda, one,
237 $ a( k+nb, m+1 ), lda )
subroutine xerbla(srname, info)
XERBLA
subroutine sgetrf(m, n, a, lda, ipiv, info)
SGETRF
subroutine sgetf2(m, n, a, lda, ipiv, info)
SGETF2 computes the LU factorization of a general m-by-n matrix using partial pivoting with row inter...
subroutine slaswp(n, a, lda, k1, k2, ipiv, incx)
SLASWP performs a series of row interchanges on a general rectangular matrix.
subroutine strsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
STRSM
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM