137 SUBROUTINE dgerqf( M, N, A, LDA, TAU, WORK, LWORK, INFO )
144 INTEGER INFO, LDA, LWORK, M, N
147 DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * )
154 INTEGER I, IB, IINFO, IWS, K, KI, KK, LDWORK, LWKOPT,
155 $ MU, NB, NBMIN, NU, NX
172 lquery = ( lwork.EQ.-1 )
175 ELSE IF( n.LT.0 )
THEN
177 ELSE IF( lda.LT.max( 1, m ) )
THEN
186 nb = ilaenv( 1,
'DGERQF',
' ', m, n, -1, -1 )
191 IF( lwork.LT.max( 1, m ) .AND. .NOT.lquery )
THEN
197 CALL xerbla(
'DGERQF', -info )
199 ELSE IF( lquery )
THEN
212 IF( nb.GT.1 .AND. nb.LT.k )
THEN
216 nx = max( 0, ilaenv( 3,
'DGERQF',
' ', m, n, -1, -1 ) )
223 IF( lwork.LT.iws )
THEN
229 nbmin = max( 2, ilaenv( 2,
'DGERQF',
' ', m, n, -1,
235 IF( nb.GE.nbmin .AND. nb.LT.k .AND. nx.LT.k )
THEN
240 ki = ( ( k-nx-1 ) / nb )*nb
243 DO 10 i = k - kk + ki + 1, k - kk + 1, -nb
244 ib = min( k-i+1, nb )
249 CALL dgerq2( ib, n-k+i+ib-1, a( m-k+i, 1 ), lda, tau( i ),
251 IF( m-k+i.GT.1 )
THEN
256 CALL dlarft(
'Backward',
'Rowwise', n-k+i+ib-1, ib,
257 $ a( m-k+i, 1 ), lda, tau( i ), work, ldwork )
261 CALL dlarfb(
'Right',
'No transpose',
'Backward',
262 $
'Rowwise', m-k+i-1, n-k+i+ib-1, ib,
263 $ a( m-k+i, 1 ), lda, work, ldwork, a, lda,
264 $ work( ib+1 ), ldwork )
267 mu = m - k + i + nb - 1
268 nu = n - k + i + nb - 1
276 IF( mu.GT.0 .AND. nu.GT.0 )
277 $
CALL dgerq2( mu, nu, a, lda, tau, work, iinfo )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dgerq2(M, N, A, LDA, TAU, WORK, INFO)
DGERQ2 computes the RQ factorization of a general rectangular matrix using an unblocked algorithm.
subroutine dgerqf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
DGERQF
subroutine dlarft(DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT)
DLARFT forms the triangular factor T of a block reflector H = I - vtvH
subroutine dlarfb(SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, T, LDT, C, LDC, WORK, LDWORK)
DLARFB applies a block reflector or its transpose to a general rectangular matrix.