166 SUBROUTINE sormqr( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
167 $ WORK, LWORK, INFO )
174 CHARACTER SIDE, TRANS
175 INTEGER INFO, K, , LDC, LWORK, M, N
178 REAL A( LDA, * ), C( LDC, * ), ( * ),
185 INTEGER NBMAX, LDT, TSIZE
186 parameter( nbmax = 64, ldt = nbmax+1,
187 $ tsize = ldt*nbmax )
190 LOGICAL LEFT, LQUERY,
191 INTEGER I, I1, I2, I3, IB, IC, , IWT, JC, LDWORK,
192 $ lwkopt, 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,
'T' ) )
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 nb =
min( nbmax, ilaenv( 1,
'SORMQR', side // trans, m, n, k,
247 lwkopt = nw*nb + tsize
252 CALL xerbla(
'SORMQR', -info )
254 ELSE IF( lquery )
THEN
260 IF( m.EQ.0 .OR. n.EQ.0 .OR. k.EQ.0 )
THEN
267 IF( nb.GT.1 .AND. nb.LT.k )
THEN
268 IF( lwork.LT.lwkopt )
THEN
269 nb = (lwork-tsize) / ldwork
270 nbmin =
max( 2, ilaenv( 2,
'SORMQR', side // trans, m, n, k,
275 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN
279 CALL sorm2r( side, trans, m, n, k, a, lda, tau, c, ldc, work,
286 IF( ( left .AND. .NOT.notran ) .OR.
287 $ ( .NOT.left .AND. notran ) )
THEN
292 i1 = ( ( k-1 ) / nb )*nb + 1
306 ib =
min( nb, k-i+1 )
311 CALL slarft(
'Forward',
'Columnwise', nq-i+1, ib, a( i, i ),
312 $ lda, tau( i ), work( iwt ), ldt )
329 CALL slarfb( side, trans,
'Forward',
'Columnwise', mi, ni,
330 $ ib, a( i, i ), lda, work( iwt ), ldt,
331 $ c( ic, jc ), ldc, work, ldwork )
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 sormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
SORMQR
subroutine sorm2r(side, trans, m, n, k, a, lda, tau, c, ldc, work, info)
SORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sge...