169 SUBROUTINE dormqr( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
170 $ work, lwork, info )
178 CHARACTER SIDE, TRANS
179 INTEGER INFO, K, LDA, LDC, LWORK, M, N
182 DOUBLE PRECISION A( lda, * ), C( ldc, * ), TAU( * ), WORK( * )
189 parameter( nbmax = 64, ldt = nbmax+1 )
192 LOGICAL LEFT, LQUERY, NOTRAN
193 INTEGER I, I1, I2, I3, IB, IC, IINFO, IWS, JC, LDWORK,
194 $ lwkopt, mi, nb, nbmin, ni, nq, nw
197 DOUBLE PRECISION T( ldt, nbmax )
202 EXTERNAL lsame, ilaenv
215 left = lsame( side,
'L' )
216 notran = lsame( trans,
'N' )
217 lquery = ( lwork.EQ.-1 )
228 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN
230 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) )
THEN
232 ELSE IF( m.LT.0 )
THEN
234 ELSE IF( n.LT.0 )
THEN
236 ELSE IF( k.LT.0 .OR. k.GT.nq )
THEN
238 ELSE IF( lda.LT.max( 1, nq ) )
THEN
240 ELSE IF( ldc.LT.max( 1, m ) )
THEN
242 ELSE IF( lwork.LT.max( 1, nw ) .AND. .NOT.lquery )
THEN
251 nb = min( nbmax, ilaenv( 1,
'DORMQR', side // trans, m, n, k,
253 lwkopt = max( 1, nw )*nb
258 CALL
xerbla(
'DORMQR', -info )
260 ELSE IF( lquery )
THEN
266 IF( m.EQ.0 .OR. n.EQ.0 .OR. k.EQ.0 )
THEN
273 IF( nb.GT.1 .AND. nb.LT.k )
THEN
275 IF( lwork.LT.iws )
THEN
277 nbmin = max( 2, ilaenv( 2,
'DORMQR', side // trans, m, n, k,
284 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN
288 CALL
dorm2r( side, trans, m, n, k, a, lda, tau, c, ldc, work,
294 IF( ( left .AND. .NOT.notran ) .OR.
295 $ ( .NOT.left .AND. notran ) )
THEN
300 i1 = ( ( k-1 ) / nb )*nb + 1
314 ib = min( nb, k-i+1 )
319 CALL
dlarft(
'Forward',
'Columnwise', nq-i+1, ib, a( i, i ),
320 $ lda, tau( i ), t, ldt )
337 CALL
dlarfb( side, trans,
'Forward',
'Columnwise', mi, ni,
338 $ ib, a( i, i ), lda, t, ldt, c( ic, jc ), ldc,
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 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 dormqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMQR
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dorm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
DORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sge...