161 SUBROUTINE dorm22( SIDE, TRANS, M, N, N1, N2, Q, LDQ, C, LDC,
162 $ WORK, LWORK, INFO )
171 CHARACTER SIDE, TRANS
172 INTEGER M, N, N1, N2, LDQ, LDC, LWORK, INFO
175 DOUBLE PRECISION Q( LDQ, * ), C( LDC, * ), WORK( * )
182 parameter( one = 1.0d+0 )
185 LOGICAL LEFT, LQUERY, NOTRAN
186 INTEGER I, LDWORK, LEN, LWKOPT, NB, NQ, NW
203 left = lsame( side,
'L' )
204 notran = lsame( trans,
'N' )
205 lquery = ( lwork.EQ.-1 )
216 IF( n1.EQ.0 .OR. n2.EQ.0 ) nw = 1
217 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN
219 ELSE IF( .NOT.lsame( trans,
'N' ) .AND. .NOT.lsame( trans,
'T' ) )
222 ELSE IF( m.LT.0 )
THEN
224 ELSE IF( n.LT.0 )
THEN
226 ELSE IF( n1.LT.0 .OR. n1+n2.NE.nq )
THEN
228 ELSE IF( n2.LT.0 )
THEN
230 ELSE IF( ldq.LT.
max( 1, nq ) )
THEN
232 ELSE IF( ldc.LT.
max( 1, m ) )
THEN
234 ELSE IF( lwork.LT.nw .AND. .NOT.lquery )
THEN
240 work( 1 ) = dble( lwkopt )
244 CALL xerbla(
'DORM22', -info )
246 ELSE IF( lquery )
THEN
252 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
260 CALL dtrmm( side,
'Upper', trans,
'Non-Unit', m, n, one,
264 ELSE IF( n2.EQ.0 )
THEN
265 CALL dtrmm( side,
'Lower', trans,
'Non-Unit', m, n, one,
273 nb =
max( 1,
min( lwork, lwkopt ) / nq )
278 len =
min( nb, n-i+1 )
283 CALL dlacpy(
'All', n1, len, c( n2+1, i ), ldc, work,
285 CALL dtrmm(
'Left',
'Lower',
'No Transpose',
'Non-Unit',
286 $ n1, len, one, q( 1, n2+1 ), ldq, work,
291 CALL dgemm(
'No Transpose',
'No Transpose', n1, len, n2,
292 $ one, q, ldq, c( 1, i ), ldc, one, work,
297 CALL dlacpy(
'All', n2, len, c( 1, i ), ldc,
298 $ work( n1+1 ), ldwork )
299 CALL dtrmm(
'Left',
'Upper',
'No Transpose',
'Non-Unit',
300 $ n2, len, one, q( n1+1, 1 ), ldq,
301 $ work( n1+1 ), ldwork )
305 CALL dgemm(
'No Transpose',
'No Transpose', n2, len, n1,
306 $ one, q( n1+1, n2+1 ), ldq, c( n2+1, i ), ldc,
307 $ one, work( n1+1 ), ldwork )
311 CALL dlacpy(
'All', m, len, work, ldwork, c( 1, i ),
316 len =
min( nb, n-i+1 )
321 CALL dlacpy(
'All', n2, len, c( n1+1, i ), ldc, work,
323 CALL dtrmm(
'Left',
'Upper',
'Transpose',
'Non-Unit',
324 $ n2, len, one, q( n1+1, 1 ), ldq, work,
329 CALL dgemm(
'Transpose',
'No Transpose', n2, len, n1,
335 CALL dlacpy(
'All', n1, len, c( 1, i ), ldc,
336 $ work( n2+1 ), ldwork )
337 CALL dtrmm(
'Left',
'Lower',
'Transpose',
'Non-Unit',
338 $ n1, len, one, q( 1, n2+1 ), ldq,
339 $ work( n2+1 ), ldwork )
343 CALL dgemm(
'Transpose',
'No Transpose', n1, len, n2,
344 $ one, q( n1+1, n2+1 ), ldq, c( n1+1, i ), ldc,
345 $ one, work( n2+1 ), ldwork )
349 CALL dlacpy(
'All', m, len, work, ldwork, c( 1, i ),
356 len =
min( nb, m-i+1 )
361 CALL dlacpy(
'All', len, n2, c( i, n1+1 ), ldc, work,
363 CALL dtrmm(
'Right',
'Upper',
'No Transpose',
'Non-Unit',
364 $ len, n2, one, q( n1+1, 1 ), ldq, work,
369 CALL dgemm( 'no transpose
', 'no transpose
', LEN, N2, N1,
370 $ ONE, C( I, 1 ), LDC, Q, LDQ, ONE, WORK,
375 CALL DLACPY( 'all
', LEN, N1, C( I, 1 ), LDC,
376 $ WORK( 1 + N2*LDWORK ), LDWORK )
377 CALL DTRMM( 'right
', 'lower
', 'no transpose
', 'non-unit
',
378 $ LEN, N1, ONE, Q( 1, N2+1 ), LDQ,
379 $ WORK( 1 + N2*LDWORK ), LDWORK )
383 CALL DGEMM( 'no transpose
', 'no transpose
', LEN, N1, N2,
384 $ ONE, C( I, N1+1 ), LDC, Q( N1+1, N2+1 ), LDQ,
385 $ ONE, WORK( 1 + N2*LDWORK ), LDWORK )
389 CALL DLACPY( 'all
', LEN, N, WORK, LDWORK, C( I, 1 ),
394 LEN = MIN( NB, M-I+1 )
399 CALL DLACPY( 'all
', LEN, N1, C( I, N2+1 ), LDC, WORK,
401 CALL DTRMM( 'right
', 'lower
', 'transpose
', 'non-unit
',
402 $ LEN, N1, ONE, Q( 1, N2+1 ), LDQ, WORK,
407 CALL DGEMM( 'no transpose
', 'transpose
', LEN, N1, N2,
408 $ ONE, C( I, 1 ), LDC, Q, LDQ, ONE, WORK,
413 CALL DLACPY( 'all
', LEN, N2, C( I, 1 ), LDC,
414 $ WORK( 1 + N1*LDWORK ), LDWORK )
415 CALL DTRMM( 'right
', 'upper
', 'transpose
', 'non-unit
',
416 $ LEN, N2, ONE, Q( N1+1, 1 ), LDQ,
417 $ WORK( 1 + N1*LDWORK ), LDWORK )
421 CALL DGEMM( 'no transpose
', 'transpose
', LEN, N2, N1,
422 $ ONE, C( I, N2+1 ), LDC, Q( N1+1, N2+1 ), LDQ,
423 $ ONE, WORK( 1 + N1*LDWORK ), LDWORK )
427 CALL DLACPY( 'all
', LEN, N, WORK, LDWORK, C( I, 1 ),
433 WORK( 1 ) = DBLE( LWKOPT )