166 SUBROUTINE cunmqr( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
167 $ WORK, LWORK, INFO )
174 CHARACTER SIDE, TRANS
175 INTEGER INFO, K, LDA, LDC, LWORK, M, N
178 COMPLEX A( LDA, * ), C( LDC, * ), TAU( * ),
185 INTEGER NBMAX, LDT, TSIZE
186 parameter( nbmax = 64, ldt = nbmax+1,
187 $ tsize = ldt*nbmax )
190 LOGICAL LEFT, LQUERY, NOTRAN
191 INTEGER I, I1, I2, I3, IB, IC, IINFO, IWT, JC, LDWORK,
192 $ lwkopt, mi, nb, nbmin, ni, nq, nw
197 EXTERNAL lsame, ilaenv
210 left = lsame( side,
'L' )
211 notran = lsame( trans,
'N' )
212 lquery = ( lwork.EQ.-1 )
223 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN
225 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'C' ) )
THEN
227 ELSE IF( m.LT.0 )
THEN
229 ELSE IF( n.LT.0 )
THEN
231 ELSE IF( k.LT.0 .OR. k.GT.nq )
THEN
233 ELSE IF( lda.LT.max( 1, nq ) )
THEN
235 ELSE IF( ldc.LT.max( 1, m ) )
THEN
237 ELSE IF( lwork.LT.nw .AND. .NOT.lquery )
THEN
245 nb = min( nbmax, ilaenv( 1,
'CUNMQR', side // trans, m, n, k,
247 lwkopt = nw*nb + tsize
252 CALL xerbla(
'CUNMQR', -info )
254 ELSE IF( lquery )
THEN
260 IF( m.EQ.0 .OR. n.EQ.0 .OR. k.EQ.0 )
THEN
267 IF( nb.GT.1 .AND. nb.LT.k )
THEN
268 IF( lwork.LT.lwkopt )
THEN
269 nb = (lwork-tsize) / ldwork
270 nbmin = max( 2, ilaenv( 2,
'CUNMQR', side // trans, m, n, k,
275 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN
279 CALL cunm2r( side, trans, m, n, k, a, lda, tau, c, ldc, work,
286 IF( ( left .AND. .NOT.notran ) .OR.
287 $ ( .NOT.left .AND. notran ) )
THEN
292 i1 = ( ( k-1 ) / nb )*nb + 1
306 ib = min( nb, k-i+1 )
311 CALL clarft(
'Forward',
'Columnwise', nq-i+1, ib, a( i, i ),
312 $ lda, tau( i ), work( iwt ), ldt )
329 CALL clarfb( side, trans,
'Forward',
'Columnwise', mi, ni,
330 $ ib, a( i, i ), lda, work( iwt ), ldt,
331 $ c( ic, jc ), ldc, work, ldwork )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine clarfb(SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, T, LDT, C, LDC, WORK, LDWORK)
CLARFB applies a block reflector or its conjugate-transpose to a general rectangular matrix.
subroutine clarft(DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT)
CLARFT forms the triangular factor T of a block reflector H = I - vtvH
subroutine cunmqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
CUNMQR
subroutine cunm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
CUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by cgeqrf...