138 SUBROUTINE spstrf( UPLO, N, A, LDA, PIV, RANK, TOL, WORK,
147 INTEGER INFO, LDA, N, RANK
151 REAL A( LDA, * ), WORK( 2*N )
159 parameter( one = 1.0e+0, zero = 0.0e+0 )
162 REAL AJJ, SSTOP, STEMP
163 INTEGER I, ITEMP, J, JB, K, NB, PVT
169 LOGICAL LSAME, SISNAN
170 EXTERNAL slamch, ilaenv, lsame, sisnan
177 INTRINSIC max, min, sqrt, maxloc
184 upper = lsame( uplo,
'U' )
185 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
187 ELSE IF( n.LT.0 )
THEN
189 ELSE IF( lda.LT.max( 1, n ) )
THEN
193 CALL xerbla(
'SPSTRF', -info )
204 nb = ilaenv( 1,
'SPOTRF', uplo, n, -1, -1, -1 )
205 IF( nb.LE.1 .OR. nb.GE.n )
THEN
209 CALL spstf2( uplo, n, a( 1, 1 ), lda, piv, rank, tol, work,
226 IF( a( i, i ).GT.ajj )
THEN
231 IF( ajj.LE.zero.OR.sisnan( ajj ) )
THEN
239 IF( tol.LT.zero )
THEN
240 sstop = real( n ) * slamch(
'Epsilon' ) * ajj
254 jb = min( nb, n-k+1 )
263 DO 130 j = k, k + jb - 1
272 work( i ) = work( i ) + a( j-1, i )**2
274 work( n+i ) = a( i, i ) - work( i )
279 itemp = maxloc( work( (n+j):(2*n) ), 1 )
282 IF( ajj.LE.sstop.OR.sisnan( ajj ) )
THEN
292 a( pvt, pvt ) = a( j, j )
293 CALL sswap( j-1, a( 1, j ), 1, a( 1, pvt ), 1 )
295 $
CALL sswap( n-pvt, a( j, pvt+1 ), lda,
296 $ a( pvt, pvt+1 ), lda )
297 CALL sswap( pvt-j-1, a( j, j+1 ), lda,
303 work( j ) = work( pvt )
306 piv( pvt ) = piv( j )
316 CALL sgemv(
'Trans', j-k, n-j, -one, a( k,
318 $ lda, a( k, j ), 1, one, a( j, j+1 ),
320 CALL sscal( n-j, one / ajj, a( j, j+1 ), lda )
328 CALL ssyrk(
'Upper',
'Trans', n-j+1, jb, -one,
329 $ a( k, j ), lda, one, a( j, j ), lda )
342 jb = min( nb, n-k+1 )
351 DO 170 j = k, k + jb - 1
360 work( i ) = work( i ) + a( i, j-1 )**2
362 work( n+i ) = a( i, i ) - work( i )
367 itemp = maxloc( work( (n+j):(2*n) ), 1 )
370 IF( ajj.LE.sstop.OR.sisnan( ajj ) )
THEN
380 a( pvt, pvt ) = a( j, j )
381 CALL sswap( j-1, a( j, 1 ), lda, a( pvt, 1 ),
384 $
CALL sswap( n-pvt, a( pvt+1, j ), 1,
385 $ a( pvt+1, pvt ), 1 )
386 CALL sswap( pvt-j-1, a( j+1, j ), 1, a( pvt,
393 work( j ) = work( pvt )
396 piv( pvt ) = piv( j )
406 CALL sgemv(
'No Trans', n-j, j-k, -one,
407 $ a( j+1, k ), lda, a( j, k ), lda, one,
409 CALL sscal( n-j, one / ajj, a( j+1, j ), 1 )
417 CALL ssyrk(
'Lower',
'No Trans', n-j+1, jb, -one,
418 $ a( j, k ), lda, one, a( j, j ), lda )