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