112 RECURSIVE SUBROUTINE zgetrf2( M, N, A, LDA, IPIV, INFO )
119 INTEGER info, lda, m, n
123 COMPLEX*16 a( lda, * )
130 parameter( one = ( 1.0d+0, 0.0d+0 ),
131 $ zero = ( 0.0d+0, 0.0d+0 ) )
134 DOUBLE PRECISION sfmin
136 INTEGER i, iinfo, n1, n2
156 ELSE IF( n.LT.0 )
THEN
158 ELSE IF( lda.LT.
max( 1, m ) )
THEN
162 CALL xerbla(
'ZGETRF2', -info )
168 IF( m.EQ.0 .OR. n.EQ.0 )
177 IF ( a(1,1).EQ.zero )
180 ELSE IF( n.EQ.1 )
THEN
191 I = IZAMAX( M, A( 1, 1 ), 1 )
193.NE.
IF( A( I, 1 )ZERO ) THEN
199 A( 1, 1 ) = A( I, 1 )
205.GE.
IF( ABS(A( 1, 1 )) SFMIN ) THEN
206 CALL ZSCAL( M-1, ONE / A( 1, 1 ), A( 2, 1 ), 1 )
209 A( 1+I, 1 ) = A( 1+I, 1 ) / A( 1, 1 )
228 CALL ZGETRF2( M, N1, A, LDA, IPIV, IINFO )
230.EQ..AND..GT.
IF ( INFO0 IINFO0 )
237 CALL ZLASWP( N2, A( 1, N1+1 ), LDA, 1, N1, IPIV, 1 )
241 CALL ZTRSM( 'l
', 'l
', 'n
', 'u
', N1, N2, ONE, A, LDA,
242 $ A( 1, N1+1 ), LDA )
246 CALL ZGEMM( 'n
', 'n
', M-N1, N2, N1, -ONE, A( N1+1, 1 ), LDA,
247 $ A( 1, N1+1 ), LDA, ONE, A( N1+1, N1+1 ), LDA )
251 CALL ZGETRF2( M-N1, N2, A( N1+1, N1+1 ), LDA, IPIV( N1+1 ),
256.EQ..AND..GT.
IF ( INFO0 IINFO0 )
258 DO 20 I = N1+1, MIN( M, N )
259 IPIV( I ) = IPIV( I ) + N1
264 CALL ZLASWP( N1, A( 1, 1 ), LDA, N1+1, MIN( M, N), IPIV, 1 )
subroutine xerbla(srname, info)
XERBLA
integer function izamax(n, zx, incx)
IZAMAX
recursive subroutine zgetrf2(m, n, a, lda, ipiv, info)
ZGETRF2
subroutine zlaswp(n, a, lda, k1, k2, ipiv, incx)
ZLASWP performs a series of row interchanges on a general rectangular matrix.
subroutine zscal(n, za, zx, incx)
ZSCAL
subroutine zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
ZGEMM
subroutine ztrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
ZTRSM
double precision function dlamch(cmach)
DLAMCH