165 SUBROUTINE zunmqr( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
166 $ WORK, LWORK, INFO )
173 CHARACTER SIDE, TRANS
174 INTEGER INFO, K, LDA, LDC, LWORK, M, N
177 COMPLEX*16 A( lda, * ), C( ldc, * ), TAU( * ), WORK( * )
183 INTEGER NBMAX, LDT, TSIZE
184 parameter( nbmax = 64, ldt = nbmax+1,
185 $ tsize = ldt*nbmax )
188 LOGICAL LEFT, LQUERY, NOTRAN
189 INTEGER I, I1, I2, I3, IB, IC, IINFO, IWT, JC, LDWORK,
190 $ lwkopt, mi, nb, nbmin, ni, nq, nw
195 EXTERNAL lsame, ilaenv
208 left = lsame( side,
'L' )
209 notran = lsame( trans,
'N' )
210 lquery = ( lwork.EQ.-1 )
221 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN 223 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'C' ) )
THEN 225 ELSE IF( m.LT.0 )
THEN 227 ELSE IF( n.LT.0 )
THEN 229 ELSE IF( k.LT.0 .OR. k.GT.nq )
THEN 231 ELSE IF( lda.LT.max( 1, nq ) )
THEN 233 ELSE IF( ldc.LT.max( 1, m ) )
THEN 235 ELSE IF( lwork.LT.nw .AND. .NOT.lquery )
THEN 243 nb = min( nbmax, ilaenv( 1,
'ZUNMQR', side // trans, m, n, k,
245 lwkopt = nw*nb + tsize
250 CALL xerbla(
'ZUNMQR', -info )
252 ELSE IF( lquery )
THEN 258 IF( m.EQ.0 .OR. n.EQ.0 .OR. k.EQ.0 )
THEN 265 IF( nb.GT.1 .AND. nb.LT.k )
THEN 266 IF( lwork.LT.lwkopt )
THEN 267 nb = (lwork-tsize) / ldwork
268 nbmin = max( 2, ilaenv( 2,
'ZUNMQR', side // trans, m, n, k,
273 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN 277 CALL zunm2r( side, trans, m, n, k, a, lda, tau, c, ldc, work,
284 IF( ( left .AND. .NOT.notran ) .OR.
285 $ ( .NOT.left .AND. notran ) )
THEN 290 i1 = ( ( k-1 ) / nb )*nb + 1
304 ib = min( nb, k-i+1 )
309 CALL zlarft(
'Forward',
'Columnwise', nq-i+1, ib, a( i, i ),
310 $ lda, tau( i ), work( iwt ), ldt )
327 CALL zlarfb( side, trans,
'Forward',
'Columnwise', mi, ni,
328 $ ib, a( i, i ), lda, work( iwt ), ldt,
329 $ c( ic, jc ), ldc, work, ldwork )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zunm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
ZUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by cgeqrf...
subroutine zlarft(DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT)
ZLARFT forms the triangular factor T of a block reflector H = I - vtvH
subroutine zunmqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
ZUNMQR
subroutine zlarfb(SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, T, LDT, C, LDC, WORK, LDWORK)
ZLARFB applies a block reflector or its conjugate-transpose to a general rectangular matrix...