165 SUBROUTINE zunmql( 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, IINFO, IWT, LDWORK, LWKOPT,
190 $ 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 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
246 nb = min( nbmax, ilaenv( 1,
'ZUNMQL', side // trans, m, n,
248 lwkopt = nw*nb + tsize
254 CALL xerbla(
'ZUNMQL', -info )
256 ELSE IF( lquery )
THEN
262 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
268 IF( nb.GT.1 .AND. nb.LT.k )
THEN
269 IF( lwork.LT.lwkopt )
THEN
270 nb = (lwork-tsize) / ldwork
271 nbmin = max( 2, ilaenv( 2,
'ZUNMQL', side // trans, m, n, k,
276 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN
280 CALL zunm2l( side, trans, m, n, k, a, lda, tau, c, ldc, work,
287 IF( ( left .AND. notran ) .OR.
288 $ ( .NOT.left .AND. .NOT.notran ) )
THEN
293 i1 = ( ( k-1 ) / nb )*nb + 1
305 ib = min( nb, k-i+1 )
310 CALL zlarft(
'Backward',
'Columnwise', nq-k+i+ib-1, ib,
311 $ a( 1, i ), lda, tau( i ), work( iwt ), ldt )
316 mi = m - k + i + ib - 1
321 ni = n - k + i + ib - 1
326 CALL zlarfb( side, trans,
'Backward',
'Columnwise', mi, ni,
327 $ ib, a( 1, i ), lda, work( iwt ), ldt, c, ldc,
subroutine xerbla(SRNAME, INFO)
XERBLA
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.
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 zunmql(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
ZUNMQL
subroutine zunm2l(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
ZUNM2L multiplies a general matrix by the unitary matrix from a QL factorization determined by cgeqlf...