154 SUBROUTINE ssptrf( UPLO, N, AP, IPIV, INFO )
173 parameter( zero = 0.0e+0, one = 1.0e+0 )
175 parameter( eight = 8.0e+0, sevten = 17.0e+0 )
179 INTEGER I, IMAX, J, JMAX, K, KC, KK, KNC, KP, KPC,
181 REAL ABSAKK, ALPHA, COLMAX, D11, D12, D21, D22, R1,
182 $ ROWMAX, T, WK, WKM1, WKP1
187 EXTERNAL lsame, isamax
193 INTRINSIC abs, max, sqrt
200 upper = lsame( uplo,
'U' )
201 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
203 ELSE IF( n.LT.0 )
THEN
207 CALL xerbla(
'SSPTRF', -info )
213 alpha = ( one+sqrt( sevten ) ) / eight
223 kc = ( n-1 )*n / 2 + 1
236 absakk = abs( ap( kc+k-1 ) )
242 imax = isamax( k-1, ap( kc ), 1 )
243 colmax = abs( ap( kc+imax-1 ) )
248 IF( max( absakk, colmax ).EQ.zero )
THEN
256 IF( absakk.GE.alpha*colmax )
THEN
265 kx = imax*( imax+1 ) / 2 + imax
266 DO 20 j = imax + 1, k
267 IF( abs( ap( kx ) ).GT.rowmax )
THEN
268 rowmax = abs( ap( kx ) )
273 kpc = ( imax-1 )*imax / 2 + 1
275 jmax = isamax( imax-1, ap( kpc ), 1 )
276 rowmax = max( rowmax, abs( ap( kpc+jmax-1 ) ) )
279 IF( absakk.GE.alpha*colmax*( colmax / rowmax ) )
THEN
284 ELSE IF( abs( ap( kpc+imax-1 ) ).GE.alpha*rowmax )
THEN
308 CALL sswap( kp-1, ap( knc ), 1, ap( kpc ), 1 )
310 DO 30 j = kp + 1, kk - 1
313 ap( knc+j-1 ) = ap( kx )
317 ap( knc+kk-1 ) = ap( kpc+kp-1 )
319 IF( kstep.EQ.2 )
THEN
321 ap( kc+k-2 ) = ap( kc+kp-1 )
328 IF( kstep.EQ.1 )
THEN
340 r1 = one / ap( kc+k-1 )
341 CALL sspr( uplo, k-1, -r1, ap( kc ), 1, ap )
345 CALL sscal( k-1, r1, ap( kc ), 1 )
362 d12 = ap( k-1+( k-1 )*k / 2 )
363 d22 = ap( k-1+( k-2 )*( k-1 ) / 2 ) / d12
364 d11 = ap( k+( k-1 )*k / 2 ) / d12
365 t = one / ( d11*d22-one )
368 DO 50 j = k - 2, 1, -1
369 wkm1 = d12*( d11*ap( j+( k-2 )*( k-1 ) / 2 )-
370 $ ap( j+( k-1 )*k / 2 ) )
371 wk = d12*( d22*ap( j+( k-1 )*k / 2 )-
372 $ ap( j+( k-2 )*( k-1 ) / 2 ) )
374 ap( i+( j-1 )*j / 2 ) = ap( i+( j-1 )*j / 2 ) -
375 $ ap( i+( k-1 )*k / 2 )*wk -
376 $ ap( i+( k-2 )*( k-1 ) / 2 )*wkm1
378 ap( j+( k-1 )*k / 2 ) = wk
379 ap( j+( k-2 )*( k-1 ) / 2 ) = wkm1
389 IF( kstep.EQ.1 )
THEN
424 absakk = abs( ap( kc ) )
430 imax = k + isamax( n-k, ap( kc+1 ), 1 )
431 colmax = abs( ap( kc+imax-k ) )
436 IF( max( absakk, colmax ).EQ.zero )
THEN
444 IF( absakk.GE.alpha*colmax )
THEN
456 DO 70 j = k, imax - 1
457 IF( abs( ap( kx ) ).GT.rowmax )
THEN
458 rowmax = abs( ap( kx ) )
463 kpc = npp - ( n-imax+1 )*( n-imax+2 ) / 2 + 1
465 jmax = imax + isamax( n-imax, ap( kpc+1 ), 1 )
466 rowmax = max( rowmax, abs( ap( kpc+jmax-imax ) ) )
469 IF( absakk.GE.alpha*colmax*( colmax / rowmax ) )
THEN
474 ELSE IF( abs( ap( kpc ) ).GE.alpha*rowmax )
THEN
492 $ knc = knc + n - k + 1
499 $
CALL sswap( n-kp, ap( knc+kp-kk+1 ), 1,
503 DO 80 j = kk + 1, kp - 1
506 ap( knc+j-kk ) = ap( kx )
510 ap( knc ) = ap( kpc )
512 IF( kstep.EQ.2 )
THEN
514 ap( kc+1 ) = ap( kc+kp-k )
521 IF( kstep.EQ.1 )
THEN
536 CALL sspr( uplo, n-k, -r1, ap( kc+1 ), 1,
541 CALL sscal( n-k, r1, ap( kc+1 ), 1 )
562 d21 = ap( k+1+( k-1 )*( 2*n-k ) / 2 )
563 d11 = ap( k+1+k*( 2*n-k-1 ) / 2 ) / d21
564 d22 = ap( k+( k-1 )*( 2*n-k ) / 2 ) / d21
565 t = one / ( d11*d22-one )
569 wk = d21*( d11*ap( j+( k-1 )*( 2*n-k ) / 2 )-
570 $ ap( j+k*( 2*n-k-1 ) / 2 ) )
571 wkp1 = d21*( d22*ap( j+k*( 2*n-k-1 ) / 2 )-
572 $ ap( j+( k-1 )*( 2*n-k ) / 2 ) )
575 ap( i+( j-1 )*( 2*n-j ) / 2 ) = ap( i+( j-1 )*
576 $ ( 2*n-j ) / 2 ) - ap( i+( k-1 )*( 2*n-k ) /
577 $ 2 )*wk - ap( i+k*( 2*n-k-1 ) / 2 )*wkp1
580 ap( j+( k-1 )*( 2*n-k ) / 2 ) = wk
581 ap( j+k*( 2*n-k-1 ) / 2 ) = wkp1
590 IF( kstep.EQ.1 )
THEN