191 INTEGER INFO, KB, LDA, LDW, N, NB
195 COMPLEX A( LDA, * ), W( LDW, * )
202 parameter( zero = 0.0e+0, one = 1.0e+0 )
204 parameter( eight = 8.0e+0, sevten = 17.0e+0 )
206 parameter( cone = ( 1.0e+0, 0.0e+0 ),
207 $ czero = ( 0.0e+0, 0.0e+0 ) )
211 INTEGER IMAX, ITEMP, J, JB, JJ, JMAX, JP1, JP2, K, KK,
212 $ kw, kkw, kp, kstep, p, ii
213 REAL ABSAKK, ALPHA, COLMAX, ROWMAX, STEMP, SFMIN
214 COMPLEX D11, D12, D21, D22, R1, T, Z
226 INTRINSIC abs,
max,
min, sqrt, aimag, real
232 cabs1( z ) = abs( real( z ) ) + abs( aimag( z ) )
240 alpha = ( one+sqrt( sevten ) ) / eight
244 sfmin = slamch(
'S' )
246 IF( lsame( uplo,
'U' ) )
THEN
263 IF( ( k.LE.n-nb+1 .AND. nb.LT.n ) .OR. k.LT.1 )
271 CALL ccopy( k, a( 1, k ), 1, w( 1, kw ), 1 )
273 $
CALL cgemv(
'No transpose', k, n-k, -cone, a( 1, k+1 ),
274 $ lda, w( k, kw+1 ), ldw, cone, w( 1, kw ), 1 )
279 absakk = cabs1( w( k, kw ) )
286 imax = icamax( k-1, w( 1, kw ), 1 )
287 colmax = cabs1( w( imax, kw ) )
292 IF(
max( absakk, colmax ).EQ.zero )
THEN
299 CALL ccopy( k, w( 1, kw ), 1, a( 1, k ), 1 )
309 IF( .NOT.( absakk.LT.alpha*colmax ) )
THEN
328 CALL ccopy( imax, a( 1, imax ), 1, w( 1, kw-1 ), 1 )
329 CALL ccopy( k-imax, a( imax, imax+1 ), lda,
330 $ w( imax+1, kw-1 ), 1 )
333 $
CALL cgemv(
'No transpose', k, n-k, -cone,
334 $ a( 1, k+1 ), lda, w( imax, kw+1 ), ldw,
335 $ cone, w( 1, kw-1 ), 1 )
342 jmax = imax + icamax( k-imax, w( imax+1, kw-1 ),
344 rowmax = cabs1( w( jmax, kw-1 ) )
350 itemp = icamax( imax-1, w( 1, kw-1 ), 1 )
351 stemp = cabs1( w( itemp, kw-1 ) )
352 IF( stemp.GT.rowmax )
THEN
362 IF( .NOT.(cabs1( w( imax, kw-1 ) ).LT.alpha*rowmax ) )
372 CALL ccopy( k, w( 1, kw-1 ), 1, w( 1, kw ), 1 )
379 ELSE IF( ( p.EQ.jmax ) .OR. ( rowmax.LE.colmax ) )
398 CALL ccopy( k, w( 1, kw-1 ), 1, w( 1, kw ), 1 )
404 IF( .NOT. done )
GOTO 12
416 IF( ( kstep.EQ.2 ) .AND. ( p.NE.k ) )
THEN
420 CALL ccopy( k-p, a( p+1, k ), 1, a( p, p+1 ), lda )
421 CALL ccopy( p, a( 1, k ), 1, a( 1, p ), 1 )
426 CALL cswap( n-k+1, a( k, k ), lda, a( p, k ), lda )
427 CALL cswap( n-kk+1, w( k, kkw ), ldw, w( p, kkw ), ldw )
436 a( kp, k ) = a( kk, k )
437 CALL ccopy( k-1-kp, a( kp+1, kk ), 1, a( kp, kp+1 ),
439 CALL ccopy( kp, a( 1, kk
444 CALL cswap( n-kk+1, a( kk, kk ), lda, a( kp, kk ), lda )
445 CALL cswap( n-kk+1, w( kk, kkw ), ldw, w( kp, kkw ),
449 IF( kstep.EQ.1 )
THEN
459 CALL ccopy( k, w( 1, kw ), 1, a( 1, k ), 1 )
461 IF( cabs1( a( k, k ) ).GE.sfmin )
THEN
462 r1 = cone / a( k, k )
463 CALL cscal( k-1, r1, a( 1, k ), 1 )
464 ELSE IF( a( k, k ).NE.czero )
THEN
486 d11 = w( k, kw ) / d12
487 d22 = w( k-1, kw-1 ) / d12
490 a( j, k-1 ) = t*( (d11*w( j, kw-1 )-w
492 a( j, k ) = t*( ( d22*w( j, kw )-w( j, kw-1 ) ) /
499 a( k-1, k-1 ) = w( k-1, kw-1 )
500 a( k-1, k ) = w( k-1, kw )
501 a( k, k ) = w( k, kw )
507 IF( kstep.EQ.1 )
THEN
527 DO 50 j = ( ( k-1 ) / nb )*nb + 1, 1, -nb
528 jb =
min( nb, k-j+1 )
532 DO 40 jj = j, j + jb - 1
533 CALL cgemv(
'No transpose', jj-j+1, n-k, -cone,
534 $ a( j, k+1 ), lda, w( jj, kw+1 ), ldw, cone,
541 $
CALL cgemm(
'No transpose',
'Transpose', j-1, jb,
543 $ cone, a( 1, j ), lda )
564 IF( jp2.NE.jj .AND. j.LE.n )
565 $
CALL cswap( n-j+1, a( jp2, j ), lda, a( jj, j ), lda )
567 IF( jp1.NE.jj .AND. kstep.EQ.2 )
568 $
CALL cswap( n-j+1, a( jp1, j ), lda, a( jj, j ), lda )
589 IF( ( k.GE.nb .AND. nb.LT.n ) .OR. k.GT.n )
597 CALL ccopy( n-k+1, a( k, k ), 1, w( k, k ), 1 )
599 $
CALL cgemv(
'No transpose', n-k+1, k-1, -cone, a( k, 1 ),
600 $ lda, w( k, 1 ), ldw, cone, w( k, k ), 1 )
605 absakk = cabs1( w( k, k ) )
612 imax = k + icamax( n-k, w( k+1, k ), 1 )
613 colmax = cabs1( w( imax, k ) )
618 IF(
max( absakk, colmax ).EQ.zero )
THEN
625 CALL ccopy( n-k+1, w( k, k ), 1, a( k, k ), 1 )
635 IF( .NOT.( absakk.LT.alpha*colmax ) )
THEN
654 CALL ccopy( imax-k, a( imax, k ), lda, w( k, k+1 ), 1)
655 CALL ccopy( n-imax+1, a( imax, imax ), 1,
656 $ w( imax, k+1 ), 1 )
658 $
CALL cgemv( 'no transpose
', N-K+1, K-1, -CONE,
659 $ A( K, 1 ), LDA, W( IMAX, 1 ), LDW,
660 $ CONE, W( K, K+1 ), 1 )
667 JMAX = K - 1 + ICAMAX( IMAX-K, W( K, K+1 ), 1 )
668 ROWMAX = CABS1( W( JMAX, K+1 ) )
674 ITEMP = IMAX + ICAMAX( N-IMAX, W( IMAX+1, K+1 ), 1)
675 STEMP = CABS1( W( ITEMP, K+1 ) )
676.GT.
IF( STEMPROWMAX ) THEN
686.NOT..LT.
IF( ( CABS1( W( IMAX, K+1 ) )ALPHA*ROWMAX ) )
696 CALL CCOPY( N-K+1, W( K, K+1 ), 1, W( K, K ), 1 )
703.EQ..OR..LE.
ELSE IF( ( PJMAX ) ( ROWMAXCOLMAX ) )
722 CALL CCOPY( N-K+1, W( K, K+1 ), 1, W( K, K ), 1 )
728.NOT.
IF( DONE ) GOTO 72
736.EQ..AND..NE.
IF( ( KSTEP2 ) ( PK ) ) THEN
740 CALL CCOPY( P-K, A( K, K ), 1, A( P, K ), LDA )
741 CALL CCOPY( N-P+1, A( P, K ), 1, A( P, P ), 1 )
746 CALL CSWAP( K, A( K, 1 ), LDA, A( P, 1 ), LDA )
747 CALL CSWAP( KK, W( K, 1 ), LDW, W( P, 1 ), LDW )
756 A( KP, K ) = A( KK, K )
757 CALL CCOPY( KP-K-1, A( K+1, KK ), 1, A( KP, K+1 ), LDA )
758 CALL CCOPY( N-KP+1, A( KP, KK ), 1, A( KP, KP ), 1 )
762 CALL CSWAP( KK, A( KK, 1 ), LDA, A( KP, 1 ), LDA )
763 CALL CSWAP( KK, W( KK, 1 ), LDW, W( KP, 1 ), LDW )
766.EQ.
IF( KSTEP1 ) THEN
776 CALL CCOPY( N-K+1, W( K, K ), 1, A( K, K ), 1 )
778.GE.
IF( CABS1( A( K, K ) )SFMIN ) THEN
779 R1 = CONE / A( K, K )
780 CALL CSCAL( N-K, R1, A( K+1, K ), 1 )
781.NE.
ELSE IF( A( K, K )CZERO ) THEN
783 A( II, K ) = A( II, K ) / A( K, K )
802 D11 = W( K+1, K+1 ) / D21
803 D22 = W( K, K ) / D21
804 T = CONE / ( D11*D22-CONE )
806 A( J, K ) = T*( ( D11*W( J, K )-W( J, K+1 ) ) /
808 A( J, K+1 ) = T*( ( D22*W( J, K+1 )-W( J, K ) ) /
815 A( K, K ) = W( K, K )
816 A( K+1, K ) = W( K+1, K )
817 A( K+1, K+1 ) = W( K+1, K+1 )
823.EQ.
IF( KSTEP1 ) THEN
844 JB = MIN( NB, N-J+1 )
848 DO 100 JJ = J, J + JB - 1
849 CALL CGEMV( 'no transpose
', J+JB-JJ, K-1, -CONE,
850 $ A( JJ, 1 ), LDA, W( JJ, 1 ), LDW, CONE,
857 $ CALL CGEMM( 'no transpose
', 'transpose
', N-J-JB+1, JB,
858 $ K-1, -CONE, A( J+JB, 1 ), LDA, W( J, 1 ), LDW,
859 $ CONE, A( J+JB, J ), LDA )
880.NE..AND..GE.
IF( JP2JJ J1 )
881 $ CALL CSWAP( J, A( JP2, 1 ), LDA, A( JJ, 1 ), LDA )
883.NE..AND..EQ.
IF( JP1JJ KSTEP2 )
884 $ CALL CSWAP( J, A( JP1, 1 ), LDA, A( JJ, 1 ), LDA )