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 dtzrzf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
DTZRZF
subroutine xerbla(SRNAME, INFO)
XERBLA
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.
subroutine dlarzt(DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT)
DLARZT forms the triangular factor T of a block reflector H = I - vtvH.