195 SUBROUTINE zlarfb( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
196 $ T, LDT, C, LDC, WORK, LDWORK )
203 CHARACTER , SIDE, STOREV, TRANS
204 INTEGER K, LDC, LDT, LDV, LDWORK, M, N
207 COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ),
215 parameter( one = ( 1.0d+0, 0.0d+0 ) )
235 IF( m.LE.0 .OR. n.LE.0 )
238 IF( lsame( trans,
'N' ) )
THEN
244 IF( lsame( storev,
'C' ) )
THEN
246 IF( lsame( direct,
'F' ) )
THEN
252 IF( lsame( side,
'L' ) )
THEN
262 CALL zcopy( n, c( j, 1 ), ldc, work( 1, j ), 1 )
263 CALL zlacgv( n, work( 1, j ), 1 )
268 CALL ztrmm(
'Right',
'Lower',
'No transpose',
'Unit', n,
269 $ k, one, v, ldv, work, ldwork )
274 CALL zgemm(
'Conjugate transpose',
'No transpose', n,
275 $ k, m-k, one, c( k+1, 1 ), ldc,
276 $ v( k+1, 1 ), ldv, one, work, ldwork )
281 CALL ztrmm(
'Right',
'Upper', transt,
'Non-unit', n, k,
282 $ one, t, ldt, work, ldwork )
290 CALL zgemm(
'No transpose',
'Conjugate transpose',
291 $ m-k, n, k, -one, v( k+1, 1 ), ldv, work,
292 $ ldwork, one, c( k+1, 1 ), ldc )
297 CALL ztrmm(
'Right',
'Lower',
'Conjugate transpose',
298 $
'Unit', n, k, one, v, ldv, work, ldwork )
304 c( j, i ) = c( j, i ) - dconjg( work( i, j ) )
308 ELSE IF( lsame( side,
'R' ) )
THEN
317 CALL zcopy( m, c( 1, j ), 1, work( 1, j ), 1 )
322 CALL ztrmm(
'Right',
'Lower',
'No transpose',
'Unit', m,
323 $ k, one, v, ldv, work, ldwork )
328 CALL zgemm(
'No transpose',
'No transpose', m, k, n-k,
329 $ one, c( 1, k+1 ), ldc, v( k+1, 1 ), ldv,
330 $ one, work, ldwork )
335 CALL ztrmm(
'Right',
'Upper', trans,
'Non-unit', m, k,
336 $ one, t, ldt, work, ldwork )
344 CALL zgemm(
'No transpose',
'Conjugate transpose', m,
345 $ n-k, k, -one, work, ldwork, v( k+1, 1 ),
346 $ ldv, one, c( 1, k+1 ), ldc )
351 CALL ztrmm(
'Right',
'Lower',
'Conjugate transpose',
352 $
'Unit', m, k, one, v, ldv, work, ldwork )
358 c( i, j ) = c( i, j ) - work( i, j )
369 IF( lsame( side,
'L' ) )
THEN
379 CALL zcopy( n, c( m-k+j, 1 ), ldc, work( 1, j ), 1 )
380 CALL zlacgv( n, work( 1, j ), 1 )
385 CALL ztrmm(
'Right',
'Upper',
'No transpose',
'Unit', n,
386 $ k, one, v( m-k+1, 1 ), ldv, work, ldwork )
391 CALL zgemm(
'Conjugate transpose',
'No transpose', n,
392 $ k, m-k, one, c, ldc, v, ldv, one, work,
398 CALL ztrmm(
'Right',
'Lower', transt,
'Non-unit', n, k,
399 $ one, t, ldt, work, ldwork )
407 CALL zgemm(
'No transpose',
'Conjugate transpose',
408 $ m-k, n, k, -one, v, ldv, work, ldwork,
414 CALL ztrmm(
'Right',
'Upper',
'Conjugate transpose',
415 $
'Unit', n, k, one, v( m-k+1, 1 ), ldv, work,
422 c( m-k+j, i ) = c( m-k+j, i ) -
423 $ dconjg( work( i, j ) )
427 ELSE IF( lsame( side,
'R' ) )
THEN
436 CALL zcopy( m, c( 1, n-k+j ), 1, work( 1, j ), 1 )
441 CALL ztrmm(
'Right',
'Upper',
'No transpose',
'Unit', m,
442 $ k, one, v( n-k+1, 1 ), ldv, work, ldwork )
447 CALL zgemm(
'No transpose',
'No transpose', m, k, n-k,
448 $ one, c, ldc, v, ldv, one, work, ldwork )
453 CALL ztrmm(
'Right',
'Lower', trans,
'Non-unit', m, k,
454 $ one, t, ldt, work, ldwork )
462 CALL zgemm(
'No transpose',
'Conjugate transpose', m,
463 $ n-k, k, -one, work, ldwork, v, ldv, one,
469 CALL ztrmm(
'Right',
'Upper',
'Conjugate transpose',
470 $
'Unit', m, k, one, v( n-k+1, 1 ), ldv, work,
483 ELSE IF( lsame( storev,
'R' ) )
THEN
485 IF( lsame( direct,
'F' ) )
THEN
490 IF( lsame( side,
'L' ) )
THEN
500 CALL zcopy( n, c( j, 1 ), ldc, work( 1, j ), 1 )
501 CALL zlacgv( n, work( 1, j ), 1 )
506 CALL ztrmm(
'Right',
'Upper',
'Conjugate transpose',
507 $
'Unit', n, k, one, v, ldv, work, ldwork )
512 CALL zgemm(
'Conjugate transpose',
513 $
'Conjugate transpose', n, k, m-k, one,
514 $ c( k+1, 1 ), ldc, v( 1, k+1 ), ldv, one,
520 CALL ztrmm(
'Right', 'upper
', TRANST, 'non-unit
', N, K,
521 $ ONE, T, LDT, WORK, LDWORK )
529 CALL ZGEMM( 'conjugate transpose
',
530 $ 'conjugate transpose
', M-K, N, K, -ONE,
531 $ V( 1, K+1 ), LDV, WORK, LDWORK, ONE,
537 CALL ZTRMM( 'right
', 'upper
', 'no transpose
', 'unit
', N,
538 $ K, ONE, V, LDV, WORK, LDWORK )
544 C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) )
548 ELSE IF( LSAME( SIDE, 'r
' ) ) THEN
557 CALL ZCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
562 CALL ZTRMM( 'right
', 'upper
', 'conjugate transpose
',
563 $ 'unit
', M, K, ONE, V, LDV, WORK, LDWORK )
568 CALL ZGEMM( 'no transpose
', 'conjugate transpose
', M,
569 $ K, N-K, ONE, C( 1, K+1 ), LDC,
570 $ V( 1, K+1 ), LDV, ONE, WORK, LDWORK )
575 CALL ZTRMM( 'right
', 'upper
', TRANS, 'non-unit
', M, K,
576 $ ONE, T, LDT, WORK, LDWORK )
584 CALL ZGEMM( 'no transpose
', 'no transpose
', M, N-K, K,
585 $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, ONE,
591 CALL ZTRMM( 'right
', 'upper
', 'no transpose
', 'unit
', M,
592 $ K, ONE, V, LDV, WORK, LDWORK )
598 C( I, J ) = C( I, J ) - WORK( I, J )
609 IF( LSAME( SIDE, 'l
' ) ) THEN
619 CALL ZCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
620 CALL ZLACGV( N, WORK( 1, J ), 1 )
625 CALL ZTRMM( 'right
', 'lower
', 'conjugate transpose
',
626 $ 'unit
', N, K, ONE, V( 1, M-K+1 ), LDV, WORK,
632 CALL ZGEMM( 'conjugate transpose
',
633 $ 'conjugate transpose
', N, K, M-K, ONE, C,
634 $ LDC, V, LDV, ONE, WORK, LDWORK )
639 CALL ZTRMM( 'right
', 'lower
', TRANST, 'non-unit
', N, K,
640 $ ONE, T, LDT, WORK, LDWORK )
648 CALL ZGEMM( 'conjugate transpose
',
649 $ 'conjugate transpose
', M-K, N, K, -ONE, V,
650 $ LDV, WORK, LDWORK, ONE, C, LDC )
655 CALL ZTRMM( 'right
', 'lower
', 'no transpose
', 'unit
', N,
656 $ K, ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK )
662 C( M-K+J, I ) = C( M-K+J, I ) -
663 $ DCONJG( WORK( I, J ) )
667 ELSE IF( LSAME( SIDE, 'r
' ) ) THEN
676 CALL ZCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
681 CALL ZTRMM( 'right
', 'lower
', 'conjugate transpose
',
682 $ 'unit
', M, K, ONE, V( 1, N-K+1 ), LDV, WORK,
688 CALL ZGEMM( 'no transpose
', 'conjugate transpose
', M,
689 $ K, N-K, ONE, C, LDC, V, LDV, ONE, WORK,
695 CALL ZTRMM( 'right
', 'lower
', TRANS, 'non-unit
', M, K,
696 $ ONE, T, LDT, WORK, LDWORK )
704 CALL ZGEMM( 'no transpose
', 'no transpose
', M, N-K, K,
705 $ -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC )
710 CALL ZTRMM( 'right
', 'lower
', 'no transpose
', 'unit
', M,
711 $ K, ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK )
717 C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J )