197 SUBROUTINE slarfb( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
198 $ T, LDT, C, LDC, WORK, LDWORK )
206 CHARACTER DIRECT, SIDE, STOREV, TRANS
207 INTEGER K, LDC, LDT, LDV, LDWORK, M, N
210 REAL C( LDC, * ), T( LDT, * ), V( LDV, * ),
218 parameter( one = 1.0e+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 scopy( n, c( j, 1 ), ldc, work( 1, j ), 1 )
267 CALL strmm(
'Right',
'Lower',
'No transpose',
'Unit', n,
268 $ k, one, v, ldv, work, ldwork )
273 CALL sgemm(
'Transpose',
'No transpose', n, k, m-k,
274 $ one, c( k+1, 1 ), ldc, v( k+1, 1 ), ldv,
275 $ one, work, ldwork )
280 CALL strmm(
'Right',
'Upper', transt,
'Non-unit', n, k,
281 $ one, t, ldt, work, ldwork )
289 CALL sgemm(
'No transpose',
'Transpose', m-k, n, k,
290 $ -one, v( k+1, 1 ), ldv, work, ldwork, one,
296 CALL strmm(
'Right',
'Lower',
'Transpose',
'Unit', n, k,
297 $ one, v, ldv, work, ldwork )
303 c( j, i ) = c( j, i ) - work( i, j )
307 ELSE IF( lsame( side,
'R' ) )
THEN
316 CALL scopy( m, c( 1, j ), 1, work( 1, j ), 1 )
321 CALL strmm(
'Right',
'Lower',
'No transpose',
'Unit', m,
322 $ k, one, v, ldv, work, ldwork )
327 CALL sgemm(
'No transpose',
'No transpose', m, k, n-k,
328 $ one, c( 1, k+1 ), ldc, v( k+1, 1 ), ldv,
329 $ one, work, ldwork )
334 CALL strmm(
'Right',
'Upper', trans,
'Non-unit', m, k,
335 $ one, t, ldt, work, ldwork )
343 CALL sgemm(
'No transpose',
'Transpose', m, n-k, k,
344 $ -one, work, ldwork, v( k+1, 1 ), ldv, one,
350 CALL strmm(
'Right',
'Lower',
'Transpose',
'Unit', m, k,
351 $ one, v, ldv, work, ldwork )
357 c( i, j ) = c( i, j ) - work( i, j )
368 IF( lsame( side,
'L' ) )
THEN
378 CALL scopy( n, c( m-k+j, 1 ), ldc, work( 1, j ), 1 )
383 CALL strmm(
'Right',
'Upper',
'No transpose',
'Unit', n,
384 $ k, one, v( m-k+1, 1 ), ldv, work, ldwork )
389 CALL sgemm(
'Transpose',
'No transpose', n, k, m-k,
390 $ one, c, ldc, v, ldv, one, work, ldwork )
395 CALL strmm(
'Right',
'Lower', transt,
'Non-unit', n, k,
396 $ one, t, ldt, work, ldwork )
404 CALL sgemm(
'No transpose',
'Transpose', m-k, n, k,
405 $ -one, v, ldv, work, ldwork, one, c, ldc )
410 CALL strmm(
'Right',
'Upper',
'Transpose',
'Unit', n, k,
411 $ one, v( m-k+1, 1 ), ldv, work, ldwork )
417 c( m-k+j, i ) = c( m-k+j, i ) - work( i, j )
421 ELSE IF( lsame( side,
'R' ) )
THEN
430 CALL scopy( m, c( 1, n-k+j ), 1, work( 1, j ), 1 )
435 CALL strmm(
'Right',
'Upper',
'No transpose',
'Unit', m,
436 $ k, one, v( n-k+1, 1 ), ldv, work, ldwork )
441 CALL sgemm(
'No transpose',
'No transpose', m, k, n-k,
442 $ one, c, ldc, v, ldv, one, work, ldwork )
447 CALL strmm(
'Right',
'Lower', trans,
'Non-unit', m, k,
448 $ one, t, ldt, work, ldwork )
456 CALL sgemm(
'No transpose',
'Transpose', m, n-k, k,
457 $ -one, work, ldwork, v, ldv, one, c, ldc )
462 CALL strmm(
'Right',
'Upper',
'Transpose',
'Unit', m, k,
463 $ one, v( n-k+1, 1 ), ldv, work, ldwork )
469 c( i, n-k+j ) = c( i, n-k+j ) - work( i, j )
475 ELSE IF( lsame( storev,
'R' ) )
THEN
477 IF( lsame( direct,
'F' ) )
THEN
482 IF( lsame( side,
'L' ) )
THEN
492 CALL scopy( n, c( j, 1 ), ldc, work( 1, j ), 1 )
497 CALL strmm(
'Right',
'Upper',
'Transpose',
'Unit', n, k,
498 $ one, v, ldv, work, ldwork )
503 CALL sgemm(
'Transpose',
'Transpose', n, k, m-k, one,
504 $ c( k+1, 1 ), ldc, v( 1, k+1 ), ldv, one,
510 CALL strmm(
'Right',
'Upper', transt,
'Non-unit', n, k,
511 $ one, t, ldt, work, ldwork )
519 CALL sgemm(
'Transpose',
'Transpose', m-k, n, k, -one,
520 $ v( 1, k+1 ), ldv, work, ldwork, one,
526 CALL strmm(
'Right',
'Upper',
'No transpose',
'Unit', n,
527 $ k, one, v, ldv, work, ldwork )
533 c( j, i ) = c( j, i ) - work( i, j )
537 ELSE IF( lsame( side,
'R' ) )
THEN
546 CALL scopy( m, c( 1, j ), 1, work( 1, j ), 1 )
551 CALL strmm(
'Right',
'Upper',
'Transpose',
'Unit', m, k,
552 $ one, v, ldv, work, ldwork )
557 CALL sgemm(
'No transpose',
'Transpose', m, k, n-k,
558 $ one, c( 1, k+1 ), ldc, v( 1, k+1 ), ldv,
559 $ one, work, ldwork )
564 CALL strmm(
'Right',
'Upper', trans,
'Non-unit', m, k,
565 $ one, t, ldt, work, ldwork )
573 CALL sgemm(
'No transpose',
'No transpose', m, n-k, k,
574 $ -one, work, ldwork, v( 1, k+1 ), ldv, one,
580 CALL strmm(
'Right',
'Upper',
'No transpose',
'Unit', m,
581 $ k, one, v, ldv, work, ldwork )
587 c( i, j ) = c( i, j ) - work( i, j )
598 IF( lsame( side,
'L' ) )
THEN
608 CALL scopy( n, c( m-k+j, 1 ), ldc, work( 1, j ), 1 )
613 CALL strmm(
'Right',
'Lower',
'Transpose',
'Unit', n, k,
614 $ one, v( 1, m-k+1 ), ldv, work, ldwork )
619 CALL sgemm(
'Transpose',
'Transpose', n, k, m-k, one,
620 $ c, ldc, v, ldv, one, work, ldwork )
625 CALL strmm(
'Right',
'Lower', transt,
'Non-unit', n, k,
626 $ one, t, ldt, work, ldwork )
634 CALL sgemm(
'Transpose',
'Transpose', m-k, n, k, -one,
635 $ v, ldv, work, ldwork, one, c, ldc )
640 CALL strmm(
'Right',
'Lower',
'No transpose',
'Unit', n,
641 $ k, one, v( 1, m-k+1 ), ldv, work, ldwork )
647 c( m-k+j, i ) = c( m-k+j, i ) - work( i, j )
651 ELSE IF( lsame( side,
'R' ) )
THEN
660 CALL scopy( m, c( 1, n-k+j ), 1, work( 1, j ), 1 )
665 CALL strmm(
'Right',
'Lower',
'Transpose',
'Unit', m, k,
666 $ one, v( 1, n-k+1 ), ldv, work, ldwork )
671 CALL sgemm(
'No transpose',
'Transpose', m, k, n-k,
672 $ one, c, ldc, v, ldv, one, work, ldwork )
677 CALL strmm(
'Right',
'Lower', trans,
'Non-unit', m, k,
678 $ one, t, ldt, work, ldwork )
686 CALL sgemm(
'No transpose',
'No transpose', m, n-k, k,
687 $ -one, work, ldwork, v, ldv, one, c, ldc )
692 CALL strmm(
'Right',
'Lower',
'No transpose',
'Unit', m,
693 $ k, one, v( 1, n-k+1 ), ldv, work, ldwork )
699 c( i, n-k+j ) = c( i, n-k+j ) - work( i, j )