195 SUBROUTINE clarfb( 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 c( ldc, * ), t( ldt, * ), v( ldv, * ),
216 parameter( one = ( 1.0e+0, 0.0e+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,
ilaclr( m, k, v, ldv ) )
260 lastc =
ilaclc( lastv, n, c, ldc )
267 CALL
ccopy( lastc, c( j, 1 ), ldc, work( 1, j ), 1 )
268 CALL
clacgv( lastc, work( 1, j ), 1 )
273 CALL
ctrmm(
'Right',
'Lower',
'No transpose',
'Unit',
274 $ lastc, k, one, v, ldv, work, ldwork )
275 IF( lastv.GT.k )
THEN
279 CALL
cgemm(
'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
ctrmm(
'Right',
'Upper', transt,
'Non-unit',
287 $ lastc, k, one, t, ldt, work, ldwork )
295 CALL
cgemm(
'No transpose',
'Conjugate transpose',
296 $ lastv-k, lastc, k, -one, v( k+1, 1 ), ldv,
297 $ work, ldwork, one, c( k+1, 1 ), ldc )
302 CALL
ctrmm(
'Right',
'Lower',
'Conjugate transpose',
303 $
'Unit', lastc, k, one, v, ldv, work, ldwork )
309 c( j, i ) = c( j, i ) - conjg( work( i, j ) )
313 ELSE IF(
lsame( side,
'R' ) )
THEN
317 lastv = max( k,
ilaclr( n, k, v, ldv ) )
318 lastc =
ilaclr( m, lastv, c, ldc )
325 CALL
ccopy( lastc, c( 1, j ), 1, work( 1, j ), 1 )
330 CALL
ctrmm(
'Right',
'Lower',
'No transpose',
'Unit',
331 $ lastc, k, one, v, ldv, work, ldwork )
332 IF( lastv.GT.k )
THEN
336 CALL
cgemm(
'No transpose',
'No transpose',
338 $ one, c( 1, k+1 ), ldc, v( k+1, 1 ), ldv,
339 $ one, work, ldwork )
344 CALL
ctrmm(
'Right',
'Upper', trans,
'Non-unit',
345 $ lastc, k, one, t, ldt, work, ldwork )
349 IF( lastv.GT.k )
THEN
353 CALL
cgemm(
'No transpose',
'Conjugate transpose',
355 $ -one, work, ldwork, v( k+1, 1 ), ldv,
356 $ one, c( 1, k+1 ), ldc )
361 CALL
ctrmm(
'Right',
'Lower',
'Conjugate transpose',
362 $
'Unit', lastc, k, one, v, ldv, work, ldwork )
368 c( i, j ) = c( i, j ) - work( i, j )
379 IF(
lsame( side,
'L' ) )
THEN
384 lastv = max( k,
ilaclr( m, k, v, ldv ) )
385 lastc =
ilaclc( lastv, n, c, ldc )
392 CALL
ccopy( lastc, c( lastv-k+j, 1 ), ldc,
394 CALL
clacgv( lastc, work( 1, j ), 1 )
399 CALL
ctrmm(
'Right',
'Upper',
'No transpose',
'Unit',
400 $ lastc, k, one, v( lastv-k+1, 1 ), ldv,
402 IF( lastv.GT.k )
THEN
406 CALL
cgemm(
'Conjugate transpose',
'No transpose',
407 $ lastc, k, lastv-k, one, c, ldc, v, ldv,
408 $ one, work, ldwork )
413 CALL
ctrmm(
'Right',
'Lower', transt,
'Non-unit',
414 $ lastc, k, one, t, ldt, work, ldwork )
418 IF( lastv.GT.k )
THEN
422 CALL
cgemm(
'No transpose',
'Conjugate transpose',
423 $ lastv-k, lastc, k, -one, v, ldv, work, ldwork,
429 CALL
ctrmm(
'Right',
'Upper',
'Conjugate transpose',
430 $
'Unit', lastc, k, one, v( lastv-k+1, 1 ), ldv,
437 c( lastv-k+j, i ) = c( lastv-k+j, i ) -
438 $ conjg( work( i, j ) )
442 ELSE IF(
lsame( side,
'R' ) )
THEN
446 lastv = max( k,
ilaclr( n, k, v, ldv ) )
447 lastc =
ilaclr( m, lastv, c, ldc )
454 CALL
ccopy( lastc, c( 1, lastv-k+j ), 1,
460 CALL
ctrmm(
'Right',
'Upper',
'No transpose',
'Unit',
461 $ lastc, k, one, v( lastv-k+1, 1 ), ldv,
463 IF( lastv.GT.k )
THEN
467 CALL
cgemm(
'No transpose',
'No transpose',
469 $ one, c, ldc, v, ldv, one, work, ldwork )
474 CALL
ctrmm(
'Right',
'Lower', trans,
'Non-unit',
475 $ lastc, k, one, t, ldt, work, ldwork )
479 IF( lastv.GT.k )
THEN
483 CALL
cgemm(
'No transpose',
'Conjugate transpose',
484 $ lastc, lastv-k, k, -one, work, ldwork, v, ldv,
490 CALL
ctrmm(
'Right',
'Upper',
'Conjugate transpose',
491 $
'Unit', lastc, k, one, v( lastv-k+1, 1 ), ldv,
498 c( i, lastv-k+j ) = c( i, lastv-k+j )
505 ELSE IF(
lsame( storev,
'R' ) )
THEN
507 IF(
lsame( direct,
'F' ) )
THEN
512 IF(
lsame( side,
'L' ) )
THEN
517 lastv = max( k,
ilaclc( k, m, v, ldv ) )
518 lastc =
ilaclc( lastv, n, c, ldc )
525 CALL
ccopy( lastc, c( j, 1 ), ldc, work( 1, j ), 1 )
526 CALL
clacgv( lastc, work( 1, j ), 1 )
531 CALL
ctrmm(
'Right',
'Upper',
'Conjugate transpose',
532 $
'Unit', lastc, k, one, v, ldv, work, ldwork )
533 IF( lastv.GT.k )
THEN
537 CALL
cgemm(
'Conjugate transpose',
538 $
'Conjugate transpose', lastc, k, lastv-k,
539 $ one, c( k+1, 1 ), ldc, v( 1, k+1 ), ldv,
540 $ one, work, ldwork )
545 CALL
ctrmm(
'Right',
'Upper', transt,
'Non-unit',
546 $ lastc, k, one, t, ldt, work, ldwork )
550 IF( lastv.GT.k )
THEN
554 CALL
cgemm(
'Conjugate transpose',
555 $
'Conjugate transpose', lastv-k, lastc, k,
556 $ -one, v( 1, k+1 ), ldv, work, ldwork,
557 $ one, c( k+1, 1 ), ldc )
562 CALL
ctrmm(
'Right',
'Upper',
'No transpose',
'Unit',
563 $ lastc, k, one, v, ldv, work, ldwork )
569 c( j, i ) = c( j, i ) - conjg( work( i, j ) )
573 ELSE IF(
lsame( side,
'R' ) )
THEN
577 lastv = max( k,
ilaclc( k, n, v, ldv ) )
578 lastc =
ilaclr( m, lastv, c, ldc )
585 CALL
ccopy( lastc, c( 1, j ), 1, work( 1, j ), 1 )
590 CALL
ctrmm(
'Right',
'Upper',
'Conjugate transpose',
591 $
'Unit', lastc, k, one, v, ldv, work, ldwork )
592 IF( lastv.GT.k )
THEN
596 CALL
cgemm(
'No transpose',
'Conjugate transpose',
597 $ lastc, k, lastv-k, one, c( 1, k+1 ), ldc,
598 $ v( 1, k+1 ), ldv, one, work, ldwork )
603 CALL
ctrmm(
'Right',
'Upper', trans,
'Non-unit',
604 $ lastc, k, one, t, ldt, work, ldwork )
608 IF( lastv.GT.k )
THEN
612 CALL
cgemm(
'No transpose',
'No transpose',
614 $ -one, work, ldwork, v( 1, k+1 ), ldv,
615 $ one, c( 1, k+1 ), ldc )
620 CALL
ctrmm(
'Right',
'Upper',
'No transpose',
'Unit',
621 $ lastc, k, one, v, ldv, work, ldwork )
627 c( i, j ) = c( i, j ) - work( i, j )
638 IF(
lsame( side,
'L' ) )
THEN
643 lastv = max( k,
ilaclc( k, m, v, ldv ) )
644 lastc =
ilaclc( lastv, n, c, ldc )
651 CALL
ccopy( lastc, c( lastv-k+j, 1 ), ldc,
653 CALL
clacgv( lastc, work( 1, j ), 1 )
658 CALL
ctrmm(
'Right',
'Lower',
'Conjugate transpose',
659 $
'Unit', lastc, k, one, v( 1, lastv-k+1 ), ldv,
661 IF( lastv.GT.k )
THEN
665 CALL
cgemm(
'Conjugate transpose',
666 $
'Conjugate transpose', lastc, k, lastv-k,
667 $ one, c, ldc, v, ldv, one, work, ldwork )
672 CALL
ctrmm(
'Right',
'Lower', transt,
'Non-unit',
673 $ lastc, k, one, t, ldt, work, ldwork )
677 IF( lastv.GT.k )
THEN
681 CALL
cgemm(
'Conjugate transpose',
682 $
'Conjugate transpose', lastv-k, lastc, k,
683 $ -one, v, ldv, work, ldwork, one, c, ldc )
688 CALL
ctrmm(
'Right',
'Lower',
'No transpose',
'Unit',
689 $ lastc, k, one, v( 1, lastv-k+1 ), ldv,
696 c( lastv-k+j, i ) = c( lastv-k+j, i ) -
697 $ conjg( work( i, j ) )
701 ELSE IF(
lsame( side,
'R' ) )
THEN
705 lastv = max( k,
ilaclc( k, n, v, ldv ) )
706 lastc =
ilaclr( m, lastv, c, ldc )
713 CALL
ccopy( lastc, c( 1, lastv-k+j ), 1,
719 CALL
ctrmm(
'Right',
'Lower',
'Conjugate transpose',
720 $
'Unit', lastc, k, one, v( 1, lastv-k+1 ), ldv,
722 IF( lastv.GT.k )
THEN
726 CALL
cgemm(
'No transpose',
'Conjugate transpose',
727 $ lastc, k, lastv-k, one, c, ldc, v, ldv, one,
733 CALL
ctrmm(
'Right',
'Lower', trans,
'Non-unit',
734 $ lastc, k, one, t, ldt, work, ldwork )
738 IF( lastv.GT.k )
THEN
742 CALL
cgemm(
'No transpose',
'No transpose',
743 $ lastc, lastv-k, k, -one, work, ldwork, v, ldv,
749 CALL
ctrmm(
'Right',
'Lower',
'No transpose',
'Unit',
750 $ lastc, k, one, v( 1, lastv-k+1 ), ldv,
757 c( i, lastv-k+j ) = c( i, lastv-k+j )