573 SUBROUTINE sgeqp3rk( M, N, NRHS, KMAX, ABSTOL, RELTOL, A, LDA,
574 $ K, MAXC2NRMK, RELMAXC2NRMK, JPIV, TAU,
575 $ WORK, LWORK, IWORK, INFO )
583 INTEGER INFO, K, KF, KMAX, LDA, LWORK, M, N, NRHS
584 REAL ABSTOL, MAXC2NRMK, RELMAXC2NRMK, RELTOL
587 INTEGER IWORK( * ), JPIV( * )
588 REAL A( LDA, * ), TAU( * ), WORK( * )
594 INTEGER INB, INBMIN, IXOVER
595 PARAMETER ( INB = 1, inbmin = 2, ixover = 3 )
597 parameter( zero = 0.0e+0, one = 1.0e+0, two = 2.0e+0 )
601 INTEGER IINFO, IOFFSET, IWS, J, JB, JBF, JMAXB, JMAX,
602 $ jmaxc2nrm, kp1, lwkopt, minmn, n_sub, nb,
604 REAL EPS, HUGEVAL, MAXC2NRM, SAFMIN
611 INTEGER ISAMAX, ILAENV
612 REAL SLAMCH, SNRM2, SROUNDUP_LWORK
613 EXTERNAL sisnan, slamch, snrm2, isamax, ilaenv,
617 INTRINSIC real, max, min
625 lquery = ( lwork.EQ.-1 )
628 ELSE IF( n.LT.0 )
THEN
630 ELSE IF( nrhs.LT.0 )
THEN
632 ELSE IF( kmax.LT.0 )
THEN
634 ELSE IF( sisnan( abstol ) )
THEN
636 ELSE IF( sisnan( reltol ) )
THEN
638 ELSE IF( lda.LT.max( 1, m ) )
THEN
654 IF( minmn.EQ.0 )
THEN
672 nb = ilaenv( inb,
'SGEQP3RK',
' ', m, n, -1, -1 )
689 lwkopt = 2*n + nb*( n+nrhs+1 )
691 work( 1 ) = sroundup_lwork( lwkopt )
693 IF( ( lwork.LT.iws ) .AND. .NOT.lquery )
THEN
702 CALL xerbla(
'SGEQP3RK', -info )
704 ELSE IF( lquery )
THEN
710 IF( minmn.EQ.0 )
THEN
714 work( 1 ) = sroundup_lwork( lwkopt )
737 work( j ) = snrm2( m, a( 1, j ), 1 )
738 work( n+j ) = work( j )
746 kp1 = isamax( n, work( 1 ), 1 )
747 maxc2nrm = work( kp1 )
751 IF( sisnan( maxc2nrm ) )
THEN
763 relmaxc2nrmk = maxc2nrm
767 work( 1 ) = sroundup_lwork( lwkopt )
773 IF( maxc2nrm.EQ.zero )
THEN
786 work( 1 ) = sroundup_lwork( lwkopt )
793 hugeval = slamch(
'Overflow' )
795 IF( maxc2nrm.GT.hugeval )
THEN
817 work( 1 ) = sroundup_lwork( lwkopt )
823 eps = slamch(
'Epsilon')
827 IF( abstol.GE.zero )
THEN
828 safmin = slamch(
'Safe minimum')
829 abstol = max( abstol, two*safmin )
834 IF( reltol.GE.zero )
THEN
835 reltol = max( reltol, eps )
843 jmax = min( kmax, minmn )
852 IF( maxc2nrm.LE.abstol .OR. one.LE.reltol )
THEN
862 work( 1 ) = sroundup_lwork( lwkopt )
875 IF( ( nb.GT.1 ) .AND. ( nb.LT.minmn ) )
THEN
880 nx = max( 0, ilaenv( ixover,
'SGEQP3RK',
' ', m, n, -1,
883 IF( nx.LT.minmn )
THEN
887 IF( lwork.LT.lwkopt )
THEN
893 nb = ( lwork-2*n ) / ( n+1 )
894 nbmin = max( 2, ilaenv( inbmin,
'SGEQP3RK',
' ', m, n,
919 jmaxb = min( kmax, minmn - nx )
921 IF( nb.GE.nbmin .AND. nb.LT.jmax .AND. jmaxb.GT.0 )
THEN
933 DO WHILE( j.LE.jmaxb )
935 jb = min( nb, jmaxb-j+1 )
941 CALL slaqp3rk( m, n_sub, nrhs, ioffset, jb, abstol,
942 $ reltol, kp1, maxc2nrm, a( 1, j ), lda,
943 $ done, jbf, maxc2nrmk, relmaxc2nrmk,
944 $ jpiv( j ), tau( j ),
945 $ work( j ), work( n+j ),
946 $ work( 2*n+1 ), work( 2*n+jb+1 ),
947 $ n+nrhs-j+1, iwork, iinfo )
951 IF( iinfo.GT.n_sub .AND. info.EQ.0 )
THEN
952 info = 2*ioffset + iinfo
975 IF( iinfo.LE.n_sub .AND. iinfo.GT.0 )
THEN
976 info = ioffset + iinfo
981 work( 1 ) = sroundup_lwork( lwkopt )
1007 CALL slaqp2rk( m, n_sub, nrhs, ioffset, jmax-j+1,
1008 $ abstol, reltol, kp1, maxc2nrm, a( 1, j ), lda,
1009 $ kf, maxc2nrmk, relmaxc2nrmk, jpiv( j ),
1010 $ tau( j ), work( j ), work( n+j ),
1011 $ work( 2*n+1 ), iinfo )
1029 IF( iinfo.GT.n_sub .AND. info.EQ.0 )
THEN
1030 info = 2*ioffset + iinfo
1031 ELSE IF( iinfo.LE.n_sub .AND. iinfo.GT.0 )
THEN
1032 info = ioffset + iinfo
1049 IF( k.LT.minmn )
THEN
1050 jmaxc2nrm = k + isamax( n-k, work( k+1 ), 1 )
1051 maxc2nrmk = work( jmaxc2nrm )
1055 relmaxc2nrmk = maxc2nrmk / maxc2nrm
1068 work( 1 ) = sroundup_lwork( lwkopt )
subroutine sgeqp3rk(m, n, nrhs, kmax, abstol, reltol, a, lda, k, maxc2nrmk, relmaxc2nrmk, jpiv, tau, work, lwork, iwork, info)
SGEQP3RK computes a truncated Householder QR factorization with column pivoting of a real m-by-n matr...
subroutine slaqp2rk(m, n, nrhs, ioffset, kmax, abstol, reltol, kp1, maxc2nrm, a, lda, k, maxc2nrmk, relmaxc2nrmk, jpiv, tau, vn1, vn2, work, info)
SLAQP2RK computes truncated QR factorization with column pivoting of a real matrix block using Level ...
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...