155 SUBROUTINE zsptrf( UPLO, N, AP, IPIV, INFO )
173 DOUBLE PRECISION ZERO, ONE
174 parameter( zero = 0.0d+0, one = 1.0d+0 )
175 DOUBLE PRECISION EIGHT, SEVTEN
176 parameter( eight = 8.0d+0, sevten = 17.0d+0 )
178 parameter( cone = ( 1.0d+0, 0.0d+0 ) )
182 INTEGER I, IMAX, J, JMAX, K, KC, KK, KNC, KP, KPC,
184 DOUBLE PRECISION ABSAKK, ALPHA, COLMAX, ROWMAX
185 COMPLEX*16 D11, D12, D21, D22, R1, T, WK, WKM1, WKP1, ZDUM
190 EXTERNAL lsame, izamax
196 INTRINSIC abs, dble, dimag, max, sqrt
199 DOUBLE PRECISION CABS1
202 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
209 upper = lsame( uplo,
'U' )
210 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
212 ELSE IF( n.LT.0 )
THEN
216 CALL xerbla(
'ZSPTRF', -info )
222 alpha = ( one+sqrt( sevten ) ) / eight
232 kc = ( n-1 )*n / 2 + 1
245 absakk = cabs1( ap( kc+k-1 ) )
251 imax = izamax( k-1, ap( kc ), 1 )
252 colmax = cabs1( ap( kc+imax-1 ) )
257 IF( max( absakk, colmax ).EQ.zero )
THEN
265 IF( absakk.GE.alpha*colmax )
THEN
274 kx = imax*( imax+1 ) / 2 + imax
275 DO 20 j = imax + 1, k
276 IF( cabs1( ap( kx ) ).GT.rowmax )
THEN
277 rowmax = cabs1( ap( kx ) )
282 kpc = ( imax-1 )*imax / 2 + 1
284 jmax = izamax( imax-1, ap( kpc ), 1 )
285 rowmax = max( rowmax, cabs1( ap( kpc+jmax-1 ) ) )
288 IF( absakk.GE.alpha*colmax*( colmax / rowmax ) )
THEN
293 ELSE IF( cabs1( ap( kpc+imax-1 ) ).GE.alpha*rowmax )
THEN
317 CALL zswap( kp-1, ap( knc ), 1, ap( kpc ), 1 )
319 DO 30 j = kp + 1, kk - 1
322 ap( knc+j-1 ) = ap( kx )
326 ap( knc+kk-1 ) = ap( kpc+kp-1 )
328 IF( kstep.EQ.2 )
THEN
330 ap( kc+k-2 ) = ap( kc+kp-1 )
337 IF( kstep.EQ.1 )
THEN
349 r1 = cone / ap( kc+k-1 )
350 CALL zspr( uplo, k-1, -r1, ap( kc ), 1, ap )
354 CALL zscal( k-1, r1, ap( kc ), 1 )
371 d12 = ap( k-1+( k-1 )*k / 2 )
372 d22 = ap( k-1+( k-2 )*( k-1 ) / 2 ) / d12
373 d11 = ap( k+( k-1 )*k / 2 ) / d12
374 t = cone / ( d11*d22-cone )
377 DO 50 j = k - 2, 1, -1
378 wkm1 = d12*( d11*ap( j+( k-2 )*( k-1 ) / 2 )-
379 $ ap( j+( k-1 )*k / 2 ) )
380 wk = d12*( d22*ap( j+( k-1 )*k / 2 )-
381 $ ap( j+( k-2 )*( k-1 ) / 2 ) )
383 ap( i+( j-1 )*j / 2 ) = ap( i+( j-1 )*j / 2 ) -
384 $ ap( i+( k-1 )*k / 2 )*wk -
385 $ ap( i+( k-2 )*( k-1 ) / 2 )*wkm1
387 ap( j+( k-1 )*k / 2 ) = wk
388 ap( j+( k-2 )*( k-1 ) / 2 ) = wkm1
397 IF( kstep.EQ.1 )
THEN
432 absakk = cabs1( ap( kc ) )
438 imax = k + izamax( n-k, ap( kc+1 ), 1 )
439 colmax = cabs1( ap( kc+imax-k ) )
444 IF( max( absakk, colmax ).EQ.zero )
THEN
452 IF( absakk.GE.alpha*colmax )
THEN
464 DO 70 j = k, imax - 1
465 IF( cabs1( ap( kx ) ).GT.rowmax )
THEN
466 rowmax = cabs1( ap( kx ) )
471 kpc = npp - ( n-imax+1 )*( n-imax+2 ) / 2 + 1
473 jmax = imax + izamax( n-imax, ap( kpc+1 ), 1 )
474 rowmax = max( rowmax, cabs1( ap( kpc+jmax-imax ) ) )
477 IF( absakk.GE.alpha*colmax*( colmax / rowmax ) )
THEN
482 ELSE IF( cabs1( ap( kpc ) ).GE.alpha*rowmax )
THEN
500 $ knc = knc + n - k + 1
507 $
CALL zswap( n-kp, ap( knc+kp-kk+1 ), 1,
511 DO 80 j = kk + 1, kp - 1
514 ap( knc+j-kk ) = ap( kx )
518 ap( knc ) = ap( kpc )
520 IF( kstep.EQ.2 )
THEN
522 ap( kc+1 ) = ap( kc+kp-k )
529 IF( kstep.EQ.1 )
THEN
544 CALL zspr( uplo, n-k, -r1, ap( kc+1 ), 1,
549 CALL zscal( n-k, r1, ap( kc+1 ), 1 )
570 d21 = ap( k+1+( k-1 )*( 2*n-k ) / 2 )
571 d11 = ap( k+1+k*( 2*n-k-1 ) / 2 ) / d21
572 d22 = ap( k+( k-1 )*( 2*n-k ) / 2 ) / d21
573 t = cone / ( d11*d22-cone )
577 wk = d21*( d11*ap( j+( k-1 )*( 2*n-k ) / 2 )-
578 $ ap( j+k*( 2*n-k-1 ) / 2 ) )
579 wkp1 = d21*( d22*ap( j+k*( 2*n-k-1 ) / 2 )-
580 $ ap( j+( k-1 )*( 2*n-k ) / 2 ) )
582 ap( i+( j-1 )*( 2*n-j ) / 2 ) = ap( i+( j-1 )*
583 $ ( 2*n-j ) / 2 ) - ap( i+( k-1 )*( 2*n-k ) /
584 $ 2 )*wk - ap( i+k*( 2*n-k-1 ) / 2 )*wkp1
586 ap( j+( k-1 )*( 2*n-k ) / 2 ) = wk
587 ap( j+k*( 2*n-k-1 ) / 2 ) = wkp1
595 IF( kstep.EQ.1 )
THEN