106      SUBROUTINE zhptri( UPLO, N, AP, IPIV, WORK, INFO )
 
  118      COMPLEX*16         AP( * ), WORK( * )
 
  125      COMPLEX*16         CONE, ZERO
 
  126      parameter( one = 1.0d+0, cone = ( 1.0d+0, 0.0d+0 ),
 
  127     $                   zero = ( 0.0d+0, 0.0d+0 ) )
 
  131      INTEGER            J, K, KC, KCNEXT, KP, KPC, KSTEP, KX, NPP
 
  132      DOUBLE PRECISION   AK, AKP1, D, T
 
  133      COMPLEX*16         AKKP1, TEMP
 
  138      EXTERNAL           lsame, zdotc
 
  144      INTRINSIC          abs, dble, dconjg
 
  151      upper = lsame( uplo, 
'U' )
 
  152      IF( .NOT.upper .AND. .NOT.lsame( uplo, 
'L' ) ) 
THEN 
  154      ELSE IF( n.LT.0 ) 
THEN 
  158         CALL xerbla( 
'ZHPTRI', -info )
 
  174         DO 10 info = n, 1, -1
 
  175            IF( ipiv( info ).GT.0 .AND. ap( kp ).EQ.zero )
 
  185            IF( ipiv( info ).GT.0 .AND. ap( kp ).EQ.zero )
 
  187            kp = kp + n - info + 1
 
  209         IF( ipiv( k ).GT.0 ) 
THEN 
  215            ap( kc+k-1 ) = one / dble( ap( kc+k-1 ) )
 
  220               CALL zcopy( k-1, ap( kc ), 1, work, 1 )
 
  221               CALL zhpmv( uplo, k-1, -cone, ap, work, 1, zero,
 
  223               ap( kc+k-1 ) = ap( kc+k-1 ) -
 
  224     $                        dble( zdotc( k-1, work, 1, ap( kc ),
 
  234            t = abs( ap( kcnext+k-1 ) )
 
  235            ak = dble( ap( kc+k-1 ) ) / t
 
  236            akp1 = dble( ap( kcnext+k ) ) / t
 
  237            akkp1 = ap( kcnext+k-1 ) / t
 
  238            d = t*( ak*akp1-one )
 
  239            ap( kc+k-1 ) = akp1 / d
 
  240            ap( kcnext+k ) = ak / d
 
  241            ap( kcnext+k-1 ) = -akkp1 / d
 
  246               CALL zcopy( k-1, ap( kc ), 1, work, 1 )
 
  247               CALL zhpmv( uplo, k-1, -cone, ap, work, 1, zero,
 
  249               ap( kc+k-1 ) = ap( kc+k-1 ) -
 
  250     $                        dble( zdotc( k-1, work, 1, ap( kc ),
 
  252               ap( kcnext+k-1 ) = ap( kcnext+k-1 ) -
 
  253     $                            zdotc( k-1, ap( kc ), 1,
 
  256               CALL zcopy( k-1, ap( kcnext ), 1, work, 1 )
 
  257               CALL zhpmv( uplo, k-1, -cone, ap, work, 1, zero,
 
  259               ap( kcnext+k ) = ap( kcnext+k ) -
 
  260     $                          dble( zdotc( k-1, work, 1,
 
  265            kcnext = kcnext + k + 1
 
  268         kp = abs( ipiv( k ) )
 
  274            kpc = ( kp-1 )*kp / 2 + 1
 
  275            CALL zswap( kp-1, ap( kc ), 1, ap( kpc ), 1 )
 
  277            DO 40 j = kp + 1, k - 1
 
  279               temp = dconjg( ap( kc+j-1 ) )
 
  280               ap( kc+j-1 ) = dconjg( ap( kx ) )
 
  283            ap( kc+kp-1 ) = dconjg( ap( kc+kp-1 ) )
 
  285            ap( kc+k-1 ) = ap( kpc+kp-1 )
 
  286            ap( kpc+kp-1 ) = temp
 
  287            IF( kstep.EQ.2 ) 
THEN 
  288               temp = ap( kc+k+k-1 )
 
  289               ap( kc+k+k-1 ) = ap( kc+k+kp-1 )
 
  290               ap( kc+k+kp-1 ) = temp
 
  316         kcnext = kc - ( n-k+2 )
 
  317         IF( ipiv( k ).GT.0 ) 
THEN 
  323            ap( kc ) = one / dble( ap( kc ) )
 
  328               CALL zcopy( n-k, ap( kc+1 ), 1, work, 1 )
 
  329               CALL zhpmv( uplo, n-k, -cone, ap( kc+n-k+1 ), work, 1,
 
  330     $                     zero, ap( kc+1 ), 1 )
 
  331               ap( kc ) = ap( kc ) - dble( zdotc( n-k, work, 1,
 
  341            t = abs( ap( kcnext+1 ) )
 
  342            ak = dble( ap( kcnext ) ) / t
 
  343            akp1 = dble( ap( kc ) ) / t
 
  344            akkp1 = ap( kcnext+1 ) / t
 
  345            d = t*( ak*akp1-one )
 
  346            ap( kcnext ) = akp1 / d
 
  348            ap( kcnext+1 ) = -akkp1 / d
 
  353               CALL zcopy( n-k, ap( kc+1 ), 1, work, 1 )
 
  354               CALL zhpmv( uplo, n-k, -cone, ap( kc+( n-k+1 ) ),
 
  356     $                     1, zero, ap( kc+1 ), 1 )
 
  357               ap( kc ) = ap( kc ) - dble( zdotc( n-k, work, 1,
 
  359               ap( kcnext+1 ) = ap( kcnext+1 ) -
 
  360     $                          zdotc( n-k, ap( kc+1 ), 1,
 
  361     $                          ap( kcnext+2 ), 1 )
 
  362               CALL zcopy( n-k, ap( kcnext+2 ), 1, work, 1 )
 
  363               CALL zhpmv( uplo, n-k, -cone, ap( kc+( n-k+1 ) ),
 
  365     $                     1, zero, ap( kcnext+2 ), 1 )
 
  366               ap( kcnext ) = ap( kcnext ) -
 
  367     $                        dble( zdotc( n-k, work, 1,
 
  372            kcnext = kcnext - ( n-k+3 )
 
  375         kp = abs( ipiv( k ) )
 
  381            kpc = npp - ( n-kp+1 )*( n-kp+2 ) / 2 + 1
 
  383     $         
CALL zswap( n-kp, ap( kc+kp-k+1 ), 1, ap( kpc+1 ), 1 )
 
  385            DO 70 j = k + 1, kp - 1
 
  387               temp = dconjg( ap( kc+j-k ) )
 
  388               ap( kc+j-k ) = dconjg( ap( kx ) )
 
  391            ap( kc+kp-k ) = dconjg( ap( kc+kp-k ) )
 
  395            IF( kstep.EQ.2 ) 
THEN 
  396               temp = ap( kc-n+k-1 )
 
  397               ap( kc-n+k-1 ) = ap( kc-n+kp-1 )
 
  398               ap( kc-n+kp-1 ) = temp