113 SUBROUTINE chetri( UPLO, N, A, LDA, IPIV, WORK, INFO )
125 COMPLEX A( lda, * ), WORK( * )
133 parameter( one = 1.0e+0, cone = ( 1.0e+0, 0.0e+0 ),
134 $ zero = ( 0.0e+0, 0.0e+0 ) )
138 INTEGER J, K, KP, KSTEP
145 EXTERNAL lsame, cdotc
151 INTRINSIC abs, conjg, max, real
158 upper = lsame( uplo,
'U' )
159 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN 161 ELSE IF( n.LT.0 )
THEN 163 ELSE IF( lda.LT.max( 1, n ) )
THEN 167 CALL xerbla(
'CHETRI', -info )
182 DO 10 info = n, 1, -1
183 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
191 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
212 IF( ipiv( k ).GT.0 )
THEN 218 a( k, k ) = one /
REAL( A( K, K ) )
223 CALL ccopy( k-1, a( 1, k ), 1, work, 1 )
224 CALL chemv( uplo, k-1, -cone, a, lda, work, 1, zero,
226 a( k, k ) = a( k, k ) -
REAL( CDOTC( K-1, WORK, 1, A( 1,
$ K ), 1 ) 235 t = abs( a( k, k+1 ) )
236 ak =
REAL( A( K, K ) ) / T
237 akp1 =
REAL( A( K+1, K+1 ) ) / T
238 akkp1 = a( k, k+1 ) / t
239 d = t*( ak*akp1-one )
241 a( k+1, k+1 ) = ak / d
242 a( k, k+1 ) = -akkp1 / d
247 CALL ccopy( k-1, a( 1, k ), 1, work, 1 )
248 CALL chemv( uplo, k-1, -cone, a, lda, work, 1, zero,
250 a( k, k ) = a( k, k ) -
REAL( CDOTC( K-1, WORK, 1, A( 1,
$ K ), 1 ) 253 CALL ccopy( k-1, a( 1, k+1 ), 1, work, 1 )
254 CALL chemv( uplo, k-1, -cone, a, lda, work, 1, zero,
256 a( k+1, k+1 ) = a( k+1, k+1 ) -
257 $
REAL( CDOTC( K-1, WORK, 1, A( 1, K+1 ),
$ 1 ) 262 kp = abs( ipiv( k ) )
268 CALL cswap( kp-1, a( 1, k ), 1, a( 1, kp ), 1 )
269 DO 40 j = kp + 1, k - 1
270 temp = conjg( a( j, k ) )
271 a( j, k ) = conjg( a( kp, j ) )
274 a( kp, k ) = conjg( a( kp, k ) )
276 a( k, k ) = a( kp, kp )
278 IF( kstep.EQ.2 )
THEN 280 a( k, k+1 ) = a( kp, k+1 )
304 IF( ipiv( k ).GT.0 )
THEN 310 a( k, k ) = one /
REAL( A( K, K ) )
315 CALL ccopy( n-k, a( k+1, k ), 1, work, 1 )
316 CALL chemv( uplo, n-k, -cone, a( k+1, k+1 ), lda, work,
317 $ 1, zero, a( k+1, k ), 1 )
318 a( k, k ) = a( k, k ) -
REAL( CDOTC( N-K, WORK, 1,
$ A( K+1, K ), 1 ) 327 t = abs( a( k, k-1 ) )
328 ak =
REAL( A( K-1, K-1 ) ) / T
329 akp1 =
REAL( A( K, K ) ) / T
330 akkp1 = a( k, k-1 ) / t
331 d = t*( ak*akp1-one )
332 a( k-1, k-1 ) = akp1 / d
334 a( k, k-1 ) = -akkp1 / d
339 CALL ccopy( n-k, a( k+1, k ), 1, work, 1 )
340 CALL chemv( uplo, n-k, -cone, a( k+1, k+1 ), lda, work,
341 $ 1, zero, a( k+1, k ), 1 )
342 a( k, k ) = a( k, k ) -
REAL( CDOTC( N-K, WORK, 1,
$ A( K+1, K ), 1 ) 346 CALL ccopy( n-k, a( k+1, k-1 ), 1, work, 1 )
347 CALL chemv( uplo, n-k, -cone, a( k+1, k+1 ), lda, work,
348 $ 1, zero, a( k+1, k-1 ), 1 )
349 a( k-1, k-1 ) = a( k-1, k-1 ) -
350 $
REAL( CDOTC( N-K, WORK, 1, A( K+1, K-1 ),
$ 1 ) 355 kp = abs( ipiv( k ) )
362 $
CALL cswap( n-kp, a( kp+1, k ), 1, a( kp+1, kp ), 1 )
363 DO 70 j = k + 1, kp - 1
364 temp = conjg( a( j, k ) )
365 a( j, k ) = conjg( a( kp, j ) )
368 a( kp, k ) = conjg( a( kp, k ) )
370 a( k, k ) = a( kp, kp )
372 IF( kstep.EQ.2 )
THEN 374 a( k, k-1 ) = a( kp, k-1 )
389 subroutine chetri(UPLO, N, A, LDA, IPIV, WORK, INFO)
CHETRI
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine cswap(N, CX, INCX, CY, INCY)
CSWAP
subroutine chemv(UPLO, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
CHEMV