148      SUBROUTINE sgeqp3( M, N, A, LDA, JPVT, TAU, WORK, LWORK, INFO )
 
  155      INTEGER            INFO, LDA, LWORK, M, N
 
  159      REAL               A( LDA, * ), TAU( * ), WORK( * )
 
  165      INTEGER            INB, INBMIN, IXOVER
 
  166      parameter( inb = 1, inbmin = 2, ixover = 3 )
 
  170      INTEGER            FJB, IWS, J, JB, LWKOPT, MINMN, MINWS, NA, NB,
 
  171     $                   NBMIN, NFXD, NX, SM, SMINMN, SN, TOPBMN
 
  179      REAL               SNRM2, SROUNDUP_LWORK
 
  180      EXTERNAL           ilaenv, snrm2, sroundup_lwork
 
  183      INTRINSIC          int, max, min
 
  188      lquery = ( lwork.EQ.-1 )
 
  191      ELSE IF( n.LT.0 ) 
THEN 
  193      ELSE IF( lda.LT.max( 1, m ) ) 
THEN 
  199         IF( minmn.EQ.0 ) 
THEN 
  204            nb = ilaenv( inb, 
'SGEQRF', 
' ', m, n, -1, -1 )
 
  205            lwkopt = 2*n + ( n + 1 )*nb
 
  207         work( 1 ) = sroundup_lwork(lwkopt)
 
  209         IF( ( lwork.LT.iws ) .AND. .NOT.lquery ) 
THEN 
  215         CALL xerbla( 
'SGEQP3', -info )
 
  217      ELSE IF( lquery ) 
THEN 
  225         IF( jpvt( j ).NE.0 ) 
THEN 
  227               CALL sswap( m, a( 1, j ), 1, a( 1, nfxd ), 1 )
 
  228               jpvt( j ) = jpvt( nfxd )
 
  249         CALL sgeqrf( m, na, a, lda, tau, work, lwork, info )
 
  250         iws = max( iws, int( work( 1 ) ) )
 
  254            CALL sormqr( 
'Left', 
'Transpose', m, n-na, na, a, lda,
 
  256     $                   a( 1, na+1 ), lda, work, lwork, info )
 
  257            iws = max( iws, int( work( 1 ) ) )
 
  264      IF( nfxd.LT.minmn ) 
THEN 
  268         sminmn = minmn - nfxd
 
  272         nb = ilaenv( inb, 
'SGEQRF', 
' ', sm, sn, -1, -1 )
 
  276         IF( ( nb.GT.1 ) .AND. ( nb.LT.sminmn ) ) 
THEN 
  280            nx = max( 0, ilaenv( ixover, 
'SGEQRF', 
' ', sm, sn, -1,
 
  284            IF( nx.LT.sminmn ) 
THEN 
  288               minws = 2*sn + ( sn+1 )*nb
 
  289               iws = max( iws, minws )
 
  290               IF( lwork.LT.minws ) 
THEN 
  295                  nb = ( lwork-2*sn ) / ( sn+1 )
 
  296                  nbmin = max( 2, ilaenv( inbmin, 
'SGEQRF', 
' ', sm,
 
  308         DO 20 j = nfxd + 1, n
 
  309            work( j ) = snrm2( sm, a( nfxd+1, j ), 1 )
 
  310            work( n+j ) = work( j )
 
  313         IF( ( nb.GE.nbmin ) .AND. ( nb.LT.sminmn ) .AND.
 
  314     $       ( nx.LT.sminmn ) ) 
THEN 
  325            IF( j.LE.topbmn ) 
THEN 
  326               jb = min( nb, topbmn-j+1 )
 
  330               CALL slaqps( m, n-j+1, j-1, jb, fjb, a( 1, j ), lda,
 
  331     $                      jpvt( j ), tau( j ), work( j ), work( n+j ),
 
  332     $                      work( 2*n+1 ), work( 2*n+jb+1 ), n-j+1 )
 
  345     $      
CALL slaqp2( m, n-j+1, j-1, a( 1, j ), lda, jpvt( j ),
 
  346     $                   tau( j ), work( j ), work( n+j ),
 
  351      work( 1 ) = sroundup_lwork(iws)
 
 
subroutine slaqp2(m, n, offset, a, lda, jpvt, tau, vn1, vn2, work)
SLAQP2 computes a QR factorization with column pivoting of the matrix block.
subroutine slaqps(m, n, offset, nb, kb, a, lda, jpvt, tau, vn1, vn2, auxv, f, ldf)
SLAQPS computes a step of QR factorization with column pivoting of a real m-by-n matrix A by using BL...
subroutine sormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
SORMQR