185 SUBROUTINE sormrz( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC,
186 $ WORK, LWORK, INFO )
193 CHARACTER SIDE, TRANS
194 INTEGER INFO, K, L, LDA, LDC, LWORK, M, N
197 REAL A( lda, * ), C( ldc, * ), TAU( * ), WORK( * )
203 INTEGER NBMAX, LDT, TSIZE
204 parameter( nbmax = 64, ldt = nbmax+1,
205 $ tsize = ldt*nbmax )
208 LOGICAL LEFT, LQUERY, NOTRAN
210 INTEGER I, I1, I2, I3, IB, IC, IINFO, IWT, JA, JC,
211 $ ldwork, lwkopt, mi, nb, nbmin, ni, nq, nw
216 EXTERNAL lsame, ilaenv
229 left = lsame( side,
'L' )
230 notran = lsame( trans,
'N' )
231 lquery = ( lwork.EQ.-1 )
242 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN 244 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) )
THEN 246 ELSE IF( m.LT.0 )
THEN 248 ELSE IF( n.LT.0 )
THEN 250 ELSE IF( k.LT.0 .OR. k.GT.nq )
THEN 252 ELSE IF( l.LT.0 .OR. ( left .AND. ( l.GT.m ) ) .OR.
253 $ ( .NOT.left .AND. ( l.GT.n ) ) )
THEN 255 ELSE IF( lda.LT.max( 1, k ) )
THEN 257 ELSE IF( ldc.LT.max( 1, m ) )
THEN 259 ELSE IF( lwork.LT.nw .AND. .NOT.lquery )
THEN 267 IF( m.EQ.0 .OR. n.EQ.0 )
THEN 270 nb = min( nbmax, ilaenv( 1,
'SORMRQ', side // trans, m, n,
272 lwkopt = nw*nb + tsize
278 CALL xerbla(
'SORMRZ', -info )
280 ELSE IF( lquery )
THEN 286 IF( m.EQ.0 .OR. n.EQ.0 )
THEN 292 IF( nb.GT.1 .AND. nb.LT.k )
THEN 293 IF( lwork.LT.lwkopt )
THEN 294 nb = (lwork-tsize) / ldwork
295 nbmin = max( 2, ilaenv( 2,
'SORMRQ', side // trans, m, n, k,
300 IF( nb.LT.nbmin .OR. nb.GE.k )
THEN 304 CALL sormr3( side, trans, m, n, k, l, a, lda, tau, c, ldc,
311 IF( ( left .AND. .NOT.notran ) .OR.
312 $ ( .NOT.left .AND. notran ) )
THEN 317 i1 = ( ( k-1 ) / nb )*nb + 1
339 ib = min( nb, k-i+1 )
344 CALL slarzt(
'Backward',
'Rowwise', l, ib, a( i, ja ), lda,
345 $ tau( i ), work( iwt ), ldt )
363 CALL slarzb( side, transt,
'Backward',
'Rowwise', mi, ni,
364 $ ib, l, a( i, ja ), lda, work( iwt ), ldt,
365 $ c( ic, jc ), ldc, work, ldwork )
subroutine sormrz(SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMRZ
subroutine slarzb(SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V, LDV, T, LDT, C, LDC, WORK, LDWORK)
SLARZB applies a block reflector or its transpose to a general matrix.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slarzt(DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT)
SLARZT forms the triangular factor T of a block reflector H = I - vtvH.
subroutine sormr3(SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC, WORK, INFO)
SORMR3 multiplies a general matrix by the orthogonal matrix from a RZ factorization determined by stz...