168 SUBROUTINE sormql( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
169 $ work, lwork, info )
177 CHARACTER SIDE, TRANS
178 INTEGER INFO, K, LDA, LDC, LWORK, M, N
181 REAL A( lda, * ), C( ldc, * ), TAU( * ),
188 INTEGER NBMAX, LDT, TSIZE
189 parameter ( nbmax = 64, ldt = nbmax+1,
190 $ tsize = ldt*nbmax )
193 LOGICAL LEFT, LQUERY, NOTRAN
194 INTEGER I, I1, I2, I3, IB, IINFO, IWT, LDWORK, LWKOPT,
195 $ mi, nb, nbmin, ni, nq, nw
200 EXTERNAL lsame, ilaenv
213 left = lsame( side,
'L' )
214 notran = lsame( trans,
'N' )
215 lquery = ( lwork.EQ.-1 )
226 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN
228 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) )
THEN
230 ELSE IF( m.LT.0 )
THEN
232 ELSE IF( n.LT.0 )
THEN
234 ELSE IF( k.LT.0 .OR. k.GT.nq )
THEN
236 ELSE IF( lda.LT.max( 1, nq ) )
THEN
238 ELSE IF( ldc.LT.max( 1, m ) )
THEN
240 ELSE IF( lwork.LT.nw .AND. .NOT.lquery )
THEN
248 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
251 nb = min( nbmax, ilaenv( 1,
'SORMQL', side // trans, m, n,
253 lwkopt = nw*nb + tsize
259 CALL xerbla(
'SORMQL', -info )
261 ELSE IF( lquery )
THEN
267 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
273 IF( nb.GT.1 .AND. nb.LT.k )
THEN
274 IF( lwork.LT.nw*nb+tsize )
THEN
275 nb = (lwork-tsize) / ldwork
276 nbmin = max( 2, ilaenv( 2,
'SORMQL', side // trans, m, n, k,
281 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN
285 CALL sorm2l( side, trans, m, n, k, a, lda, tau, c, ldc, work,
292 IF( ( left .AND. notran ) .OR.
293 $ ( .NOT.left .AND. .NOT.notran ) )
THEN
298 i1 = ( ( k-1 ) / nb )*nb + 1
310 ib = min( nb, k-i+1 )
315 CALL slarft(
'Backward',
'Columnwise', nq-k+i+ib-1, ib,
316 $ a( 1, i ), lda, tau( i ), work( iwt ), ldt )
321 mi = m - k + i + ib - 1
326 ni = n - k + i + ib - 1
331 CALL slarfb( side, trans,
'Backward',
'Columnwise', mi, ni,
332 $ ib, a( 1, i ), lda, work( iwt ), ldt, c, ldc,
subroutine sormql(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMQL
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slarft(DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT)
SLARFT forms the triangular factor T of a block reflector H = I - vtvH
subroutine slarfb(SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, T, LDT, C, LDC, WORK, LDWORK)
SLARFB applies a block reflector or its transpose to a general rectangular matrix.
subroutine sorm2l(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
SORM2L multiplies a general matrix by the orthogonal matrix from a QL factorization determined by sge...