150 SUBROUTINE dtzrzf( M, N, A, LDA, TAU, WORK, LWORK, INFO )
157 INTEGER INFO, LDA, LWORK, M, N
160 DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * )
166 DOUBLE PRECISION ZERO
167 parameter( zero = 0.0d+0 )
171 INTEGER I, IB, IWS, KI, KK, LDWORK, LWKMIN, LWKOPT,
172 $ M1, MU, NB, NBMIN, NX
189 lquery = ( lwork.EQ.-1 )
192 ELSE IF( n.LT.m )
THEN
194 ELSE IF( lda.LT.max( 1, m ) )
THEN
199 IF( m.EQ.0 .OR. m.EQ.n )
THEN
206 nb = ilaenv( 1,
'DGERQF',
' ', m, n, -1, -1 )
212 IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
218 CALL xerbla(
'DTZRZF', -info )
220 ELSE IF( lquery )
THEN
228 ELSE IF( m.EQ.n )
THEN
238 IF( nb.GT.1 .AND. nb.LT.m )
THEN
242 nx = max( 0, ilaenv( 3,
'DGERQF',
' ', m, n, -1, -1 ) )
249 IF( lwork.LT.iws )
THEN
255 nbmin = max( 2, ilaenv( 2,
'DGERQF',
' ', m, n, -1,
261 IF( nb.GE.nbmin .AND. nb.LT.m .AND. nx.LT.m )
THEN
267 ki = ( ( m-nx-1 ) / nb )*nb
270 DO 20 i = m - kk + ki + 1, m - kk + 1, -nb
271 ib = min( m-i+1, nb )
276 CALL dlatrz( ib, n-i+1, n-m, a( i, i ), lda, tau( i ),
283 CALL dlarzt(
'Backward',
'Rowwise', n-m, ib, a( i, m1 ),
284 $ lda, tau( i ), work, ldwork )
288 CALL dlarzb(
'Right',
'No transpose',
'Backward',
289 $
'Rowwise', i-1, n-i+1, ib, n-m, a( i, m1 ),
290 $ lda, work, ldwork, a( 1, i ), lda,
291 $ work( ib+1 ), ldwork )
302 $
CALL dlatrz( mu, n, n-m, a, lda, tau, work )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlarzt(DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT)
DLARZT forms the triangular factor T of a block reflector H = I - vtvH.
subroutine dtzrzf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
DTZRZF
subroutine dlatrz(M, N, L, A, LDA, TAU, WORK)
DLATRZ factors an upper trapezoidal matrix by means of orthogonal transformations.
subroutine dlarzb(SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V, LDV, T, LDT, C, LDC, WORK, LDWORK)
DLARZB applies a block reflector or its transpose to a general matrix.