135 SUBROUTINE cgetrf( M, N, A, LDA, IPIV, INFO )
142 INTEGER INFO, LDA, M, N
154 parameter( one = (1.0e+0, 0.0e+0) )
155 parameter( negone = (-1.0e+0, 0.0e+0) )
156 parameter( zero = 0.0e+0 )
161 INTEGER I, J, JP, NSTEP, NTOPIV, NPIVED, KAHEAD
162 INTEGER KSTART, IPIVSTART, JPIVSTART, KCOLS
168 EXTERNAL slamch, icamax, sisnan
174 INTRINSIC max,
min, iand, abs
183 ELSE IF( n.LT.0 )
THEN
185 ELSE IF( lda.LT.
max( 1, m ) )
THEN
189 CALL xerbla(
'CGETRF', -info )
195 IF( m.EQ.0 .OR. n.EQ.0 )
200 sfmin = slamch(
'S' )
204 kahead = iand( j, -j )
205 kstart = j + 1 - kahead
206 kcols =
min( kahead, m-j )
210 jp = j - 1 + icamax( 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 claswp( ntopiv, a( 1, jpivstart ), lda, ipivstart, j,
227 ipivstart = ipivstart - ntopiv;
229 jpivstart = jpivstart - ntopiv;
233 CALL claswp( kcols, a( 1,j+1 ), lda, kstart, j, ipiv, 1 )
236 pivmag = abs( a( j, j ) )
237 IF( pivmag.NE.zero .AND. .NOT.sisnan( pivmag ) )
THEN
238 IF( pivmag .GE. sfmin )
THEN
239 CALL cscal( 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 ctrsm(
'Left',
'Lower',
'No transpose',
'Unit', kahead,
251 $ kcols, one, a( kstart, kstart ), lda,
252 $ a( kstart, j+1 ), lda )
254 CALL cgemm(
'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 claswp( ntopiv, a( 1, j-ntopiv+1 ), lda, j+1, nstep,
271 CALL claswp( n-m, a( 1, m+kcols+1 ), lda, 1, m, ipiv, 1 )
272 CALL ctrsm(
'Left',
'Lower',
'No transpose',
'Unit', m,
273 $ n-m, one, a, lda, a( 1,m+kcols+1 ), lda )
subroutine xerbla(srname, info)
XERBLA
subroutine cgetrf(m, n, a, lda, ipiv, info)
CGETRF
subroutine claswp(n, a, lda, k1, k2, ipiv, incx)
CLASWP performs a series of row interchanges on a general rectangular matrix.
subroutine cscal(n, ca, cx, incx)
CSCAL
subroutine ctrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
CTRSM
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM