191 SUBROUTINE dsytf2( UPLO, N, A, LDA, IPIV, INFO )
203 DOUBLE PRECISION A( LDA, * )
209 DOUBLE PRECISION ZERO, ONE
210 parameter( zero = 0.0d+0, one = 1.0d+0 )
211 DOUBLE PRECISION EIGHT, SEVTEN
212 parameter( eight = 8.0d+0, sevten = 17.0d+0 )
216 INTEGER I, IMAX, J, JMAX, K, KK, KP, KSTEP
217 DOUBLE PRECISION ABSAKK, ALPHA, COLMAX, D11, D12, D21, D22, R1,
218 $ ROWMAX, T, WK, WKM1, WKP1
221 LOGICAL LSAME, DISNAN
223 EXTERNAL lsame, idamax, disnan
229 INTRINSIC abs, max, sqrt
236 upper = lsame( uplo,
'U' )
237 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
239 ELSE IF( n.LT.0 )
THEN
241 ELSE IF( lda.LT.max( 1, n ) )
THEN
245 CALL xerbla(
'DSYTF2', -info )
251 alpha = ( one+sqrt( sevten ) ) / eight
272 absakk = abs( a( k, k ) )
279 imax = idamax( k-1, a( 1, k ), 1 )
280 colmax = abs( a( imax, k ) )
285 IF( (max( absakk, colmax ).EQ.zero) .OR.
286 $ disnan(absakk) )
THEN
295 IF( absakk.GE.alpha*colmax )
THEN
305 jmax = imax + idamax( k-imax, a( imax, imax+1 ), lda )
306 rowmax = abs( a( imax, jmax ) )
308 jmax = idamax( imax-1, a( 1, imax ), 1 )
309 rowmax = max( rowmax, abs( a( jmax, imax ) ) )
312 IF( absakk.GE.alpha*colmax*( colmax / rowmax ) )
THEN
317 ELSE IF( abs( a( imax, imax ) ).GE.alpha*rowmax )
THEN
339 CALL dswap( kp-1, a( 1, kk ), 1, a( 1, kp ), 1 )
340 CALL dswap( kk-kp-1, a( kp+1, kk ), 1, a( kp, kp+1 ),
343 a( kk, kk ) = a( kp, kp )
345 IF( kstep.EQ.2 )
THEN
347 a( k-1, k ) = a( kp, k )
354 IF( kstep.EQ.1 )
THEN
367 CALL dsyr( uplo, k-1, -r1, a( 1, k ), 1, a, lda )
371 CALL dscal( k-1, r1, a( 1, k ), 1 )
389 d22 = a( k-1, k-1 ) / d12
390 d11 = a( k, k ) / d12
391 t = one / ( d11*d22-one )
394 DO 30 j = k - 2, 1, -1
395 wkm1 = d12*( d11*a( j, k-1 )-a( j, k ) )
396 wk = d12*( d22*a( j, k )-a( j, k-1 ) )
398 a( i, j ) = a( i, j ) - a( i, k )*wk -
412 IF( kstep.EQ.1 )
THEN
443 absakk = abs( a( k, k ) )
450 imax = k + idamax( n-k, a( k+1, k ), 1 )
451 colmax = abs( a( imax, k ) )
456 IF( (max( absakk, colmax ).EQ.zero) .OR.
457 $ disnan(absakk) )
THEN
466 IF( absakk.GE.alpha*colmax )
THEN
476 jmax = k - 1 + idamax( imax-k, a( imax, k ), lda )
477 rowmax = abs( a( imax, jmax ) )
479 jmax = imax + idamax( n-imax, a( imax+1, imax ),
481 rowmax = max( rowmax, abs( a( jmax, imax ) ) )
484 IF( absakk.GE.alpha*colmax*( colmax / rowmax ) )
THEN
489 ELSE IF( abs( a( imax, imax ) ).GE.alpha*rowmax )
THEN
512 $
CALL dswap( n-kp, a( kp+1, kk ), 1, a( kp+1, kp ),
514 CALL dswap( kp-kk-1, a( kk+1, kk ), 1, a( kp, kk+1 ),
517 a( kk, kk ) = a( kp, kp )
519 IF( kstep.EQ.2 )
THEN
521 a( k+1, k ) = a( kp, k )
528 IF( kstep.EQ.1 )
THEN
542 d11 = one / a( k, k )
543 CALL dsyr( uplo, n-k, -d11, a( k+1, k ), 1,
544 $ a( k+1, k+1 ), lda )
548 CALL dscal( n-k, d11, a( k+1, k ), 1 )
564 d11 = a( k+1, k+1 ) / d21
565 d22 = a( k, k ) / d21
566 t = one / ( d11*d22-one )
571 wk = d21*( d11*a( j, k )-a( j, k+1 ) )
572 wkp1 = d21*( d22*a( j, k+1 )-a( j, k ) )
575 a( i, j ) = a( i, j ) - a( i, k )*wk -
589 IF( kstep.EQ.1 )
THEN