161 SUBROUTINE sorm22( SIDE, TRANS, M, N, N1, N2, Q, LDQ, C, LDC,
162 $ WORK, LWORK, INFO )
171 CHARACTER SIDE, TRANS
172 INTEGER , N, N1, N2, LDQ, LDC, LWORK, INFO
175 REAL Q( LDQ, * ), C( LDC, * ), WORK( * )
182 parameter( one = 1.0e+0 )
185 LOGICAL LEFT, LQUERY, NOTRAN
186 INTEGER I, LDWORK, LEN, LWKOPT, , 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 ) = real( lwkopt )
244 CALL xerbla(
'SORM22', -info )
246 ELSE IF( lquery )
THEN
252 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
260 CALL strmm( side,
'Upper', trans,
'Non-Unit', m, n, one,
264 ELSE IF( n2.EQ.0 )
THEN
265 CALL strmm( 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 slacpy(
'All', n1, len, c( n2+1, i ), ldc, work,
285 CALL strmm(
'Left',
'Lower',
'No Transpose',
'Non-Unit',
291 CALL sgemm(
'No Transpose',
'No Transpose', n1, len, n2,
292 $ one, q, ldq, c( 1, i ), ldc, one, work,
297 CALL slacpy(
'All', n2, len, c( 1, i ), ldc,
298 $ work( n1+1 ), ldwork )
299 CALL strmm(
'Left',
'Upper',
'No Transpose',
'Non-Unit',
300 $ n2, len, one, q( n1+1, 1 ), ldq,
301 $ work( n1+1 ), ldwork )
305 CALL sgemm(
'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 slacpy(
'All', m, len, work, ldwork, c( 1, i ),
316 len =
min( nb, n-i+1 )
321 CALL slacpy(
'All', n2, len, c( n1+1, i ), ldc, work,
323 CALL strmm(
'Left',
'Upper',
'Transpose',
'Non-Unit',
324 $ n2, len, one, q( n1+1, 1 ), ldq, work,
329 CALL sgemm(
'Transpose',
'No Transpose', n2, len, n1,
330 $ one, q, ldq, c( 1, i ), ldc, one, work,
335 CALL slacpy(
'All', n1, len, c( 1, i ), ldc,
336 $ work( n2+1 ), ldwork )
337 CALL strmm(
'Left',
'Lower',
'Transpose',
'Non-Unit',
338 $ n1, len, one, q( 1, n2+1 ), ldq,
343 CALL sgemm(
'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 slacpy(
'All', m, len, work, ldwork, c( 1, i ),
356 len =
min( nb, m-i+1 )
361 CALL slacpy(
'All', len, n2, c( i, n1+1 ), ldc, work,
363 CALL strmm(
'Right', 'upper
', 'no transpose
', 'non-unit
',
364 $ LEN, N2, ONE, Q( N1+1, 1 ), LDQ, WORK,
369 CALL SGEMM( 'no transpose
', 'no transpose
', LEN, N2, N1,
370 $ ONE, C( I, 1 ), LDC, Q, LDQ, ONE, WORK,
375 CALL SLACPY( 'all
', LEN, N1, C( I, 1 ), LDC,
376 $ WORK( 1 + N2*LDWORK ), LDWORK )
377 CALL STRMM( 'right
', 'lower
', 'no transpose
', 'non-unit
',
378 $ LEN, N1, ONE, Q( 1, N2+1 ), LDQ,
379 $ WORK( 1 + N2*LDWORK ), LDWORK )
383 CALL SGEMM( '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 SLACPY( 'all
', LEN, N, WORK, LDWORK, C( I, 1 ),
394 LEN = MIN( NB, M-I+1 )
399 CALL SLACPY( 'all
', LEN, N1, C( I, N2+1 ), LDC, WORK,
401 CALL STRMM( 'right
', 'lower
', 'transpose
', 'non-unit
',
402 $ LEN, N1, ONE, Q( 1, N2+1 ), LDQ, WORK,
407 CALL SGEMM( 'no transpose
', 'transpose
', LEN, N1, N2,
408 $ ONE, C( I, 1 ), LDC, Q, LDQ, ONE, WORK,
413 CALL SLACPY( 'all
', LEN, N2, C( I, 1 ), LDC,
414 $ WORK( 1 + N1*LDWORK ), LDWORK )
415 CALL STRMM( 'right
', 'upper',
'Transpose',
'Non-Unit',
416 $ len, n2, one, q( n1+1, 1 ), ldq,
417 $ work( 1 + n1*ldwork ), ldwork )
421 CALL sgemm(
'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 slacpy(
'All', len, n, work, ldwork, c( i, 1 ),
433 work( 1 ) = real( lwkopt )