388 SUBROUTINE dlaqp3rk( 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 DOUBLE PRECISION ABSTOL, MAXC2NRM, MAXC2NRMK, RELMAXC2NRMK,
406 INTEGER IWORK( * ), JPIV( * )
407 DOUBLE PRECISION A( LDA, * ), AUXV( * ), F( LDF, * ), TAU( * ),
414 DOUBLE PRECISION ZERO, ONE
415 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
418 INTEGER ITEMP, J, K, MINMNFACT, MINMNUPDT,
420 DOUBLE PRECISION AIK, HUGEVAL, TEMP, TEMP2, TOL3Z
426 INTRINSIC abs, max, min, sqrt
431 DOUBLE PRECISION DLAMCH, DNRM2
432 EXTERNAL disnan, dlamch, idamax, dnrm2
443 minmnfact = min( m-ioffset, n )
444 minmnupdt = min( m-ioffset, n+nrhs )
445 nb = min( nb, minmnfact )
446 tol3z = sqrt( dlamch(
'Epsilon' ) )
447 hugeval = dlamch(
'Overflow' )
456 DO WHILE ( k.LT.nb .AND. lsticc.EQ.0 )
474 kp = ( k-1 ) + idamax( n-k+1, vn1( k ), 1 )
479 maxc2nrmk = vn1( kp )
491 IF( disnan( maxc2nrmk ) )
THEN
508 relmaxc2nrmk = maxc2nrmk
522 IF( nrhs.GT.0 .AND. kb.LT.(m-ioffset) )
THEN
523 CALL dgemm(
'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 dgemm(
'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 dgemm(
'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 dswap( m, a( 1, kp ), 1, a( 1, k ), 1 )
692 CALL dswap( k-1, f( kp, 1 ), ldf, f( k, 1 ), ldf )
696 jpiv( kp ) = jpiv( k )
704 CALL dgemv(
'No transpose', m-i+1, k-1, -one, a( i, 1 ),
705 $ lda, f( k, 1 ), ldf, one, a( i, k ), 1 )
711 CALL dlarfg( m-i+1, a( i, k ), a( i+1, k ), 1, tau( k ) )
726 IF( disnan( tau(k) ) )
THEN
744 relmaxc2nrmk = tau( k )
758 IF( nrhs.GT.0 .AND. kb.LT.(m-ioffset) )
THEN
759 CALL dgemm(
'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 dgemv(
'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 dgemv(
'Transpose', m-i+1, k-1, -tau( k ),
804 $ a( i, 1 ), lda, a( i, k ), 1, zero,
807 CALL dgemv(
'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 dgemv(
'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 dgemm(
'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 ) = dnrm2( m-
IF, a( if+1, lsticc ), 1 )
912 vn2( lsticc ) = vn1( lsticc )
subroutine dlaqp3rk(m, n, nrhs, ioffset, nb, abstol, reltol, kp1, maxc2nrm, a, lda, done, kb, maxc2nrmk, relmaxc2nrmk, jpiv, tau, vn1, vn2, auxv, f, ldf, iwork, info)
DLAQP3RK computes a step of truncated QR factorization with column pivoting of a real m-by-n matrix A...