115 SUBROUTINE zhetri( UPLO, N, A, LDA, IPIV, WORK, INFO )
128 COMPLEX*16 A( lda, * ), WORK( * )
135 COMPLEX*16 CONE, ZERO
136 parameter ( one = 1.0d+0, cone = ( 1.0d+0, 0.0d+0 ),
137 $ zero = ( 0.0d+0, 0.0d+0 ) )
141 INTEGER J, K, KP, KSTEP
142 DOUBLE PRECISION AK, AKP1, D, T
143 COMPLEX*16 AKKP1, TEMP
148 EXTERNAL lsame, zdotc
154 INTRINSIC abs, dble, dconjg, max
161 upper = lsame( uplo,
'U' )
162 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
164 ELSE IF( n.LT.0 )
THEN
166 ELSE IF( lda.LT.max( 1, n ) )
THEN
170 CALL xerbla(
'ZHETRI', -info )
185 DO 10 info = n, 1, -1
186 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
194 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
215 IF( ipiv( k ).GT.0 )
THEN
221 a( k, k ) = one / dble( a( k, k ) )
226 CALL zcopy( k-1, a( 1, k ), 1, work, 1 )
227 CALL zhemv( uplo, k-1, -cone, a, lda, work, 1, zero,
229 a( k, k ) = a( k, k ) - dble( zdotc( k-1, work, 1, a( 1,
239 t = abs( a( k, k+1 ) )
240 ak = dble( a( k, k ) ) / t
241 akp1 = dble( a( k+1, k+1 ) ) / t
242 akkp1 = a( k, k+1 ) / t
243 d = t*( ak*akp1-one )
245 a( k+1, k+1 ) = ak / d
246 a( k, k+1 ) = -akkp1 / d
251 CALL zcopy( k-1, a( 1, k ), 1, work, 1 )
252 CALL zhemv( uplo, k-1, -cone, a, lda, work, 1, zero,
254 a( k, k ) = a( k, k ) - dble( zdotc( k-1, work, 1, a( 1,
256 a( k, k+1 ) = a( k, k+1 ) -
257 $ zdotc( k-1, a( 1, k ), 1, a( 1, k+1 ), 1 )
258 CALL zcopy( k-1, a( 1, k+1 ), 1, work, 1 )
259 CALL zhemv( uplo, k-1, -cone, a, lda, work, 1, zero,
261 a( k+1, k+1 ) = a( k+1, k+1 ) -
262 $ dble( zdotc( k-1, work, 1, a( 1, k+1 ),
268 kp = abs( ipiv( k ) )
274 CALL zswap( kp-1, a( 1, k ), 1, a( 1, kp ), 1 )
275 DO 40 j = kp + 1, k - 1
276 temp = dconjg( a( j, k ) )
277 a( j, k ) = dconjg( a( kp, j ) )
280 a( kp, k ) = dconjg( a( kp, k ) )
282 a( k, k ) = a( kp, kp )
284 IF( kstep.EQ.2 )
THEN
286 a( k, k+1 ) = a( kp, k+1 )
310 IF( ipiv( k ).GT.0 )
THEN
316 a( k, k ) = one / dble( a( k, k ) )
321 CALL zcopy( n-k, a( k+1, k ), 1, work, 1 )
322 CALL zhemv( uplo, n-k, -cone, a( k+1, k+1 ), lda, work,
323 $ 1, zero, a( k+1, k ), 1 )
324 a( k, k ) = a( k, k ) - dble( zdotc( n-k, work, 1,
334 t = abs( a( k, k-1 ) )
335 ak = dble( a( k-1, k-1 ) ) / t
336 akp1 = dble( a( k, k ) ) / t
337 akkp1 = a( k, k-1 ) / t
338 d = t*( ak*akp1-one )
339 a( k-1, k-1 ) = akp1 / d
341 a( k, k-1 ) = -akkp1 / d
346 CALL zcopy( n-k, a( k+1, k ), 1, work, 1 )
347 CALL zhemv( uplo, n-k, -cone, a( k+1, k+1 ), lda, work,
348 $ 1, zero, a( k+1, k ), 1 )
349 a( k, k ) = a( k, k ) - dble( zdotc( n-k, work, 1,
351 a( k, k-1 ) = a( k, k-1 ) -
352 $ zdotc( n-k, a( k+1, k ), 1, a( k+1, k-1 ),
354 CALL zcopy( n-k, a( k+1, k-1 ), 1, work, 1 )
355 CALL zhemv( uplo, n-k, -cone, a( k+1, k+1 ), lda, work,
356 $ 1, zero, a( k+1, k-1 ), 1 )
357 a( k-1, k-1 ) = a( k-1, k-1 ) -
358 $ dble( zdotc( n-k, work, 1, a( k+1, k-1 ),
364 kp = abs( ipiv( k ) )
371 $
CALL zswap( n-kp, a( kp+1, k ), 1, a( kp+1, kp ), 1 )
372 DO 70 j = k + 1, kp - 1
373 temp = dconjg( a( j, k ) )
374 a( j, k ) = dconjg( a( kp, j ) )
377 a( kp, k ) = dconjg( a( kp, k ) )
379 a( k, k ) = a( kp, kp )
381 IF( kstep.EQ.2 )
THEN
383 a( k, k-1 ) = a( kp, k-1 )
subroutine zhemv(UPLO, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
ZHEMV
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zswap(N, ZX, INCX, ZY, INCY)
ZSWAP
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zhetri(UPLO, N, A, LDA, IPIV, WORK, INFO)
ZHETRI