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
140 DOUBLE PRECISION DLAMCH
142 EXTERNAL dlamch, idamax
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 )
subroutine dtrsm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
DTRSM
subroutine dgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
DGEMM
subroutine xerbla(SRNAME, INFO)
XERBLA
recursive subroutine dgetrf2(M, N, A, LDA, IPIV, INFO)
DGETRF2
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