129 SUBROUTINE chetri_rook( UPLO, N, A, LDA, IPIV, WORK, INFO )
142 COMPLEX A( LDA, * ), WORK( * )
150 parameter( one = 1.0e+0, cone = ( 1.0e+0, 0.0e+0 ),
151 $ czero = ( 0.0e+0, 0.0e+0 ) )
155 INTEGER J, K, KP, KSTEP
162 EXTERNAL lsame, cdotc
168 INTRINSIC abs, conjg, max, real
175 upper = lsame( uplo,
'U' )
176 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
178 ELSE IF( n.LT.0 )
THEN
180 ELSE IF( lda.LT.max( 1, n ) )
THEN
184 CALL xerbla(
'CHETRI_ROOK', -info )
199 DO 10 info = n, 1, -1
200 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.czero )
208 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.czero )
229 IF( ipiv( k ).GT.0 )
THEN
235 a( k, k ) = one / real( a( k, k ) )
240 CALL ccopy( k-1, a( 1, k ), 1, work, 1 )
241 CALL chemv( uplo, k-1, -cone, a, lda, work, 1, czero,
243 a( k, k ) = a( k, k ) - real( cdotc( k-1, work, 1, a( 1,
253 t = abs( a( k, k+1 ) )
254 ak = real( a( k, k ) ) / t
255 akp1 = real( a( k+1, k+1 ) ) / t
256 akkp1 = a( k, k+1 ) / t
257 d = t*( ak*akp1-one )
259 a( k+1, k+1 ) = ak / d
260 a( k, k+1 ) = -akkp1 / d
265 CALL ccopy( k-1, a( 1, k ), 1, work, 1 )
266 CALL chemv( uplo, k-1, -cone, a, lda, work, 1, czero,
268 a( k, k ) = a( k, k ) - real( cdotc( k-1, work, 1, a( 1,
270 a( k, k+1 ) = a( k, k+1 ) -
271 $ cdotc( k-1, a( 1, k ), 1, a( 1, k+1 ), 1 )
272 CALL ccopy( k-1, a( 1, k+1 ), 1, work, 1 )
273 CALL chemv( uplo, k-1, -cone, a, lda, work, 1, czero,
275 a( k+1, k+1 ) = a( k+1, k+1 ) -
276 $ real( cdotc( k-1, work, 1, a( 1, k+1 ),
282 IF( kstep.EQ.1 )
THEN
291 $
CALL cswap( kp-1, a( 1, k ), 1, a( 1, kp ), 1 )
293 DO 40 j = kp + 1, k - 1
294 temp = conjg( a( j, k ) )
295 a( j, k ) = conjg( a( kp, j ) )
299 a( kp, k ) = conjg( a( kp, k ) )
302 a( k, k ) = a( kp, kp )
316 $
CALL cswap( kp-1, a( 1, k ), 1, a( 1, kp ), 1 )
318 DO 50 j = kp + 1, k - 1
319 temp = conjg( a( j, k ) )
320 a( j, k ) = conjg( a( kp, j ) )
324 a( kp, k ) = conjg( a( kp, k ) )
327 a( k, k ) = a( kp, kp )
331 a( k, k+1 ) = a( kp, k+1 )
342 $
CALL cswap( kp-1, a( 1, k ), 1, a( 1, kp ), 1 )
344 DO 60 j = kp + 1, k - 1
345 temp = conjg( a( j, k ) )
346 a( j, k ) = conjg( a( kp, j ) )
350 a( kp, k ) = conjg( a( kp, k ) )
353 a( k, k ) = a( kp, kp )
377 IF( ipiv( k ).GT.0 )
THEN
383 a( k, k ) = one / real( a( k, k ) )
388 CALL ccopy( n-k, a( k+1, k ), 1, work, 1 )
389 CALL chemv( uplo, n-k, -cone, a( k+1, k+1 ), lda, work,
390 $ 1, czero, a( k+1, k ), 1 )
391 a( k, k ) = a( k, k ) - real( cdotc( n-k, work, 1,
401 t = abs( a( k, k-1 ) )
402 ak = real( a( k-1, k-1 ) ) / t
403 akp1 = real( a( k, k ) ) / t
404 akkp1 = a( k, k-1 ) / t
405 d = t*( ak*akp1-one )
406 a( k-1, k-1 ) = akp1 / d
408 a( k, k-1 ) = -akkp1 / d
413 CALL ccopy( n-k, a( k+1, k ), 1, work, 1 )
414 CALL chemv( uplo, n-k, -cone, a( k+1, k+1 ), lda, work,
415 $ 1, czero, a( k+1, k ), 1 )
416 a( k, k ) = a( k, k ) - real( cdotc( n-k, work, 1,
418 a( k, k-1 ) = a( k, k-1 ) -
419 $ cdotc( n-k, a( k+1, k ), 1, a( k+1, k-1 ),
421 CALL ccopy( n-k, a( k+1, k-1 ), 1, work, 1 )
422 CALL chemv( uplo, n-k, -cone, a( k+1, k+1 ), lda, work,
423 $ 1, czero, a( k+1, k-1 ), 1 )
424 a( k-1, k-1 ) = a( k-1, k-1 ) -
425 $ real( cdotc( n-k, work, 1, a( k+1, k-1 ),
431 IF( kstep.EQ.1 )
THEN
440 $
CALL cswap( n-kp, a( kp+1, k ), 1, a( kp+1, kp ), 1 )
442 DO 90 j = k + 1, kp - 1
443 temp = conjg( a( j, k ) )
444 a( j, k ) = conjg( a( kp, j ) )
448 a( kp, k ) = conjg( a( kp, k ) )
451 a( k, k ) = a( kp, kp )
465 $
CALL cswap( n-kp, a( kp+1, k ), 1, a( kp+1, kp ), 1 )
467 DO 100 j = k + 1, kp - 1
468 temp = conjg( a( j, k ) )
469 a( j, k ) = conjg( a( kp, j ) )
473 a( kp, k ) = conjg( a( kp, k ) )
476 a( k, k ) = a( kp, kp )
480 a( k, k-1 ) = a( kp, k-1 )
491 $
CALL cswap( n-kp, a( kp+1, k ), 1, a( kp+1, kp ), 1 )
493 DO 110 j = k + 1, kp - 1
494 temp = conjg( a( j, k ) )
495 a( j, k ) = conjg( a( kp, j ) )
499 a( kp, k ) = conjg( a( kp, k ) )
502 a( k, k ) = a( kp, kp )