114 RECURSIVE SUBROUTINE dgetrf2( M, N, A, LDA, IPIV, INFO )
122 INTEGER info, lda, m, n
126 DOUBLE PRECISION a( lda, * )
132 DOUBLE PRECISION one, zero
133 parameter( one = 1.0d+0, zero = 0.0d+0 )
136 DOUBLE PRECISION sfmin, temp
137 INTEGER i, iinfo, n1, n2
157 ELSE IF( n.LT.0 )
THEN
159 ELSE IF( lda.LT.max( 1, m ) )
THEN
163 CALL xerbla(
'DGETRF2', -info )
169 IF( m.EQ.0 .OR. n.EQ.0 )
178 IF ( a(1,1).EQ.zero )
181 ELSE IF( n.EQ.1 )
THEN
192 i =
idamax( m, a( 1, 1 ), 1 )
194 IF( a( i, 1 ).NE.zero )
THEN
200 a( 1, 1 ) = a( i, 1 )
206 IF( abs(a( 1, 1 )) .GE. sfmin )
THEN
207 CALL dscal( m-1, one / a( 1, 1 ), a( 2, 1 ), 1 )
210 a( 1+i, 1 ) = a( 1+i, 1 ) / a( 1, 1 )
229 CALL dgetrf2( m, n1, a, lda, ipiv, iinfo )
231 IF ( info.EQ.0 .AND. iinfo.GT.0 )
238 CALL dlaswp( n2, a( 1, n1+1 ), lda, 1, n1, ipiv, 1 )
242 CALL dtrsm(
'L',
'L',
'N',
'U', n1, n2, one, a, lda,
243 $ a( 1, n1+1 ), lda )
247 CALL dgemm(
'N',
'N', m-n1, n2, n1, -one, a( n1+1, 1 ), lda,
248 $ a( 1, n1+1 ), lda, one, a( n1+1, n1+1 ), lda )
252 CALL dgetrf2( m-n1, n2, a( n1+1, n1+1 ), lda, ipiv( n1+1 ),
257 IF ( info.EQ.0 .AND. iinfo.GT.0 )
259 DO 20 i = n1+1, min( m, n )
260 ipiv( i ) = ipiv( i ) + n1
265 CALL dlaswp( n1, a( 1, 1 ), lda, n1+1, min( m, n), ipiv, 1 )