139 SUBROUTINE zpstrf( UPLO, N, A, LDA, PIV, RANK, TOL, WORK,
148 INTEGER INFO, LDA, N, RANK
152 COMPLEX*16 A( LDA, * )
153 DOUBLE PRECISION WORK( 2*N )
160 DOUBLE PRECISION ONE, ZERO
161 parameter( one = 1.0d+0, zero = 0.0d+0 )
163 parameter( cone = ( 1.0d+0, 0.0d+0 ) )
167 DOUBLE PRECISION AJJ, DSTOP, DTEMP
168 INTEGER I, ITEMP, J, JB, K, NB, PVT
172 DOUBLE PRECISION DLAMCH
174 LOGICAL LSAME, DISNAN
175 EXTERNAL dlamch, ilaenv, lsame, disnan
183 INTRINSIC dble, dconjg, max, min, sqrt, maxloc
190 upper = lsame( uplo,
'U' )
191 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
193 ELSE IF( n.LT.0 )
THEN
195 ELSE IF( lda.LT.max( 1, n ) )
THEN
199 CALL xerbla(
'ZPSTRF', -info )
210 nb = ilaenv( 1,
'ZPOTRF', uplo, n, -1, -1, -1 )
211 IF( nb.LE.1 .OR. nb.GE.n )
THEN
215 CALL zpstf2( uplo, n, a( 1, 1 ), lda, piv, rank, tol, work,
230 work( i ) = dble( a( i, i ) )
232 pvt = maxloc( work( 1:n ), 1 )
233 ajj = dble( a( pvt, pvt ) )
234 IF( ajj.LE.zero.OR.disnan( ajj ) )
THEN
242 IF( tol.LT.zero )
THEN
243 dstop = n * dlamch(
'Epsilon' ) * ajj
257 jb = min( nb, n-k+1 )
266 DO 150 j = k, k + jb - 1
275 work( i ) = work( i ) +
276 $ dble( dconjg( a( j-1, i ) )*
279 work( n+i ) = dble( a( i, i ) ) - work( i )
284 itemp = maxloc( work( (n+j):(2*n) ), 1 )
287 IF( ajj.LE.dstop.OR.disnan( ajj ) )
THEN
297 a( pvt, pvt ) = a( j, j )
298 CALL zswap( j-1, a( 1, j ), 1, a( 1, pvt ), 1 )
300 $
CALL zswap( n-pvt, a( j, pvt+1 ), lda,
301 $ a( pvt, pvt+1 ), lda )
302 DO 140 i = j + 1, pvt - 1
303 ztemp = dconjg( a( j, i ) )
304 a( j, i ) = dconjg( a( i, pvt ) )
307 a( j, pvt ) = dconjg( a( j, pvt ) )
312 work( j ) = work( pvt )
315 piv( pvt ) = piv( j )
325 CALL zlacgv( j-1, a( 1, j ), 1 )
326 CALL zgemv(
'Trans', j-k, n-j, -cone, a( k,
328 $ lda, a( k, j ), 1, cone, a( j, j+1 ),
330 CALL zlacgv( j-1, a( 1, j ), 1 )
331 CALL zdscal( n-j, one / ajj, a( j, j+1 ), lda )
339 CALL zherk(
'Upper',
'Conj Trans', n-j+1, jb, -one,
340 $ a( k, j ), lda, one, a( j, j ), lda )
353 jb = min( nb, n-k+1 )
362 DO 200 j = k, k + jb - 1
371 work( i ) = work( i ) +
372 $ dble( dconjg( a( i, j-1 ) )*
375 work( n+i ) = dble( a( i, i ) ) - work( i )
380 itemp = maxloc( work( (n+j):(2*n) ), 1 )
383 IF( ajj.LE.dstop.OR.disnan( ajj ) )
THEN
393 a( pvt, pvt ) = a( j, j )
394 CALL zswap( j-1, a( j, 1 ), lda, a( pvt, 1 ),
397 $
CALL zswap( n-pvt, a( pvt+1, j ), 1,
398 $ a( pvt+1, pvt ), 1 )
399 DO 190 i = j + 1, pvt - 1
400 ztemp = dconjg( a( i, j ) )
401 a( i, j ) = dconjg( a( pvt, i ) )
404 a( pvt, j ) = dconjg( a( pvt, j ) )
410 work( j ) = work( pvt )
413 piv( pvt ) = piv( j )
423 CALL zlacgv( j-1, a( j, 1 ), lda )
424 CALL zgemv(
'No Trans', n-j, j-k, -cone,
425 $ a( j+1, k ), lda, a( j, k ), lda, cone,
427 CALL zlacgv( j-1, a( j, 1 ), lda )
428 CALL zdscal( n-j, one / ajj, a( j+1, j ), 1 )
436 CALL zherk(
'Lower',
'No Trans', n-j+1, jb, -one,
437 $ a( j, k ), lda, one, a( j, j ), lda )