210 parameter( zero = 0.0e+0, one = 1.0e+0 )
212 parameter( eight = 8.0e+0, sevten = 17.0e+0 )
216 INTEGER I, II, IMAX, ITEMP, J, JMAX, K, KK, KP, KSTEP,
218 REAL ABSAKK, ALPHA, COLMAX, D, D11, D22, R1, STEMP,
220 COMPLEX D12, D21, T, WK, WKM1, WKP1, Z
227 EXTERNAL lsame, icamax, slamch, slapy2
233 INTRINSIC abs, aimag, cmplx, conjg, max, real, sqrt
239 cabs1( z ) = abs( real( z ) ) + abs( aimag( z ) )
246 upper = lsame( uplo,
'U' )
247 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
249 ELSE IF( n.LT.0 )
THEN
251 ELSE IF( lda.LT.max( 1, n ) )
THEN
255 CALL xerbla(
'CHETF2_ROOK', -info )
261 alpha = ( one+sqrt( sevten ) ) / eight
265 sfmin = slamch(
'S' )
287 absakk = abs( real( a( k, k ) ) )
294 imax = icamax( k-1, a( 1, k ), 1 )
295 colmax = cabs1( a( imax, k ) )
300 IF( ( max( absakk, colmax ).EQ.zero ) )
THEN
307 a( k, k ) = real( a( k, k ) )
318 IF( .NOT.( absakk.LT.alpha*colmax ) )
THEN
340 jmax = imax + icamax( k-imax, a( imax, imax+1 ),
342 rowmax = cabs1( a( imax, jmax ) )
348 itemp = icamax( imax-1, a( 1, imax ), 1 )
349 stemp = cabs1( a( itemp, imax ) )
350 IF( stemp.GT.rowmax )
THEN
361 IF( .NOT.( abs( real( a( imax, imax ) ) )
362 $ .LT.alpha*rowmax ) )
THEN
374 ELSE IF( ( p.EQ.jmax ) .OR. ( rowmax.LE.colmax ) )
396 IF( .NOT.done )
GOTO 12
411 IF( ( kstep.EQ.2 ) .AND. ( p.NE.k ) )
THEN
414 $
CALL cswap( p-1, a( 1, k ), 1, a( 1, p ), 1 )
416 DO 14 j = p + 1, k - 1
417 t = conjg( a( j, k ) )
418 a( j, k ) = conjg( a( p, j ) )
422 a( p, k ) = conjg( a( p, k ) )
424 r1 = real( a( k, k ) )
425 a( k, k ) = real( a( p, p ) )
435 $
CALL cswap( kp-1, a( 1, kk ), 1, a( 1, kp ), 1 )
437 DO 15 j = kp + 1, kk - 1
438 t = conjg( a( j, kk ) )
439 a( j, kk ) = conjg( a( kp, j ) )
443 a( kp, kk ) = conjg( a( kp, kk ) )
445 r1 = real( a( kk, kk ) )
446 a( kk, kk ) = real( a( kp, kp ) )
449 IF( kstep.EQ.2 )
THEN
451 a( k, k ) = real( a( k, k ) )
454 a( k-1, k ) = a( kp, k )
459 a( k, k ) = real( a( k, k ) )
461 $ a( k-1, k-1 ) = real( a( k-1, k-1 ) )
466 IF( kstep.EQ.1 )
THEN
479 IF( abs( real( a( k, k ) ) ).GE.sfmin )
THEN
485 d11 = one / real( a( k, k ) )
486 CALL cher( uplo, k-1, -d11, a( 1, k ), 1, a,
491 CALL csscal( k-1, d11, a( 1, k ), 1 )
496 d11 = real( a( k, k ) )
498 a( ii, k ) = a( ii, k ) / d11
506 CALL cher( uplo, k-1, -d11, a( 1, k ), 1, a,
529 d = slapy2( real( a( k-1, k ) ),
530 $ aimag( a( k-1, k ) ) )
531 d11 = real( a( k, k ) / d )
532 d22 = real( a( k-1, k-1 ) / d )
533 d12 = a( k-1, k ) / d
534 tt = one / ( d11*d22-one )
536 DO 30 j = k - 2, 1, -1
540 wkm1 = tt*( d11*a( j, k-1 )-conjg( d12 )*
542 wk = tt*( d22*a( j, k )-d12*a( j, k-1 ) )
547 a( i, j ) = a( i, j ) -
548 $ ( a( i, k ) / d )*conjg( wk ) -
549 $ ( a( i, k-1 ) / d )*conjg( wkm1 )
555 a( j, k-1 ) = wkm1 / d
557 a( j, j ) = cmplx( real( a( j, j ) ), zero )
569 IF( kstep.EQ.1 )
THEN
601 absakk = abs( real( a( k, k ) ) )
608 imax = k + icamax( n-k, a( k+1, k ), 1 )
609 colmax = cabs1( a( imax, k ) )
614 IF( max( absakk, colmax ).EQ.zero )
THEN
621 a( k, k ) = real( a( k, k ) )
632 IF( .NOT.( absakk.LT.alpha*colmax ) )
THEN
654 jmax = k - 1 + icamax( imax-k, a( imax, k ),
656 rowmax = cabs1( a( imax, jmax ) )
662 itemp = imax + icamax( n-imax, a( imax+1,
665 stemp = cabs1( a( itemp, imax ) )
666 IF( stemp.GT.rowmax )
THEN
677 IF( .NOT.( abs( real( a( imax, imax ) ) )
678 $ .LT.alpha*rowmax ) )
THEN
690 ELSE IF( ( p.EQ.jmax ) .OR. ( rowmax.LE.colmax ) )
713 IF( .NOT.done )
GOTO 42
728 IF( ( kstep.EQ.2 ) .AND. ( p.NE.k ) )
THEN
731 $
CALL cswap( n-p, a( p+1, k ), 1, a( p+1, p ), 1 )
733 DO 44 j = k + 1, p - 1
734 t = conjg( a( j, k ) )
735 a( j, k ) = conjg( a( p, j ) )
739 a( p, k ) = conjg( a( p, k ) )
741 r1 = real( a( k, k ) )
742 a( k, k ) = real( a( p, p ) )
752 $
CALL cswap( n-kp, a( kp+1, kk ), 1, a( kp+1, kp ),
755 DO 45 j = kk + 1, kp - 1
756 t = conjg( a( j, kk ) )
757 a( j, kk ) = conjg( a( kp, j ) )
761 a( kp, kk ) = conjg( a( kp, kk ) )
763 r1 = real( a( kk, kk ) )
764 a( kk, kk ) = real( a( kp, kp ) )
767 IF( kstep.EQ.2 )
THEN
769 a( k, k ) = real( a( k, k ) )
772 a( k+1, k ) = a( kp, k )
777 a( k, k ) = real( a( k, k ) )
779 $ a( k+1, k+1 ) = real( a( k+1, k+1 ) )
784 IF( kstep.EQ.1 )
THEN
799 IF( abs( real( a( k, k ) ) ).GE.sfmin )
THEN
805 d11 = one / real( a( k, k ) )
806 CALL cher( uplo, n-k, -d11, a( k+1, k ), 1,
807 $ a( k+1, k+1 ), lda )
811 CALL csscal( n-k, d11, a( k+1, k ), 1 )
816 d11 = real( a( k, k ) )
818 a( ii, k ) = a( ii, k ) / d11
826 CALL cher( uplo, n-k, -d11, a( k+1, k ), 1,
827 $ a( k+1, k+1 ), lda )
850 d = slapy2( real( a( k+1, k ) ),
851 $ aimag( a( k+1, k ) ) )
852 d11 = real( a( k+1, k+1 ) ) / d
853 d22 = real( a( k, k ) ) / d
854 d21 = a( k+1, k ) / d
855 tt = one / ( d11*d22-one )
861 wk = tt*( d11*a( j, k )-d21*a( j, k+1 ) )
862 wkp1 = tt*( d22*a( j, k+1 )-conjg( d21 )*
868 a( i, j ) = a( i, j ) -
869 $ ( a( i, k ) / d )*conjg( wk ) -
870 $ ( a( i, k+1 ) / d )*conjg( wkp1 )
876 a( j, k+1 ) = wkp1 / d
878 a( j, j ) = cmplx( real( a( j, j ) ), zero )
890 IF( kstep.EQ.1 )
THEN