165 SUBROUTINE dormql( 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 DOUBLE PRECISION 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,
'T' ) )
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,
'DORMQL', side // trans, m, n,
248 lwkopt = nw*nb + tsize
254 CALL xerbla(
'DORMQL', -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,
'DORMQL', side // trans, m, n, k,
276 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN 280 CALL dorm2l( 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 dlarft(
'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 dlarfb( side, trans,
'Backward',
'Columnwise', mi, ni,
327 $ ib, a( 1, i ), lda, work( iwt ), ldt, c, ldc,
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 dormql(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMQL
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...
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.