135 SUBROUTINE sgetrf( M, N, A, LDA, IPIV, INFO )
142 INTEGER INFO, LDA, M, N
152 REAL ONE, ZERO, NEGONE
153 parameter( one = 1.0e+0, zero = 0.0e+0 )
154 parameter( negone = -1.0e+0 )
158 INTEGER I, J, JP, NSTEP, NTOPIV, NPIVED, KAHEAD
159 INTEGER KSTART, IPIVSTART, JPIVSTART, KCOLS
165 EXTERNAL slamch, isamax, sisnan
180 ELSE IF( n.LT.0 )
THEN
182 ELSE IF( lda.LT.
max( 1, m ) )
THEN
186 CALL xerbla(
'SGETRF', -info )
192 IF( m.EQ.0 .OR. n.EQ.0 )
197 sfmin = slamch(
'S' )
201 kahead = iand( j, -j )
202 kstart = j + 1 - kahead
203 kcols =
min( kahead, m-j )
207 jp = j - 1 + isamax( m-j+1, a( j, j ), 1 )
213 a( j, j ) = a( jp, j )
220 jpivstart = j - ntopiv
221 DO WHILE ( ntopiv .LT. kahead )
222 CALL slaswp( ntopiv, a( 1, jpivstart ), lda, ipivstart, j,
224 ipivstart = ipivstart - ntopiv;
226 jpivstart = jpivstart - ntopiv;
230 CALL slaswp( kcols, a( 1,j+1 ), lda, kstart, j, ipiv, 1 )
233 IF( a( j, j ).NE.zero .AND. .NOT.sisnan( a( j, j ) ) )
THEN
234 IF( abs(a( j, j )) .GE. sfmin )
THEN
235 CALL sscal( m-j, one / a( j, j ), a( j+1, j ), 1 )
238 a( j+i, j ) = a( j+i, j ) / a( j, j )
241 ELSE IF( a( j,j ) .EQ. zero .AND. info .EQ. 0 )
THEN
246 CALL strsm(
'Left',
'Lower',
'No transpose',
'Unit', kahead,
247 $ kcols, one, a( kstart, kstart ), lda,
248 $ a( kstart, j+1 ), lda )
250 CALL sgemm(
'No transpose',
'No transpose', m-j,
251 $ kcols, kahead, negone, a( j+1, kstart ), lda,
252 $ a( kstart, j+1 ), lda, one, a( j+1, j+1 ), lda )
256 npived = iand( nstep, -nstep )
258 DO WHILE ( j .GT. 0 )
259 ntopiv = iand( j, -j )
260 CALL slaswp( ntopiv, a( 1, j-ntopiv+1 ), lda, j+1, nstep,
267 CALL slaswp( n-m, a( 1, m+kcols+1 ), lda, 1, m, ipiv, 1 )
268 CALL strsm(
'Left',
'Lower',
'No transpose',
'Unit', m,
269 $ n-m, one, a, lda, a( 1,m+kcols+1 ), lda )
subroutine xerbla(srname, info)
XERBLA
subroutine sgetrf(m, n, a, lda, ipiv, info)
SGETRF
subroutine slaswp(n, a, lda, k1, k2, ipiv, incx)
SLASWP performs a series of row interchanges on a general rectangular matrix.
subroutine sscal(n, sa, sx, incx)
SSCAL
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