160 SUBROUTINE zunm22( SIDE, TRANS, M, N, N1, N2, Q, LDQ, C, LDC,
161 $ WORK, LWORK, INFO )
170 CHARACTER SIDE, TRANS
171 INTEGER M, , N1, N2, LDQ, LDC, LWORK, INFO
174 COMPLEX*16 Q( LDQ, * ), C( LDC, * ), WORK( * )
181 parameter( one = ( 1.0d+0, 0.0d+0 ) )
184 LOGICAL LEFT, LQUERY, NOTRAN
185 INTEGER I, LDWORK, LEN, LWKOPT, NB, NQ, NW
195 INTRINSIC dcmplx,
max,
min
202 left = lsame( side,
'L' )
203 notran = lsame( trans,
'N' )
204 lquery = ( lwork.EQ.-1 )
215 IF( n1.EQ.0 .OR. n2.EQ.0 ) nw = 1
216 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN
218 ELSE IF( .NOT.lsame( trans,
'N' ) .AND. .NOT.lsame( trans,
'C' ) )
221 ELSE IF( m.LT.0 )
THEN
223 ELSE IF( n.LT.0 )
THEN
225 ELSE IF( n1.LT.0 .OR. n1+n2.NE.nq )
THEN
227 ELSE IF( n2.LT.0 )
THEN
229 ELSE IF( ldq.LT.
max( 1, nq ) )
THEN
231 ELSE IF( ldc.LT.
max( 1, m ) )
THEN
233 ELSE IF( lwork.LT.nw .AND. .NOT.lquery )
THEN
239 work( 1 ) = dcmplx( lwkopt )
243 CALL xerbla(
'ZUNM22', -info )
245 ELSE IF( lquery )
THEN
251 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
259 CALL ztrmm( side,
'Upper', trans,
'Non-Unit', m, n, one,
263 ELSE IF( n2.EQ.0 )
THEN
264 CALL ztrmm( side,
'Lower', trans,
'Non-Unit', m, n, one,
272 nb =
max( 1,
min( lwork, lwkopt ) / nq )
277 len =
min( nb, n-i+1 )
282 CALL zlacpy(
'All', n1, len, c( n2+1, i ), ldc, work,
284 CALL ztrmm(
'Left',
'Lower',
'No Transpose',
'Non-Unit',
285 $ n1, len, one, q( 1, n2+1 ), ldq, work,
290 CALL zgemm(
'No Transpose',
'No Transpose', n1, len, n2,
291 $ one, q, ldq, c( 1, i ), ldc, one, work,
296 CALL zlacpy(
'All', n2, len, c( 1, i ), ldc,
297 $ work( n1+1 ), ldwork )
298 CALL ztrmm(
'Left',
'Upper',
'No Transpose',
'Non-Unit',
299 $ n2, len, one, q( n1+1, 1 ), ldq,
300 $ work( n1+1 ), ldwork )
304 CALL zgemm(
'No Transpose',
'No Transpose', n2, len, n1,
305 $ one, q( n1+1, n2+1 ), ldq, c( n2+1, i ), ldc,
306 $ one, work( n1+1 ), ldwork )
310 CALL zlacpy(
'All', m, len, work, ldwork, c( 1, i ),
315 len =
min( nb, n-i+1 )
320 CALL zlacpy(
'All', n2, len, c( n1+1, i ), ldc, work,
322 CALL ztrmm(
'Left',
'Upper',
'Conjugate',
'Non-Unit',
323 $ n2, len, one, q( n1+1, 1 ), ldq, work,
328 CALL zgemm(
'Conjugate',
'No Transpose', n2, len, n1,
329 $ one, q, ldq, c( 1, i ), ldc, one, work,
334 CALL zlacpy(
'All', n1, len, c( 1, i ), ldc,
335 $ work( n2+1 ), ldwork )
336 CALL ztrmm(
'Left',
'Lower',
'Conjugate',
'Non-Unit',
337 $ n1, len, one, q( 1, n2+1 ), ldq,
338 $ work( n2+1 ), ldwork )
342 CALL zgemm(
'Conjugate',
'No Transpose'
343 $ one, q( n1+1, n2+1 ), ldq, c( n1+1, i ), ldc,
344 $ one, work( n2+1 ), ldwork )
348 CALL zlacpy(
'All', m, len, work, ldwork, c( 1, i ),
355 len =
min( nb, m-i+1 )
360 CALL zlacpy(
'All', len, n2, c( i, n1+1 ), ldc, work,
362 CALL ztrmm(
'Right',
'Upper',
'No Transpose',
'Non-Unit',
363 $ len, n2, one, q( n1+1, 1 ), ldq, work,
368 CALL zgemm( 'no transpose
', 'no transpose
', LEN, N2, N1,
369 $ ONE, C( I, 1 ), LDC, Q, LDQ, ONE, WORK,
374 CALL ZLACPY( 'all
', LEN, N1, C( I, 1 ), LDC,
375 $ WORK( 1 + N2*LDWORK ), LDWORK )
376 CALL ZTRMM( 'right
', 'lower
', 'no transpose
', 'non-unit
',
377 $ LEN, N1, ONE, Q( 1, N2+1 ), LDQ,
378 $ WORK( 1 + N2*LDWORK ), LDWORK )
382 CALL ZGEMM( 'no transpose
', 'no transpose
', LEN, N1, N2,
383 $ ONE, C( I, N1+1 ), LDC, Q( N1+1, N2+1 ), LDQ,
384 $ ONE, WORK( 1 + N2*LDWORK ), LDWORK )
388 CALL ZLACPY( 'all
', LEN, N, WORK, LDWORK, C( I, 1 ),
393 LEN = MIN( NB, M-I+1 )
398 CALL ZLACPY( 'all
', LEN, N1, C( I, N2+1 ), LDC, WORK,
400 CALL ZTRMM( 'right
', 'lower
', 'conjugate
', 'non-unit
',
401 $ LEN, N1, ONE, Q( 1, N2+1 ), LDQ, WORK,
406 CALL ZGEMM( 'no transpose
', 'conjugate
', LEN, N1, N2,
407 $ ONE, C( I, 1 ), LDC, Q, LDQ, ONE, WORK,
412 CALL ZLACPY( 'all
', LEN, N2, C( I, 1 ), LDC,
413 $ WORK( 1 + N1*LDWORK ), LDWORK )
414 CALL ZTRMM( 'right
', 'upper
', 'conjugate
', 'non-unit
',
415 $ LEN, N2, ONE, Q( N1+1, 1 ), LDQ,
416 $ WORK( 1 + N1*LDWORK ), LDWORK )
420 CALL ZGEMM( 'no transpose
', 'conjugate
', LEN, N2, N1,
421 $ ONE, C( I, N2+1 ), LDC, Q( N1+1, N2+1 ), LDQ,
422 $ ONE, WORK( 1 + N1*LDWORK ), LDWORK )
426 CALL ZLACPY( 'all
', LEN, N, WORK, LDWORK, C( I, 1 ),
432 WORK( 1 ) = DCMPLX( LWKOPT )