158 SUBROUTINE chptrf( UPLO, N, AP, IPIV, INFO )
177 parameter( zero = 0.0e+0, one = 1.0e+0 )
179 parameter( eight = 8.0e+0, sevten = 17.0e+0 )
183 INTEGER I, IMAX, J, JMAX, K, KC, KK, KNC, KP, KPC,
185 REAL ABSAKK, ALPHA, COLMAX, D, D11, D22, R1, ROWMAX,
187 COMPLEX D12, D21, T, WK, WKM1, WKP1, ZDUM
193 EXTERNAL lsame, icamax, slapy2
199 INTRINSIC abs, aimag, cmplx, conjg, max,
REAL, SQRT
205 cabs1( zdum ) = abs(
REAL( ZDUM ) ) + abs( AIMAG( zdum ) )
212 upper = lsame( uplo,
'U' )
213 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN 215 ELSE IF( n.LT.0 )
THEN 219 CALL xerbla(
'CHPTRF', -info )
225 alpha = ( one+sqrt( sevten ) ) / eight
235 kc = ( n-1 )*n / 2 + 1
248 absakk = abs(
REAL( AP( KC+K-1 ) ) )
254 imax = icamax( k-1, ap( kc ), 1 )
255 colmax = cabs1( ap( kc+imax-1 ) )
260 IF( max( absakk, colmax ).EQ.zero )
THEN 267 ap( kc+k-1 ) =
REAL( AP( KC+K-1 ) )
269 IF( absakk.GE.alpha*colmax )
THEN 281 kx = imax*( imax+1 ) / 2 + imax
282 DO 20 j = imax + 1, k
283 IF( cabs1( ap( kx ) ).GT.rowmax )
THEN 284 rowmax = cabs1( ap( kx ) )
289 kpc = ( imax-1 )*imax / 2 + 1
291 jmax = icamax( imax-1, ap( kpc ), 1 )
292 rowmax = max( rowmax, cabs1( ap( kpc+jmax-1 ) ) )
295 IF( absakk.GE.alpha*colmax*( colmax / rowmax ) )
THEN 300 ELSE IF( abs(
REAL( AP( KPC+IMAX-1 ) ) ).GE.alpha*
325 CALL cswap( kp-1, ap( knc ), 1, ap( kpc ), 1 )
327 DO 30 j = kp + 1, kk - 1
329 t = conjg( ap( knc+j-1 ) )
330 ap( knc+j-1 ) = conjg( ap( kx ) )
333 ap( kx+kk-1 ) = conjg( ap( kx+kk-1 ) )
334 r1 =
REAL( AP( KNC+KK-1 ) )
335 ap( knc+kk-1 ) =
REAL( AP( KPC+KP-1 ) )
337 IF( kstep.EQ.2 )
THEN 338 ap( kc+k-1 ) =
REAL( AP( KC+K-1 ) )
340 ap( kc+k-2 ) = ap( kc+kp-1 )
344 ap( kc+k-1 ) =
REAL( AP( KC+K-1 ) )
346 $ ap( kc-1 ) =
REAL( AP( KC-1 ) )
351 IF( kstep.EQ.1 )
THEN 363 r1 = one /
REAL( AP( KC+K-1 ) )
364 CALL chpr( uplo, k-1, -r1, ap( kc ), 1, ap )
368 CALL csscal( k-1, r1, ap( kc ), 1 )
385 d = slapy2(
REAL( AP( K-1+( K-1 )*K / 2 ) ),
386 $ aimag( ap( k-1+( k-1 )*k / 2 ) ) )
387 d22 =
REAL( AP( K-1+( K-2 )*( K-1 ) / 2 ) ) / D
388 d11 =
REAL( AP( K+( K-1 )*K / 2 ) ) / D
389 tt = one / ( d11*d22-one )
390 d12 = ap( k-1+( k-1 )*k / 2 ) / d
393 DO 50 j = k - 2, 1, -1
394 wkm1 = d*( d11*ap( j+( k-2 )*( k-1 ) / 2 )-
395 $ conjg( d12 )*ap( j+( k-1 )*k / 2 ) )
396 wk = d*( d22*ap( j+( k-1 )*k / 2 )-d12*
397 $ ap( j+( k-2 )*( k-1 ) / 2 ) )
399 ap( i+( j-1 )*j / 2 ) = ap( i+( j-1 )*j / 2 ) -
400 $ ap( i+( k-1 )*k / 2 )*conjg( wk ) -
401 $ ap( i+( k-2 )*( k-1 ) / 2 )*conjg( wkm1 )
403 ap( j+( k-1 )*k / 2 ) = wk
404 ap( j+( k-2 )*( k-1 ) / 2 ) = wkm1
405 ap( j+( j-1 )*j / 2 ) = cmplx(
REAL( AP( J+( J-1 )*
$ J / 2 ) ) 415 IF( kstep.EQ.1 )
THEN 450 absakk = abs(
REAL( AP( KC ) ) )
456 imax = k + icamax( n-k, ap( kc+1 ), 1 )
457 colmax = cabs1( ap( kc+imax-k ) )
462 IF( max( absakk, colmax ).EQ.zero )
THEN 469 ap( kc ) =
REAL( AP( KC ) )
471 IF( absakk.GE.alpha*colmax )
THEN 483 DO 70 j = k, imax - 1
484 IF( cabs1( ap( kx ) ).GT.rowmax )
THEN 485 rowmax = cabs1( ap( kx ) )
490 kpc = npp - ( n-imax+1 )*( n-imax+2 ) / 2 + 1
492 jmax = imax + icamax( n-imax, ap( kpc+1 ), 1 )
493 rowmax = max( rowmax, cabs1( ap( kpc+jmax-imax ) ) )
496 IF( absakk.GE.alpha*colmax*( colmax / rowmax ) )
THEN 501 ELSE IF( abs(
REAL( AP( KPC ) ) ).GE.alpha*rowmax ) then
519 $ knc = knc + n - k + 1
526 $
CALL cswap( n-kp, ap( knc+kp-kk+1 ), 1, ap( kpc+1 ),
529 DO 80 j = kk + 1, kp - 1
531 t = conjg( ap( knc+j-kk ) )
532 ap( knc+j-kk ) = conjg( ap( kx ) )
535 ap( knc+kp-kk ) = conjg( ap( knc+kp-kk ) )
536 r1 =
REAL( AP( KNC ) )
537 ap( knc ) =
REAL( AP( KPC ) )
539 IF( kstep.EQ.2 )
THEN 540 ap( kc ) =
REAL( AP( KC ) )
542 ap( kc+1 ) = ap( kc+kp-k )
546 ap( kc ) =
REAL( AP( KC ) )
548 $ ap( knc ) =
REAL( AP( KNC ) )
553 IF( kstep.EQ.1 )
THEN 567 r1 = one /
REAL( AP( KC ) )
568 CALL chpr( uplo, n-k, -r1, ap( kc+1 ), 1,
573 CALL csscal( n-k, r1, ap( kc+1 ), 1 )
594 d = slapy2(
REAL( AP( K+1+( K-1 )*( 2*N-K ) / 2 ) ),
595 $ aimag( ap( k+1+( k-1 )*( 2*n-k ) / 2 ) ) )
596 d11 =
REAL( AP( K+1+K*( 2*N-K-1 ) / 2 ) ) / D
597 d22 =
REAL( AP( K+( K-1 )*( 2*N-K ) / 2 ) ) / D
598 tt = one / ( d11*d22-one )
599 d21 = ap( k+1+( k-1 )*( 2*n-k ) / 2 ) / d
603 wk = d*( d11*ap( j+( k-1 )*( 2*n-k ) / 2 )-d21*
604 $ ap( j+k*( 2*n-k-1 ) / 2 ) )
605 wkp1 = d*( d22*ap( j+k*( 2*n-k-1 ) / 2 )-
606 $ conjg( d21 )*ap( j+( k-1 )*( 2*n-k ) / 2 ) )
608 ap( i+( j-1 )*( 2*n-j ) / 2 ) = ap( i+( j-1 )*
609 $ ( 2*n-j ) / 2 ) - ap( i+( k-1 )*( 2*n-k ) /
610 $ 2 )*conjg( wk ) - ap( i+k*( 2*n-k-1 ) / 2 )*
613 ap( j+( k-1 )*( 2*n-k ) / 2 ) = wk
614 ap( j+k*( 2*n-k-1 ) / 2 ) = wkp1
615 ap( j+( j-1 )*( 2*n-j ) / 2 )
616 $ = cmplx(
REAL( AP( J+( J-1 )*( 2*N-J ) / 2 ) ),
625 IF( kstep.EQ.1 )
THEN 646 subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine csscal(N, SA, CX, INCX)
CSSCAL
subroutine chptrf(UPLO, N, AP, IPIV, INFO)
CHPTRF
subroutine chpr(UPLO, N, ALPHA, X, INCX, AP)
CHPR
subroutine cswap(N, CX, INCX, CY, INCY)
CSWAP