114 RECURSIVE SUBROUTINE sgetrf2( M, N, A, LDA, IPIV, INFO )
122 INTEGER info, lda, m, n
133 parameter( one = 1.0e+0, zero = 0.0e+0 )
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(
'SGETRF2', -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 =
isamax( 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 sscal( m-1, one / a( 1, 1 ), a( 2, 1 ), 1 )
210 a( 1+i, 1 ) = a( 1+i, 1 ) / a( 1, 1 )
229 CALL sgetrf2( m, n1, a, lda, ipiv, iinfo )
231 IF ( info.EQ.0 .AND. iinfo.GT.0 )
238 CALL slaswp( n2, a( 1, n1+1 ), lda, 1, n1, ipiv, 1 )
242 CALL strsm(
'L',
'L',
'N',
'U', n1, n2, one, a, lda,
243 $ a( 1, n1+1 ), lda )
247 CALL sgemm(
'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 sgetrf2( 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 slaswp( n1, a( 1, 1 ), lda, n1+1, min( m, n), ipiv, 1 )