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, LDA, LDC, LWORK, M, N
178 REAL A( lda, * ), C( ldc, * ), TAU( * ),
185 INTEGER NBMAX, LDT, TSIZE
186 parameter( nbmax = 64, ldt = nbmax+1,
187 $ tsize = ldt*nbmax )
190 LOGICAL LEFT, LQUERY, NOTRAN
191 INTEGER I, I1, I2, I3, IB, IC, IINFO, 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 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...
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 sormqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMQR
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.