169 SUBROUTINE dormlq( 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
194 INTEGER i, i1, i2, i3, ib, ic, iinfo, iws, jc, ldwork,
195 $ lwkopt, mi, nb, nbmin, ni, nq, nw
198 DOUBLE PRECISION t( ldt, nbmax )
216 left =
lsame( side,
'L' )
217 notran =
lsame( trans,
'N' )
218 lquery = ( lwork.EQ.-1 )
229 IF( .NOT.left .AND. .NOT.
lsame( side,
'R' ) )
THEN
231 ELSE IF( .NOT.notran .AND. .NOT.
lsame( trans,
'T' ) )
THEN
233 ELSE IF( m.LT.0 )
THEN
235 ELSE IF( n.LT.0 )
THEN
237 ELSE IF( k.LT.0 .OR. k.GT.nq )
THEN
239 ELSE IF( lda.LT.max( 1, k ) )
THEN
241 ELSE IF( ldc.LT.max( 1, m ) )
THEN
243 ELSE IF( lwork.LT.max( 1, nw ) .AND. .NOT.lquery )
THEN
252 nb = min( nbmax,
ilaenv( 1,
'DORMLQ', side // trans, m, n, k,
254 lwkopt = max( 1, nw )*nb
259 CALL
xerbla(
'DORMLQ', -info )
261 ELSE IF( lquery )
THEN
267 IF( m.EQ.0 .OR. n.EQ.0 .OR. k.EQ.0 )
THEN
274 IF( nb.GT.1 .AND. nb.LT.k )
THEN
276 IF( lwork.LT.iws )
THEN
278 nbmin = max( 2,
ilaenv( 2,
'DORMLQ', side // trans, m, n, k,
285 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN
289 CALL
dorml2( side, trans, m, n, k, a, lda, tau, c, ldc, work,
295 IF( ( left .AND. notran ) .OR.
296 $ ( .NOT.left .AND. .NOT.notran ) )
THEN
301 i1 = ( ( k-1 ) / nb )*nb + 1
321 ib = min( nb, k-i+1 )
326 CALL
dlarft(
'Forward',
'Rowwise', nq-i+1, ib, a( i, i ),
327 $ lda, tau( i ), t, ldt )
344 CALL
dlarfb( side, transt,
'Forward',
'Rowwise', mi, ni, ib,
345 $ a( i, i ), lda, t, ldt, c( ic, jc ), ldc, work,
subroutine dorml2(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
DORML2 multiplies a general matrix by the orthogonal matrix from a LQ factorization determined by sge...
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 xerbla(SRNAME, INFO)
XERBLA
subroutine dormlq(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMLQ
logical function lsame(CA, CB)
LSAME
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)