258 SUBROUTINE slasyf_rk( UPLO, N, NB, KB, A, LDA, E, IPIV, W, LDW,
267 INTEGER INFO, KB, LDA, LDW, N, NB
271 REAL A( LDA, * ), E( * ), W( LDW, * )
278 parameter( zero = 0.0e+0, one = 1.0e+0 )
280 parameter( eight = 8.0e+0, sevten = 17.0e+0 )
284 INTEGER IMAX, ITEMP, J, JB, JJ, JMAX, K, KK, KW, KKW,
286 REAL ABSAKK, ALPHA, COLMAX, D11, D12, D21, D22,
287 $ stemp, r1, rowmax, t, sfmin
293 EXTERNAL lsame, isamax, slamch
299 INTRINSIC abs, max, min, sqrt
307 alpha = ( one+sqrt( sevten ) ) / eight
311 sfmin = slamch(
'S' )
313 IF( lsame( uplo,
'U' ) )
THEN
335 IF( ( k.LE.n-nb+1 .AND. nb.LT.n ) .OR. k.LT.1 )
343 CALL scopy( k, a( 1, k ), 1, w( 1, kw ), 1 )
345 $
CALL sgemv(
'No transpose', k, n-k, -one, a( 1, k+1 ),
346 $ lda, w( k, kw+1 ), ldw, one, w( 1, kw ), 1 )
351 absakk = abs( w( k, kw ) )
358 imax = isamax( k-1, w( 1, kw ), 1 )
359 colmax = abs( w( imax, kw ) )
364 IF( max( absakk, colmax ).EQ.zero )
THEN
371 CALL scopy( k, w( 1, kw ), 1, a( 1, k ), 1 )
387 IF( .NOT.( absakk.LT.alpha*colmax ) )
THEN
406 CALL scopy( imax, a( 1, imax ), 1, w( 1, kw-1 ),
408 CALL scopy( k-imax, a( imax, imax+1 ), lda,
409 $ w( imax+1, kw-1 ), 1 )
412 $
CALL sgemv(
'No transpose', k, n-k, -one,
413 $ a( 1, k+1 ), lda, w( imax, kw+1 ), ldw,
414 $ one, w( 1, kw-1 ), 1 )
421 jmax = imax + isamax( k-imax, w( imax+1, kw-1 ),
423 rowmax = abs( w( jmax, kw-1 ) )
429 itemp = isamax( imax-1, w( 1, kw-1 ), 1 )
430 stemp = abs( w( itemp, kw-1 ) )
431 IF( stemp.GT.rowmax )
THEN
441 IF( .NOT.(abs( w( imax, kw-1 ) ).LT.alpha*rowmax ) )
451 CALL scopy( k, w( 1, kw-1 ), 1, w( 1, kw ), 1 )
458 ELSE IF( ( p.EQ.jmax ) .OR. ( rowmax.LE.colmax ) )
477 CALL scopy( k, w( 1, kw-1 ), 1, w( 1, kw ), 1 )
483 IF( .NOT. done )
GOTO 12
495 IF( ( kstep.EQ.2 ) .AND. ( p.NE.k ) )
THEN
499 CALL scopy( k-p, a( p+1, k ), 1, a( p, p+1 ), lda )
500 CALL scopy( p, a( 1, k ), 1, a( 1, p ), 1 )
505 CALL sswap( n-k+1, a( k, k ), lda, a( p, k ), lda )
506 CALL sswap( n-kk+1, w( k, kkw ), ldw, w( p, kkw ),
516 a( kp, k ) = a( kk, k )
517 CALL scopy( k-1-kp, a( kp+1, kk ), 1, a( kp, kp+1 ),
519 CALL scopy( kp, a( 1, kk ), 1, a( 1, kp ), 1 )
524 CALL sswap( n-kk+1, a( kk, kk ), lda, a( kp, kk ),
526 CALL sswap( n-kk+1, w( kk, kkw ), ldw, w( kp, kkw ),
530 IF( kstep.EQ.1 )
THEN
540 CALL scopy( k, w( 1, kw ), 1, a( 1, k ), 1 )
542 IF( abs( a( k, k ) ).GE.sfmin )
THEN
544 CALL sscal( k-1, r1, a( 1, k ), 1 )
545 ELSE IF( a( k, k ).NE.zero )
THEN
547 a( ii, k ) = a( ii, k ) / a( k, k )
572 d11 = w( k, kw ) / d12
573 d22 = w( k-1, kw-1 ) / d12
574 t = one / ( d11*d22-one )
576 a( j, k-1 ) = t*( (d11*w( j, kw-1 )-w( j, kw ) ) /
578 a( j, k ) = t*( ( d22*w( j, kw )-w( j, kw-1 ) ) /
587 a( k-1, k-1 ) = w( k-1, kw-1 )
589 a( k, k ) = w( k, kw )
590 e( k ) = w( k-1, kw )
601 IF( kstep.EQ.1 )
THEN
619 CALL sgemmtr(
'Upper',
'No transpose',
'Transpose', k, n-k,
620 $ -one, a( 1, k+1 ), lda, w( 1, kw+1 ), ldw,
621 $ one, a( 1, 1 ), lda )
644 IF( ( k.GE.nb .AND. nb.LT.n ) .OR. k.GT.n )
652 CALL scopy( n-k+1, a( k, k ), 1, w( k, k ), 1 )
654 $
CALL sgemv(
'No transpose', n-k+1, k-1, -one, a( k, 1 ),
655 $ lda, w( k, 1 ), ldw, one, w( k, k ), 1 )
660 absakk = abs( w( k, k ) )
667 imax = k + isamax( n-k, w( k+1, k ), 1 )
668 colmax = abs( w( imax, k ) )
673 IF( max( absakk, colmax ).EQ.zero )
THEN
680 CALL scopy( n-k+1, w( k, k ), 1, a( k, k ), 1 )
696 IF( .NOT.( absakk.LT.alpha*colmax ) )
THEN
715 CALL scopy( imax-k, a( imax, k ), lda, w( k, k+1 ),
717 CALL scopy( n-imax+1, a( imax, imax ), 1,
718 $ w( imax, k+1 ), 1 )
720 $
CALL sgemv(
'No transpose', n-k+1, k-1, -one,
721 $ a( k, 1 ), lda, w( imax, 1 ), ldw,
722 $ one, w( k, k+1 ), 1 )
729 jmax = k - 1 + isamax( imax-k, w( k, k+1 ), 1 )
730 rowmax = abs( w( jmax, k+1 ) )
736 itemp = imax + isamax( n-imax, w( imax+1, k+1 ),
738 stemp = abs( w( itemp, k+1 ) )
739 IF( stemp.GT.rowmax )
THEN
749 IF( .NOT.( abs( w( imax, k+1 ) ).LT.alpha*rowmax ) )
759 CALL scopy( n-k+1, w( k, k+1 ), 1, w( k, k ),
767 ELSE IF( ( p.EQ.jmax ) .OR. ( rowmax.LE.colmax ) )
786 CALL scopy( n-k+1, w( k, k+1 ), 1, w( k, k ),
793 IF( .NOT. done )
GOTO 72
801 IF( ( kstep.EQ.2 ) .AND. ( p.NE.k ) )
THEN
805 CALL scopy( p-k, a( k, k ), 1, a( p, k ), lda )
806 CALL scopy( n-p+1, a( p, k ), 1, a( p, p ), 1 )
811 CALL sswap( k, a( k, 1 ), lda, a( p, 1 ), lda )
812 CALL sswap( kk, w( k, 1 ), ldw, w( p, 1 ), ldw )
821 a( kp, k ) = a( kk, k )
822 CALL scopy( kp-k-1, a( k+1, kk ), 1, a( kp, k+1 ),
824 CALL scopy( n-kp+1, a( kp, kk ), 1, a( kp, kp ), 1 )
828 CALL sswap( kk, a( kk, 1 ), lda, a( kp, 1 ), lda )
829 CALL sswap( kk, w( kk, 1 ), ldw, w( kp, 1 ), ldw )
832 IF( kstep.EQ.1 )
THEN
842 CALL scopy( n-k+1, w( k, k ), 1, a( k, k ), 1 )
844 IF( abs( a( k, k ) ).GE.sfmin )
THEN
846 CALL sscal( n-k, r1, a( k+1, k ), 1 )
847 ELSE IF( a( k, k ).NE.zero )
THEN
849 a( ii, k ) = a( ii, k ) / a( k, k )
873 d11 = w( k+1, k+1 ) / d21
874 d22 = w( k, k ) / d21
875 t = one / ( d11*d22-one )
877 a( j, k ) = t*( ( d11*w( j, k )-w( j, k+1 ) ) /
879 a( j, k+1 ) = t*( ( d22*w( j, k+1 )-w( j, k ) ) /
888 a( k, k ) = w( k, k )
890 a( k+1, k+1 ) = w( k+1, k+1 )
902 IF( kstep.EQ.1 )
THEN
920 CALL sgemmtr(
'Lower',
'No transpose',
'Transpose', n-k+1,
921 $ k-1, -one, a( k, 1 ), lda, w( k, 1 ), ldw,
922 $ one, a( k, k ), lda )