139 SUBROUTINE zpstf2( 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, PVT
172 DOUBLE PRECISION DLAMCH
173 LOGICAL LSAME, DISNAN
174 EXTERNAL dlamch, lsame, disnan
181 INTRINSIC dble, dconjg, max, sqrt
188 upper = lsame( uplo,
'U' )
189 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
191 ELSE IF( n.LT.0 )
THEN
193 ELSE IF( lda.LT.max( 1, n ) )
THEN
197 CALL xerbla(
'ZPSTF2', -info )
215 work( i ) = dble( a( i, i ) )
217 pvt = maxloc( work( 1:n ), 1 )
218 ajj = dble( a( pvt, pvt ) )
219 IF( ajj.LE.zero.OR.disnan( ajj ) )
THEN
227 IF( tol.LT.zero )
THEN
228 dstop = n * dlamch(
'Epsilon' ) * ajj
252 work( i ) = work( i ) +
253 $ dble( dconjg( a( j-1, i ) )*
256 work( n+i ) = dble( a( i, i ) ) - work( i )
261 itemp = maxloc( work( (n+j):(2*n) ), 1 )
264 IF( ajj.LE.dstop.OR.disnan( ajj ) )
THEN
274 a( pvt, pvt ) = a( j, j )
275 CALL zswap( j-1, a( 1, j ), 1, a( 1, pvt ), 1 )
277 $
CALL zswap( n-pvt, a( j, pvt+1 ), lda,
278 $ a( pvt, pvt+1 ), lda )
279 DO 140 i = j + 1, pvt - 1
280 ztemp = dconjg( a( j, i ) )
281 a( j, i ) = dconjg( a( i, pvt ) )
284 a( j, pvt ) = dconjg( a( j, pvt ) )
289 work( j ) = work( pvt )
292 piv( pvt ) = piv( j )
302 CALL zlacgv( j-1, a( 1, j ), 1 )
303 CALL zgemv(
'Trans', j-1, n-j, -cone, a( 1, j+1 ),
305 $ a( 1, j ), 1, cone, a( j, j+1 ), lda )
306 CALL zlacgv( j-1, a( 1, j ), 1 )
307 CALL zdscal( n-j, one / ajj, a( j, j+1 ), lda )
325 work( i ) = work( i ) +
326 $ dble( dconjg( a( i, j-1 ) )*
329 work( n+i ) = dble( a( i, i ) ) - work( i )
334 itemp = maxloc( work( (n+j):(2*n) ), 1 )
337 IF( ajj.LE.dstop.OR.disnan( ajj ) )
THEN
347 a( pvt, pvt ) = a( j, j )
348 CALL zswap( j-1, a( j, 1 ), lda, a( pvt, 1 ), lda )
350 $
CALL zswap( n-pvt, a( pvt+1, j ), 1, a( pvt+1,
353 DO 170 i = j + 1, pvt - 1
354 ztemp = dconjg( a( i, j ) )
355 a( i, j ) = dconjg( a( pvt, i ) )
358 a( pvt, j ) = dconjg( a( pvt, j ) )
363 work( j ) = work( pvt )
366 piv( pvt ) = piv( j )
376 CALL zlacgv( j-1, a( j, 1 ), lda )
377 CALL zgemv(
'No Trans', n-j, j-1, -cone, a( j+1, 1 ),
378 $ lda, a( j, 1 ), lda, cone, a( j+1, j ), 1 )
379 CALL zlacgv( j-1, a( j, 1 ), lda )
380 CALL zdscal( n-j, one / ajj, a( j+1, j ), 1 )