150 SUBROUTINE dgeqp3( M, N, A, LDA, JPVT, TAU, WORK, LWORK, INFO )
157 INTEGER INFO, LDA, LWORK, M, N
161 DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * )
167 INTEGER INB, INBMIN, IXOVER
168 parameter( inb = 1, inbmin = 2, ixover = 3 )
172 INTEGER FJB, IWS, J, JB, LWKOPT, MINMN, MINWS, NA, NB,
173 $ NBMIN, NFXD, NX, SM, SMINMN, SN, TOPBMN
180 DOUBLE PRECISION DNRM2
181 EXTERNAL ilaenv, dnrm2
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,
'DGEQRF', '
', M, N, -1, -1 )
209 LWKOPT = 2*N + ( N + 1 )*NB
213.LT..AND..NOT.
IF( ( LWORKIWS ) LQUERY ) THEN
219 CALL XERBLA( 'dgeqp3', -INFO )
221 ELSE IF( LQUERY ) THEN
229.NE.
IF( JPVT( J )0 ) THEN
231 CALL DSWAP( M, A( 1, J ), 1, A( 1, NFXD ), 1 )
232 JPVT( J ) = JPVT( NFXD )
253 CALL DGEQRF( M, NA, A, LDA, TAU, WORK, LWORK, INFO )
254 IWS = MAX( IWS, INT( WORK( 1 ) ) )
258 CALL DORMQR( '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.LT.
IF( NFXDMINMN ) THEN
271 SMINMN = MINMN - NFXD
275 NB = ILAENV( INB, 'dgeqrf', ' ', SM, SN, -1, -1 )
279.GT..AND..LT.
IF( ( NB1 ) ( NBSMINMN ) ) THEN
283 NX = MAX( 0, ILAENV( IXOVER, 'dgeqrf', ' ', SM, SN, -1,
287.LT.
IF( NXSMINMN ) THEN
291 MINWS = 2*SN + ( SN+1 )*NB
292 IWS = MAX( IWS, MINWS )
293.LT.
IF( LWORKMINWS ) THEN
298 NB = ( LWORK-2*SN ) / ( SN+1 )
299 NBMIN = MAX( 2, ILAENV( INBMIN, 'dgeqrf', ' ', SM, SN,
310 DO 20 J = NFXD + 1, N
311 WORK( J ) = DNRM2( SM, A( NFXD+1, J ), 1 )
312 WORK( N+J ) = WORK( J )
315.GE..AND..LT..AND.
IF( ( NBNBMIN ) ( NBSMINMN )
316.LT.
$ ( NXSMINMN ) ) THEN
327.LE.
IF( JTOPBMN ) THEN
328 JB = MIN( NB, TOPBMN-J+1 )
332 CALL DLAQPS( 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 DLAQP2( M, N-J+1, J-1, A( 1, J ), LDA, JPVT( J ),
348 $ TAU( J ), WORK( J ), WORK( N+J ),
subroutine xerbla(srname, info)
XERBLA
subroutine dgeqrf(m, n, a, lda, tau, work, lwork, info)
DGEQRF
subroutine dgeqp3(m, n, a, lda, jpvt, tau, work, lwork, info)
DGEQP3
subroutine dlaqps(m, n, offset, nb, kb, a, lda, jpvt, tau, vn1, vn2, auxv, f, ldf)
DLAQPS computes a step of QR factorization with column pivoting of a real m-by-n matrix A by using BL...
subroutine dlaqp2(m, n, offset, a, lda, jpvt, tau, vn1, vn2, work)
DLAQP2 computes a QR factorization with column pivoting of the matrix block.
subroutine dormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
DORMQR
subroutine dswap(n, dx, incx, dy, incy)
DSWAP