388 SUBROUTINE slaqp3rk( M, N, NRHS, IOFFSET, NB, ABSTOL,
389 $ RELTOL, KP1, MAXC2NRM, A, LDA, DONE, KB,
390 $ MAXC2NRMK, RELMAXC2NRMK, JPIV, TAU,
391 $ VN1, VN2, AUXV, F, LDF, IWORK, INFO )
400 INTEGER INFO, IOFFSET, KB, KP1, LDA, LDF, M, N,
402 REAL ABSTOL, MAXC2NRM, MAXC2NRMK, RELMAXC2NRMK,
406 INTEGER IWORK( * ), JPIV( * )
407 REAL A( LDA, * ), AUXV( * ), F( LDF, * ), TAU( * ),
415 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
418 INTEGER ITEMP, J, K, MINMNFACT, MINMNUPDT,
420 REAL AIK, HUGEVAL, TEMP, TEMP2, TOL3Z
426 INTRINSIC abs, max, min, sqrt
432 EXTERNAL sisnan, slamch, isamax, snrm2
443 minmnfact = min( m-ioffset, n )
444 minmnupdt = min( m-ioffset, n+nrhs )
445 nb = min( nb, minmnfact )
446 tol3z = sqrt( slamch(
'Epsilon' ) )
447 hugeval = slamch(
'Overflow' )
456 DO WHILE ( k.LT.nb .AND. lsticc.EQ.0 )
474 kp = ( k-1 ) + isamax( n-k+1, vn1( k ), 1 )
479 maxc2nrmk = vn1( kp )
491 IF( sisnan( maxc2nrmk ) )
THEN
508 relmaxc2nrmk = maxc2nrmk
522 IF( nrhs.GT.0 .AND. kb.LT.(m-ioffset) )
THEN
523 CALL sgemm(
'No transpose',
'Transpose',
524 $ m-
IF, nrhs, kb, -one, a( if+1, 1 ), lda,
525 $ f( n+1, 1 ), ldf, one, a( if+1, n+1 ), lda )
545 IF( maxc2nrmk.EQ.zero )
THEN
571 IF( nrhs.GT.0 .AND. kb.LT.(m-ioffset) )
THEN
572 CALL sgemm(
'No transpose',
'Transpose',
573 $ m-
IF, nrhs, kb, -one, a( if+1, 1 ), lda,
574 $ f( n+1, 1 ), ldf, one, a( if+1, n+1 ), lda )
605 IF( info.EQ.0 .AND. maxc2nrmk.GT.hugeval )
THEN
606 info = n + k - 1 + kp
621 relmaxc2nrmk = maxc2nrmk / maxc2nrm
623 IF( maxc2nrmk.LE.abstol .OR. relmaxc2nrmk.LE.reltol )
THEN
647 IF( kb.LT.minmnupdt )
THEN
648 CALL sgemm(
'No transpose',
'Transpose',
649 $ m-
IF, n+nrhs-kb, kb,-one, a( if+1, 1 ), lda,
650 $ f( kb+1, 1 ), ldf, one, a( if+1, kb+1 ), lda )
691 CALL sswap( m, a( 1, kp ), 1, a( 1, k ), 1 )
692 CALL sswap( k-1, f( kp, 1 ), ldf, f( k, 1 ), ldf )
696 jpiv( kp ) = jpiv( k )
704 CALL sgemv(
'No transpose', m-i+1, k-1, -one, a( i, 1 ),
705 $ lda, f( k, 1 ), ldf, one, a( i, k ), 1 )
711 CALL slarfg( m-i+1, a( i, k ), a( i+1, k ), 1, tau( k ) )
726 IF( sisnan( tau(k) ) )
THEN
744 relmaxc2nrmk = tau( k )
758 IF( nrhs.GT.0 .AND. kb.LT.(m-ioffset) )
THEN
759 CALL sgemm(
'No transpose',
'Transpose',
760 $ m-
IF, nrhs, kb, -one, a( if+1, 1 ), lda,
761 $ f( n+1, 1 ), ldf, one, a( if+1, n+1 ), lda )
785 IF( k.LT.n+nrhs )
THEN
786 CALL sgemv(
'Transpose', m-i+1, n+nrhs-k,
787 $ tau( k ), a( i, k+1 ), lda, a( i, k ), 1,
788 $ zero, f( k+1, k ), 1 )
803 CALL sgemv(
'Transpose', m-i+1, k-1, -tau( k ),
804 $ a( i, 1 ), lda, a( i, k ), 1, zero,
807 CALL sgemv(
'No transpose', n+nrhs, k-1, one,
808 $ f( 1, 1 ), ldf, auxv( 1 ), 1, one,
818 IF( k.LT.n+nrhs )
THEN
819 CALL sgemv(
'No transpose', n+nrhs-k, k, -one,
820 $ f( k+1, 1 ), ldf, a( i, 1 ), lda, one,
830 IF( k.LT.minmnfact )
THEN
833 IF( vn1( j ).NE.zero )
THEN
838 temp = abs( a( i, j ) ) / vn1( j )
839 temp = max( zero, ( one+temp )*( one-temp ) )
840 temp2 = temp*( vn1( j ) / vn2( j ) )**2
841 IF( temp2.LE.tol3z )
THEN
850 iwork( j-1 ) = lsticc
857 vn1( j ) = vn1( j )*sqrt( temp )
886 IF( kb.LT.minmnupdt )
THEN
887 CALL sgemm(
'No transpose',
'Transpose',
888 $ m-
IF, n+nrhs-kb, kb, -one, a( if+1, 1 ), lda,
889 $ f( kb+1, 1 ), ldf, one, a( if+1, kb+1 ), lda )
896 DO WHILE( lsticc.GT.0 )
902 itemp = iwork( lsticc-1 )
911 vn1( lsticc ) = snrm2( m-
IF, a( if+1, lsticc ), 1 )
912 vn2( lsticc ) = vn1( lsticc )
subroutine slaqp3rk(m, n, nrhs, ioffset, nb, abstol, reltol, kp1, maxc2nrm, a, lda, done, kb, maxc2nrmk, relmaxc2nrmk, jpiv, tau, vn1, vn2, auxv, f, ldf, iwork, info)
SLAQP3RK computes a step of truncated QR factorization with column pivoting of a real m-by-n matrix A...