160 SUBROUTINE zunm22( SIDE, TRANS, M, N, N1, N2, Q, LDQ, C, LDC,
161 $ WORK, LWORK, INFO )
170 CHARACTER SIDE, TRANS
171 INTEGER M, N, , N2, , LDC, LWORK,
174 COMPLEX*16 Q( LDQ, * ), C( LDC, * ), WORK( * )
181 parameter( one = ( 1.0d+0, 0.0d+0 ) )
184 LOGICAL LEFT, LQUERY, NOTRAN
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
', N1, LEN, N2,
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,
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,
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 )