135 SUBROUTINE dgetrf( M, N, A, LDA, IPIV, INFO )
146 DOUBLE PRECISION A( LDA, * )
152 DOUBLE PRECISION ONE, ZERO, NEGONE
153 parameter( one = 1.0d+0, zero = 0.0d+0 )
154 parameter( negone = -1.0d+0 )
157 DOUBLE PRECISION SFMIN, TMP
158 INTEGER I, J, JP, NSTEP, NTOPIV, NPIVED, KAHEAD
159 INTEGER KSTART, IPIVSTART, JPIVSTART, KCOLS
162 DOUBLE PRECISION DLAMCH
165 EXTERNAL dlamch, idamax, disnan
180 ELSE IF( n.LT.0 )
THEN
182 ELSE IF( lda.LT.
max( 1, m ) )
THEN
186 CALL xerbla(
'DGETRF', -info )
192 IF( m.EQ.0 .OR. n.EQ.0 )
197 sfmin = dlamch(
'S' )
201 kahead = iand( j, -j )
202 kstart = j + 1 - kahead
203 kcols =
min( kahead, m-j )
207 jp = j - 1 + idamax( 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 dlaswp( ntopiv, a( 1, jpivstart ), lda, ipivstart, j,
224 ipivstart = ipivstart - ntopiv;
226 jpivstart = jpivstart - ntopiv;
230 CALL dlaswp( kcols, a( 1,j+1 ), lda, kstart, j, ipiv, 1 )
233 IF( a( j, j ).NE.zero .AND. .NOT.disnan( a( j, j ) ) )
THEN
234 IF( abs(a( j, j )) .GE. sfmin )
THEN
235 CALL dscal( 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 dtrsm(
'Left',
'Lower',
'No transpose',
'Unit', kahead,
247 $ kcols, one, a( kstart, kstart ), lda,
248 $ a( kstart, j+1 ), lda )
250 CALL dgemm(
'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 dlaswp( ntopiv, a( 1, j-ntopiv+1 ), lda, j+1, nstep,
267 CALL dlaswp( n-m, a( 1, m+kcols+1 ), lda, 1, m, ipiv, 1 )
268 CALL dtrsm(
'Left',
'Lower',
'No transpose',
'Unit', m,
269 $ n-m, one, a, lda, a( 1,m+kcols+1 ), lda )
subroutine xerbla(srname, info)
XERBLA
subroutine dgetrf(m, n, a, lda, ipiv, info)
DGETRF
subroutine dlaswp(n, a, lda, k1, k2, ipiv, incx)
DLASWP performs a series of row interchanges on a general rectangular matrix.
subroutine dscal(n, da, dx, incx)
DSCAL
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
DTRSM