166 SUBROUTINE cunmql( 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, IINFO, IWT, LDWORK, LWKOPT,
192 $ 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 IF( m.EQ.0 .OR. n.EQ.0 )
THEN 248 nb = min( nbmax, ilaenv( 1,
'CUNMQL', side // trans, m, n,
250 lwkopt = nw*nb + tsize
256 CALL xerbla(
'CUNMQL', -info )
258 ELSE IF( lquery )
THEN 264 IF( m.EQ.0 .OR. n.EQ.0 )
THEN 272 IF( nb.GT.1 .AND. nb.LT.k )
THEN 273 IF( lwork.LT.lwkopt )
THEN 274 nb = (lwork-tsize) / ldwork
275 nbmin = max( 2, ilaenv( 2,
'CUNMQL', side // trans, m, n, k,
280 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN 284 CALL cunm2l( side, trans, m, n, k, a, lda, tau, c, ldc, work,
291 IF( ( left .AND. notran ) .OR.
292 $ ( .NOT.left .AND. .NOT.notran ) )
THEN 297 i1 = ( ( k-1 ) / nb )*nb + 1
309 ib = min( nb, k-i+1 )
314 CALL clarft(
'Backward',
'Columnwise', nq-k+i+ib-1, ib,
315 $ a( 1, i ), lda, tau( i ), work( iwt ), ldt )
320 mi = m - k + i + ib - 1
325 ni = n - k + i + ib - 1
330 CALL clarfb( side, trans,
'Backward',
'Columnwise', mi, ni,
331 $ ib, a( 1, i ), lda, work( iwt ), ldt, c, ldc,
subroutine xerbla(SRNAME, INFO)
XERBLA
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 cunmql(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
CUNMQL
subroutine cunm2l(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
CUNM2L multiplies a general matrix by the unitary matrix from a QL factorization determined by cgeqlf...
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...