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 )