135 SUBROUTINE zgetrf( M, N, A, LDA, IPIV, INFO )
142 INTEGER INFO, LDA, M, N
146 COMPLEX*16 A( LDA, * )
152 COMPLEX*16 ONE, NEGONE
153 DOUBLE PRECISION ZERO
154 parameter( one = (1.0d
155 parameter( negone = (-1.0d
159 DOUBLE PRECISION SFMIN, PIVMAG
161 INTEGER I, , JP, NSTEP, NTOPIV, NPIVED, KAHEAD
162 INTEGER KSTART, IPIVSTART, JPIVSTART, KCOLS
165 DOUBLE PRECISION DLAMCH
168 EXTERNAL dlamch, izamax, disnan
174 INTRINSIC max,
min, iand, abs
185 ELSE IF( lda.LT.
max( 1, m ) )
THEN
189 CALL xerbla(
'ZGETRF', -info )
195 IF( m.EQ.0 .OR. n.EQ.0 )
200 sfmin = dlamch(
'S' )
204 kahead = iand( j, -j )
205 kstart = j + 1 - kahead
206 kcols =
min( kahead, m-j )
210 jp = j - 1 + izamax( m-j+1, a( j, j ), 1 )
216 a( j, j ) = a( jp, j )
223 jpivstart = j - ntopiv
224 DO WHILE ( ntopiv .LT. kahead )
225 CALL zlaswp( ntopiv, a( 1, jpivstart ), lda, ipivstart, j,
227 ipivstart = ipivstart - ntopiv;
229 jpivstart = jpivstart - ntopiv;
233 CALL zlaswp( kcols, a( 1,j+1 ), lda, kstart, j, ipiv, 1 )
236 pivmag = abs( a( j, j ) )
237 IF( pivmag.NE.zero .AND. .NOT.disnan( pivmag ) )
THEN
238 IF( pivmag .GE. sfmin )
THEN
239 CALL zscal( m-j, one / a( j, j ), a( j+1, j ), 1 )
242 a( j+i, j ) = a( j+i, j ) / a( j, j )
245 ELSE IF( pivmag .EQ. zero .AND. info .EQ. 0 )
THEN
250 CALL ztrsm(
'Left',
'Lower',
'No transpose',
'Unit', kahead,
251 $ kcols, one, a( kstart, kstart ), lda,
252 $ a( kstart, j+1 ), lda )
254 CALL zgemm(
'No transpose',
'No transpose', m-j,
255 $ kcols, kahead, negone, a( j+1, kstart ), lda,
256 $ a( kstart, j+1 ), lda, one, a( j+1, j+1 ), lda )
260 npived = iand( nstep, -nstep )
262 DO WHILE ( j .GT. 0 )
263 ntopiv = iand( j, -j )
264 CALL zlaswp( ntopiv, a( 1, j-ntopiv+1 ), lda, j+1, nstep,
271 CALL zlaswp( n-m, a( 1, m+kcols+1 ), lda, 1, m, ipiv, 1 )
272 CALL ztrsm(
'Left',
'Lower',
'No transpose',
'Unit', m,
273 $ n-m, one, a, lda, a( 1,m+kcols+1 ), lda )
subroutine xerbla(srname, info)
XERBLA
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
subroutine zgetrf(m, n, a, lda, ipiv, info)
ZGETRF VARIANT: Crout Level 3 BLAS version of the algorithm.