101 SUBROUTINE dgetrf ( M, N, A, LDA, IPIV, INFO)
108 INTEGER INFO, LDA, M, N
112 DOUBLE PRECISION A( LDA
119 parameter( one = 1.0d+0 )
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(
'DGETRF', -info )
153 IF( m.EQ.0 .OR. n.EQ.0 )
158 nb = ilaenv( 1,
'DGETRF',
' ', m, n, -1, -1 )
159 IF( nb.LE.1 .OR. nb.GE.
min( m, n ) )
THEN
163 CALL dgetf2( m, n, a, lda, ipiv, info )
169 DO 20 j = 1,
min( m, n ), nb
170 jb =
min(
min( m, n )-j+1, nb )
174 DO 30 k = 1, j-nb, nb
178 CALL dlaswp( jb, a(1, j), lda, k, k+nb-1, ipiv, 1 )
182 CALL dtrsm(
'Left',
'Lower',
'No transpose',
'Unit',
183 $ nb, jb, one, a( k, k ), lda,
188 CALL dgemm(
'No transpose',
'No transpose',
189 $ m-k-nb+1, jb, nb, -one,
190 $ a( k+nb, k ), lda, a( k, j ), lda, one,
191 $ a( k+nb, j ), lda )
197 CALL dgetf2( m-j+1, jb, a( j, j ), lda, ipiv( j ), iinfo )
201 IF( info.EQ.0 .AND. iinfo.GT.0 )
202 $ info = iinfo + j - 1
203 DO 10 i = j,
min( m, j+jb-1 )
204 ipiv( i ) = j - 1 + ipiv( i )
212 DO 40 k = 1,
min( m, n ), nb
213 CALL dlaswp( k-1, a( 1, 1 ), lda, k,
214 $
min(k+nb-1,
min( m, n )), ipiv, 1 )
221 CALL dlaswp( n-m, a(1, m+1), lda, 1, m, ipiv, 1 )
225 jb =
min( m-k+1, nb )
227 CALL dtrsm(
'Left',
'Lower',
'No transpose',
'Unit',
228 $ jb, n-m, one, a( k, k ), lda,
232 IF ( k+nb.LE.m )
THEN
233 CALL dgemm(
'No transpose',
'No transpose',
234 $ m-k-nb+1, n-m, nb, -one,
235 $ a( k+nb, k ), lda, a( k, m+1 ), lda, one,
236 $ a( k+nb, m+1 ), lda )
subroutine xerbla(srname, info)
XERBLA
subroutine dgetf2(m, n, a, lda, ipiv, info)
DGETF2 computes the LU factorization of a general m-by-n matrix using partial pivoting with row inter...
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 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