195 SUBROUTINE zlarfb( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
196 $ t, ldt, c, ldc, work, ldwork )
204 CHARACTER direct, side, storev, trans
205 INTEGER k, ldc, ldt, ldv, ldwork, m, n
208 COMPLEX*16 c( ldc, * ), t( ldt, * ), v( ldv, * ),
216 parameter( one = ( 1.0d+0, 0.0d+0 ) )
220 INTEGER i, j, lastv, lastc
237 IF( m.LE.0 .OR. n.LE.0 )
240 IF(
lsame( trans,
'N' ) )
THEN
246 IF(
lsame( storev,
'C' ) )
THEN
248 IF(
lsame( direct,
'F' ) )
THEN
254 IF(
lsame( side,
'L' ) )
THEN
259 lastv = max( k,
ilazlr( m, k, v, ldv ) )
260 lastc =
ilazlc( lastv, n, c, ldc )
267 CALL
zcopy( lastc, c( j, 1 ), ldc, work( 1, j ), 1 )
268 CALL
zlacgv( lastc, work( 1, j ), 1 )
273 CALL
ztrmm(
'Right',
'Lower',
'No transpose',
'Unit',
274 $ lastc, k, one, v, ldv, work, ldwork )
275 IF( lastv.GT.k )
THEN
279 CALL
zgemm(
'Conjugate transpose',
'No transpose',
280 $ lastc, k, lastv-k, one, c( k+1, 1 ), ldc,
281 $ v( k+1, 1 ), ldv, one, work, ldwork )
286 CALL
ztrmm(
'Right',
'Upper', transt,
'Non-unit',
287 $ lastc, k, one, t, ldt, work, ldwork )
295 CALL
zgemm(
'No transpose',
'Conjugate transpose',
297 $ -one, v( k+1, 1 ), ldv, work, ldwork,
298 $ one, c( k+1, 1 ), ldc )
303 CALL
ztrmm(
'Right',
'Lower',
'Conjugate transpose',
304 $
'Unit', lastc, k, one, v, ldv, work, ldwork )
310 c( j, i ) = c( j, i ) - dconjg( work( i, j ) )
314 ELSE IF(
lsame( side,
'R' ) )
THEN
318 lastv = max( k,
ilazlr( n, k, v, ldv ) )
319 lastc =
ilazlr( m, lastv, c, ldc )
326 CALL
zcopy( lastc, c( 1, j ), 1, work( 1, j ), 1 )
331 CALL
ztrmm(
'Right',
'Lower',
'No transpose',
'Unit',
332 $ lastc, k, one, v, ldv, work, ldwork )
333 IF( lastv.GT.k )
THEN
337 CALL
zgemm(
'No transpose',
'No transpose',
339 $ one, c( 1, k+1 ), ldc, v( k+1, 1 ), ldv,
340 $ one, work, ldwork )
345 CALL
ztrmm(
'Right',
'Upper', trans,
'Non-unit',
346 $ lastc, k, one, t, ldt, work, ldwork )
350 IF( lastv.GT.k )
THEN
354 CALL
zgemm(
'No transpose',
'Conjugate transpose',
356 $ -one, work, ldwork, v( k+1, 1 ), ldv,
357 $ one, c( 1, k+1 ), ldc )
362 CALL
ztrmm(
'Right',
'Lower',
'Conjugate transpose',
363 $
'Unit', lastc, k, one, v, ldv, work, ldwork )
369 c( i, j ) = c( i, j ) - work( i, j )
380 IF(
lsame( side,
'L' ) )
THEN
385 lastv = max( k,
ilazlr( m, k, v, ldv ) )
386 lastc =
ilazlc( lastv, n, c, ldc )
393 CALL
zcopy( lastc, c( lastv-k+j, 1 ), ldc,
395 CALL
zlacgv( lastc, work( 1, j ), 1 )
400 CALL
ztrmm(
'Right',
'Upper',
'No transpose',
'Unit',
401 $ lastc, k, one, v( lastv-k+1, 1 ), ldv,
403 IF( lastv.GT.k )
THEN
407 CALL
zgemm(
'Conjugate transpose',
'No transpose',
409 $ one, c, ldc, v, ldv,
410 $ one, work, ldwork )
415 CALL
ztrmm(
'Right',
'Lower', transt,
'Non-unit',
416 $ lastc, k, one, t, ldt, work, ldwork )
420 IF( lastv.GT.k )
THEN
424 CALL
zgemm(
'No transpose',
'Conjugate transpose',
426 $ -one, v, ldv, work, ldwork,
432 CALL
ztrmm(
'Right',
'Upper',
'Conjugate transpose',
433 $
'Unit', lastc, k, one, v( lastv-k+1, 1 ), ldv,
440 c( lastv-k+j, i ) = c( lastv-k+j, i ) -
441 $ dconjg( work( i, j ) )
445 ELSE IF(
lsame( side,
'R' ) )
THEN
449 lastv = max( k,
ilazlr( n, k, v, ldv ) )
450 lastc =
ilazlr( m, lastv, c, ldc )
457 CALL
zcopy( lastc, c( 1, lastv-k+j ), 1,
463 CALL
ztrmm(
'Right',
'Upper',
'No transpose',
'Unit',
464 $ lastc, k, one, v( lastv-k+1, 1 ), ldv,
466 IF( lastv.GT.k )
THEN
470 CALL
zgemm(
'No transpose',
'No transpose',
472 $ one, c, ldc, v, ldv, one, work, ldwork )
477 CALL
ztrmm(
'Right',
'Lower', trans,
'Non-unit',
478 $ lastc, k, one, t, ldt, work, ldwork )
482 IF( lastv.GT.k )
THEN
486 CALL
zgemm(
'No transpose',
'Conjugate transpose',
487 $ lastc, lastv-k, k, -one, work, ldwork, v, ldv,
493 CALL
ztrmm(
'Right',
'Upper',
'Conjugate transpose',
494 $
'Unit', lastc, k, one, v( lastv-k+1, 1 ), ldv,
501 c( i, lastv-k+j ) = c( i, lastv-k+j )
508 ELSE IF(
lsame( storev,
'R' ) )
THEN
510 IF(
lsame( direct,
'F' ) )
THEN
515 IF(
lsame( side,
'L' ) )
THEN
520 lastv = max( k,
ilazlc( k, m, v, ldv ) )
521 lastc =
ilazlc( lastv, n, c, ldc )
528 CALL
zcopy( lastc, c( j, 1 ), ldc, work( 1, j ), 1 )
529 CALL
zlacgv( lastc, work( 1, j ), 1 )
534 CALL
ztrmm(
'Right',
'Upper',
'Conjugate transpose',
535 $
'Unit', lastc, k, one, v, ldv, work, ldwork )
536 IF( lastv.GT.k )
THEN
540 CALL
zgemm(
'Conjugate transpose',
541 $
'Conjugate transpose', lastc, k, lastv-k,
542 $ one, c( k+1, 1 ), ldc, v( 1, k+1 ), ldv,
543 $ one, work, ldwork )
548 CALL
ztrmm(
'Right',
'Upper', transt,
'Non-unit',
549 $ lastc, k, one, t, ldt, work, ldwork )
553 IF( lastv.GT.k )
THEN
557 CALL
zgemm(
'Conjugate transpose',
558 $
'Conjugate transpose', lastv-k, lastc, k,
559 $ -one, v( 1, k+1 ), ldv, work, ldwork,
560 $ one, c( k+1, 1 ), ldc )
565 CALL
ztrmm(
'Right',
'Upper',
'No transpose',
'Unit',
566 $ lastc, k, one, v, ldv, work, ldwork )
572 c( j, i ) = c( j, i ) - dconjg( work( i, j ) )
576 ELSE IF(
lsame( side,
'R' ) )
THEN
580 lastv = max( k,
ilazlc( k, n, v, ldv ) )
581 lastc =
ilazlr( m, lastv, c, ldc )
588 CALL
zcopy( lastc, c( 1, j ), 1, work( 1, j ), 1 )
593 CALL
ztrmm(
'Right',
'Upper',
'Conjugate transpose',
594 $
'Unit', lastc, k, one, v, ldv, work, ldwork )
595 IF( lastv.GT.k )
THEN
599 CALL
zgemm(
'No transpose',
'Conjugate transpose',
600 $ lastc, k, lastv-k, one, c( 1, k+1 ), ldc,
601 $ v( 1, k+1 ), ldv, one, work, ldwork )
606 CALL
ztrmm(
'Right',
'Upper', trans,
'Non-unit',
607 $ lastc, k, one, t, ldt, work, ldwork )
611 IF( lastv.GT.k )
THEN
615 CALL
zgemm(
'No transpose',
'No transpose',
617 $ -one, work, ldwork, v( 1, k+1 ), ldv,
618 $ one, c( 1, k+1 ), ldc )
623 CALL
ztrmm(
'Right',
'Upper',
'No transpose',
'Unit',
624 $ lastc, k, one, v, ldv, work, ldwork )
630 c( i, j ) = c( i, j ) - work( i, j )
641 IF(
lsame( side,
'L' ) )
THEN
646 lastv = max( k,
ilazlc( k, m, v, ldv ) )
647 lastc =
ilazlc( lastv, n, c, ldc )
654 CALL
zcopy( lastc, c( lastv-k+j, 1 ), ldc,
656 CALL
zlacgv( lastc, work( 1, j ), 1 )
661 CALL
ztrmm(
'Right',
'Lower',
'Conjugate transpose',
662 $
'Unit', lastc, k, one, v( 1, lastv-k+1 ), ldv,
664 IF( lastv.GT.k )
THEN
668 CALL
zgemm(
'Conjugate transpose',
669 $
'Conjugate transpose', lastc, k, lastv-k,
670 $ one, c, ldc, v, ldv, one, work, ldwork )
675 CALL
ztrmm(
'Right',
'Lower', transt,
'Non-unit',
676 $ lastc, k, one, t, ldt, work, ldwork )
680 IF( lastv.GT.k )
THEN
684 CALL
zgemm(
'Conjugate transpose',
685 $
'Conjugate transpose', lastv-k, lastc, k,
686 $ -one, v, ldv, work, ldwork, one, c, ldc )
691 CALL
ztrmm(
'Right',
'Lower',
'No transpose',
'Unit',
692 $ lastc, k, one, v( 1, lastv-k+1 ), ldv,
699 c( lastv-k+j, i ) = c( lastv-k+j, i ) -
700 $ dconjg( work( i, j ) )
704 ELSE IF(
lsame( side,
'R' ) )
THEN
708 lastv = max( k,
ilazlc( k, n, v, ldv ) )
709 lastc =
ilazlr( m, lastv, c, ldc )
716 CALL
zcopy( lastc, c( 1, lastv-k+j ), 1,
722 CALL
ztrmm(
'Right',
'Lower',
'Conjugate transpose',
723 $
'Unit', lastc, k, one, v( 1, lastv-k+1 ), ldv,
725 IF( lastv.GT.k )
THEN
729 CALL
zgemm(
'No transpose',
'Conjugate transpose',
730 $ lastc, k, lastv-k, one, c, ldc, v, ldv, one,
736 CALL
ztrmm(
'Right',
'Lower', trans,
'Non-unit',
737 $ lastc, k, one, t, ldt, work, ldwork )
741 IF( lastv.GT.k )
THEN
745 CALL
zgemm(
'No transpose',
'No transpose',
746 $ lastc, lastv-k, k, -one, work, ldwork, v, ldv,
752 CALL
ztrmm(
'Right',
'Lower',
'No transpose',
'Unit',
753 $ lastc, k, one, v( 1, lastv-k+1 ), ldv,
760 c( i, lastv-k+j ) = c( i, lastv-k+j )