187 SUBROUTINE dormrz( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
188 $ work, lwork, info )
196 CHARACTER SIDE, TRANS
197 INTEGER INFO, K, L, LDA, LDC, LWORK, M, N
200 DOUBLE PRECISION A( lda, * ), C( ldc, * ), TAU( * ), WORK( * )
206 INTEGER NBMAX, LDT, TSIZE
207 parameter ( nbmax = 64, ldt = nbmax+1,
208 $ tsize = ldt*nbmax )
211 LOGICAL LEFT, LQUERY, NOTRAN
213 INTEGER I, I1, I2, I3, IB, IC, IINFO, IWT, JA, JC,
214 $ ldwork, lwkopt, mi, nb, nbmin, ni, nq, nw
219 EXTERNAL lsame, ilaenv
232 left = lsame( side,
'L' )
233 notran = lsame( trans,
'N' )
234 lquery = ( lwork.EQ.-1 )
245 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN
247 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) )
THEN
249 ELSE IF( m.LT.0 )
THEN
251 ELSE IF( n.LT.0 )
THEN
253 ELSE IF( k.LT.0 .OR. k.GT.nq )
THEN
255 ELSE IF( l.LT.0 .OR. ( left .AND. ( l.GT.m ) ) .OR.
256 $ ( .NOT.left .AND. ( l.GT.n ) ) )
THEN
258 ELSE IF( lda.LT.max( 1, k ) )
THEN
260 ELSE IF( ldc.LT.max( 1, m ) )
THEN
262 ELSE IF( lwork.LT.max( 1, nw ) .AND. .NOT.lquery )
THEN
270 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
273 nb = min( nbmax, ilaenv( 1,
'DORMRQ', side // trans, m, n,
275 lwkopt = nw*nb + tsize
281 CALL xerbla(
'DORMRZ', -info )
283 ELSE IF( lquery )
THEN
289 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
296 IF( nb.GT.1 .AND. nb.LT.k )
THEN
297 IF( lwork.LT.nw*nb+tsize )
THEN
298 nb = (lwork-tsize) / ldwork
299 nbmin = max( 2, ilaenv( 2,
'DORMRQ', side // trans, m, n, k,
304 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN
308 CALL dormr3( side, trans, m, n, k, l, a, lda, tau, c, ldc,
315 IF( ( left .AND. .NOT.notran ) .OR.
316 $ ( .NOT.left .AND. notran ) )
THEN
321 i1 = ( ( k-1 ) / nb )*nb + 1
343 ib = min( nb, k-i+1 )
348 CALL dlarzt(
'Backward',
'Rowwise', l, ib, a( i, ja ), lda,
349 $ tau( i ), work( iwt ), ldt )
367 CALL dlarzb( side, transt,
'Backward',
'Rowwise', mi, ni,
368 $ ib, l, a( i, ja ), lda, work( iwt ), ldt,
369 $ c( ic, jc ), ldc, work, ldwork )
subroutine dormr3(SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC, WORK, INFO)
DORMR3 multiplies a general matrix by the orthogonal matrix from a RZ factorization determined by stz...
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 dormrz(SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMRZ
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.