152 SUBROUTINE sgeqp3( M, N, A, LDA, JPVT, TAU, WORK, LWORK, INFO )
160 INTEGER INFO, LDA, LWORK, M, N
164 REAL A( lda, * ), TAU( * ), WORK( * )
170 INTEGER INB, INBMIN, IXOVER
171 parameter ( inb = 1, inbmin = 2, ixover = 3 )
175 INTEGER FJB, IWS, J, JB, LWKOPT, MINMN, MINWS, NA, NB,
176 $ nbmin, nfxd, nx, sm, sminmn, sn, topbmn
184 EXTERNAL ilaenv, snrm2
187 INTRINSIC int, max, min
192 lquery = ( lwork.EQ.-1 )
195 ELSE IF( n.LT.0 )
THEN
197 ELSE IF( lda.LT.max( 1, m ) )
THEN
203 IF( minmn.EQ.0 )
THEN
208 nb = ilaenv( inb,
'SGEQRF',
' ', m, n, -1, -1 )
209 lwkopt = 2*n + ( n + 1 )*nb
213 IF( ( lwork.LT.iws ) .AND. .NOT.lquery )
THEN
219 CALL xerbla(
'SGEQP3', -info )
221 ELSE IF( lquery )
THEN
229 IF( jpvt( j ).NE.0 )
THEN
231 CALL sswap( m, a( 1, j ), 1, a( 1, nfxd ), 1 )
232 jpvt( j ) = jpvt( nfxd )
253 CALL sgeqrf( m, na, a, lda, tau, work, lwork, info )
254 iws = max( iws, int( work( 1 ) ) )
258 CALL sormqr(
'Left',
'Transpose', m, n-na, na, a, lda, tau,
259 $ a( 1, na+1 ), lda, work, lwork, info )
260 iws = max( iws, int( work( 1 ) ) )
267 IF( nfxd.LT.minmn )
THEN
271 sminmn = minmn - nfxd
275 nb = ilaenv( inb,
'SGEQRF',
' ', sm, sn, -1, -1 )
279 IF( ( nb.GT.1 ) .AND. ( nb.LT.sminmn ) )
THEN
283 nx = max( 0, ilaenv( ixover,
'SGEQRF',
' ', sm, sn, -1,
287 IF( nx.LT.sminmn )
THEN
291 minws = 2*sn + ( sn+1 )*nb
292 iws = max( iws, minws )
293 IF( lwork.LT.minws )
THEN
298 nb = ( lwork-2*sn ) / ( sn+1 )
299 nbmin = max( 2, ilaenv( inbmin,
'SGEQRF',
' ', sm, sn,
310 DO 20 j = nfxd + 1, n
311 work( j ) = snrm2( sm, a( nfxd+1, j ), 1 )
312 work( n+j ) = work( j )
315 IF( ( nb.GE.nbmin ) .AND. ( nb.LT.sminmn ) .AND.
316 $ ( nx.LT.sminmn ) )
THEN
327 IF( j.LE.topbmn )
THEN
328 jb = min( nb, topbmn-j+1 )
332 CALL slaqps( m, n-j+1, j-1, jb, fjb, a( 1, j ), lda,
333 $ jpvt( j ), tau( j ), work( j ), work( n+j ),
334 $ work( 2*n+1 ), work( 2*n+jb+1 ), n-j+1 )
347 $
CALL slaqp2( m, n-j+1, j-1, a( 1, j ), lda, jpvt( j ),
348 $ tau( j ), work( j ), work( n+j ),
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 sgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
SGEQRF
subroutine sormqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMQR
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 xerbla(SRNAME, INFO)
XERBLA
subroutine sgeqp3(M, N, A, LDA, JPVT, TAU, WORK, LWORK, INFO)
SGEQP3
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP