167 SUBROUTINE dormql( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
168 $ work, lwork, info )
176 CHARACTER SIDE, TRANS
177 INTEGER INFO, K, LDA, LDC, LWORK, M, N
180 DOUBLE PRECISION A( lda, * ), C( ldc, * ), TAU( * ), WORK( * )
186 INTEGER NBMAX, LDT, TSIZE
187 parameter ( nbmax = 64, ldt = nbmax+1,
188 $ tsize = ldt*nbmax )
191 LOGICAL LEFT, LQUERY, NOTRAN
192 INTEGER I, I1, I2, I3, IB, IINFO, IWT, LDWORK, LWKOPT,
193 $ mi, nb, nbmin, ni, nq, nw
198 EXTERNAL lsame, ilaenv
211 left = lsame( side,
'L' )
212 notran = lsame( trans,
'N' )
213 lquery = ( lwork.EQ.-1 )
224 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN
226 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) )
THEN
228 ELSE IF( m.LT.0 )
THEN
230 ELSE IF( n.LT.0 )
THEN
232 ELSE IF( k.LT.0 .OR. k.GT.nq )
THEN
234 ELSE IF( lda.LT.max( 1, nq ) )
THEN
236 ELSE IF( ldc.LT.max( 1, m ) )
THEN
238 ELSE IF( lwork.LT.nw .AND. .NOT.lquery )
THEN
246 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
249 nb = min( nbmax, ilaenv( 1,
'DORMQL', side // trans, m, n,
251 lwkopt = nw*nb + tsize
257 CALL xerbla(
'DORMQL', -info )
259 ELSE IF( lquery )
THEN
265 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
271 IF( nb.GT.1 .AND. nb.LT.k )
THEN
272 IF( lwork.LT.nw*nb+tsize )
THEN
273 nb = (lwork-tsize) / ldwork
274 nbmin = max( 2, ilaenv( 2,
'DORMQL', side // trans, m, n, k,
279 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN
283 CALL dorm2l( side, trans, m, n, k, a, lda, tau, c, ldc, work,
290 IF( ( left .AND. notran ) .OR.
291 $ ( .NOT.left .AND. .NOT.notran ) )
THEN
296 i1 = ( ( k-1 ) / nb )*nb + 1
308 ib = min( nb, k-i+1 )
313 CALL dlarft(
'Backward',
'Columnwise', nq-k+i+ib-1, ib,
314 $ a( 1, i ), lda, tau( i ), work( iwt ), ldt )
319 mi = m - k + i + ib - 1
324 ni = n - k + i + ib - 1
329 CALL dlarfb( side, trans,
'Backward',
'Columnwise', mi, ni,
330 $ ib, a( 1, i ), lda, work( iwt ), ldt, c, ldc,
subroutine dlarfb(SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, T, LDT, C, LDC, WORK, LDWORK)
DLARFB applies a block reflector or its transpose to a general rectangular matrix.
subroutine dormql(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMQL
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlarft(DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT)
DLARFT forms the triangular factor T of a block reflector H = I - vtvH
subroutine dorm2l(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
DORM2L multiplies a general matrix by the orthogonal matrix from a QL factorization determined by sge...