108 SUBROUTINE chptri( UPLO, N, AP, IPIV, WORK, INFO )
120 COMPLEX AP( * ), WORK( * )
128 parameter( one = 1.0e+0, cone = ( 1.0e+0, 0.0e+0 ),
129 $ zero = ( 0.0e+0, 0.0e+0 ) )
133 INTEGER J, K, KC, KCNEXT, KP, KPC, KSTEP, KX, NPP
140 EXTERNAL lsame, cdotc
146 INTRINSIC abs, conjg, real
153 upper = lsame( uplo,
'U' )
154 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN 156 ELSE IF( n.LT.0 )
THEN 160 CALL xerbla(
'CHPTRI', -info )
176 DO 10 info = n, 1, -1
177 IF( ipiv( info ).GT.0 .AND. ap( kp ).EQ.zero )
187 IF( ipiv( info ).GT.0 .AND. ap( kp ).EQ.zero )
189 kp = kp + n - info + 1
211 IF( ipiv( k ).GT.0 )
THEN 217 ap( kc+k-1 ) = one /
REAL( AP( KC+K-1 ) )
222 CALL ccopy( k-1, ap( kc ), 1, work, 1 )
223 CALL chpmv( uplo, k-1, -cone, ap, work, 1, zero,
225 ap( kc+k-1 ) = ap( kc+k-1 ) -
226 $
REAL( CDOTC( K-1, WORK, 1, AP( KC ), 1 ) )
235 t = abs( ap( kcnext+k-1 ) )
236 ak =
REAL( AP( KC+K-1 ) ) / T
237 akp1 =
REAL( AP( KCNEXT+K ) ) / T
238 akkp1 = ap( kcnext+k-1 ) / t
239 d = t*( ak*akp1-one )
240 ap( kc+k-1 ) = akp1 / d
241 ap( kcnext+k ) = ak / d
242 ap( kcnext+k-1 ) = -akkp1 / d
247 CALL ccopy( k-1, ap( kc ), 1, work, 1 )
248 CALL chpmv( uplo, k-1, -cone, ap, work, 1, zero,
250 ap( kc+k-1 ) = ap( kc+k-1 ) -
251 $
REAL( CDOTC( K-1, WORK, 1, AP( KC ), 1 ) )
252 ap( kcnext+k-1 ) = ap( kcnext+k-1 ) -
253 $ cdotc( k-1, ap( kc ), 1, ap( kcnext ),
255 CALL ccopy( k-1, ap( kcnext ), 1, work, 1 )
256 CALL chpmv( uplo, k-1, -cone, ap, work, 1, zero,
258 ap( kcnext+k ) = ap( kcnext+k ) -
259 $
REAL( CDOTC( K-1, WORK, 1, AP( KCNEXT ),
$ 1 ) 262 kcnext = kcnext + k + 1
265 kp = abs( ipiv( k ) )
271 kpc = ( kp-1 )*kp / 2 + 1
272 CALL cswap( kp-1, ap( kc ), 1, ap( kpc ), 1 )
274 DO 40 j = kp + 1, k - 1
276 temp = conjg( ap( kc+j-1 ) )
277 ap( kc+j-1 ) = conjg( ap( kx ) )
280 ap( kc+kp-1 ) = conjg( ap( kc+kp-1 ) )
282 ap( kc+k-1 ) = ap( kpc+kp-1 )
283 ap( kpc+kp-1 ) = temp
284 IF( kstep.EQ.2 )
THEN 285 temp = ap( kc+k+k-1 )
286 ap( kc+k+k-1 ) = ap( kc+k+kp-1 )
287 ap( kc+k+kp-1 ) = temp
313 kcnext = kc - ( n-k+2 )
314 IF( ipiv( k ).GT.0 )
THEN 320 ap( kc ) = one /
REAL( AP( KC ) )
325 CALL ccopy( n-k, ap( kc+1 ), 1, work, 1 )
326 CALL chpmv( uplo, n-k, -cone, ap( kc+n-k+1 ), work, 1,
327 $ zero, ap( kc+1 ), 1 )
328 ap( kc ) = ap( kc ) -
REAL( CDOTC( N-K, WORK, 1,
$ AP( KC+1 ), 1 ) 337 t = abs( ap( kcnext+1 ) )
338 ak =
REAL( AP( KCNEXT ) ) / T
339 akp1 =
REAL( AP( KC ) ) / T
340 akkp1 = ap( kcnext+1 ) / t
341 d = t*( ak*akp1-one )
342 ap( kcnext ) = akp1 / d
344 ap( kcnext+1 ) = -akkp1 / d
349 CALL ccopy( n-k, ap( kc+1 ), 1, work, 1 )
350 CALL chpmv( uplo, n-k, -cone, ap( kc+( n-k+1 ) ), work,
351 $ 1, zero, ap( kc+1 ), 1 )
352 ap( kc ) = ap( kc ) -
REAL( CDOTC( N-K, WORK, 1,
$ AP( KC+1 ), 1 ) 356 CALL ccopy( n-k, ap( kcnext+2 ), 1, work, 1 )
357 CALL chpmv( uplo, n-k, -cone, ap( kc+( n-k+1 ) ), work,
358 $ 1, zero, ap( kcnext+2 ), 1 )
359 ap( kcnext ) = ap( kcnext ) -
360 $
REAL( CDOTC( N-K, WORK, 1, AP( KCNEXT+2 ),
$ 1 ) 363 kcnext = kcnext - ( n-k+3 )
366 kp = abs( ipiv( k ) )
372 kpc = npp - ( n-kp+1 )*( n-kp+2 ) / 2 + 1
374 $
CALL cswap( n-kp, ap( kc+kp-k+1 ), 1, ap( kpc+1 ), 1 )
376 DO 70 j = k + 1, kp - 1
378 temp = conjg( ap( kc+j-k ) )
379 ap( kc+j-k ) = conjg( ap( kx ) )
382 ap( kc+kp-k ) = conjg( ap( kc+kp-k ) )
386 IF( kstep.EQ.2 )
THEN 387 temp = ap( kc-n+k-1 )
388 ap( kc-n+k-1 ) = ap( kc-n+kp-1 )
389 ap( kc-n+kp-1 ) = temp
404 subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine cswap(N, CX, INCX, CY, INCY)
CSWAP
subroutine chpmv(UPLO, N, ALPHA, AP, X, INCX, BETA, Y, INCY)
CHPMV
subroutine chptri(UPLO, N, AP, IPIV, WORK, INFO)
CHPTRI