197 SUBROUTINE dlarfb( 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 DOUBLE PRECISION C( LDC, * ), T( LDT, * ), V( LDV, * ),
218 parameter( one = 1.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 dcopy( n, c( j, 1 ), ldc, work( 1, j ), 1 )
267 CALL dtrmm(
'Right',
'Lower',
'No transpose',
'Unit', n,
268 $ k, one, v, ldv, work, ldwork )
273 CALL dgemm(
'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 dtrmm(
'Right',
'Upper', transt,
'Non-unit', n, k,
281 $ one, t, ldt, work, ldwork )
289 CALL dgemm(
'No transpose',
'Transpose', m-k, n, k,
290 $ -one, v( k+1, 1 ), ldv, work, ldwork, one,
296 CALL dtrmm(
'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 dcopy( m, c( 1, j ), 1, work( 1, j ), 1 )
321 CALL dtrmm(
'Right',
'Lower',
'No transpose',
'Unit', m,
322 $ k, one, v, ldv, work, ldwork )
327 CALL dgemm(
'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 dtrmm(
'Right',
'Upper', trans,
'Non-unit', m, k,
335 $ one, t, ldt, work, ldwork )
343 CALL dgemm(
'No transpose',
'Transpose', m, n-k, k,
344 $ -one, work, ldwork, v( k+1, 1 ), ldv, one,
350 CALL dtrmm(
'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 dcopy( n, c( m-k+j, 1 ), ldc, work( 1, j ), 1 )
383 CALL dtrmm(
'Right',
'Upper',
'No transpose',
'Unit', n,
384 $ k, one, v( m-k+1, 1 ), ldv, work, ldwork )
389 CALL dgemm(
'Transpose',
'No transpose', n, k, m-k,
390 $ one, c, ldc, v, ldv, one, work, ldwork )
395 CALL dtrmm(
'Right',
'Lower', transt,
'Non-unit', n, k,
396 $ one, t, ldt, work, ldwork )
404 CALL dgemm(
'No transpose',
'Transpose', m-k, n, k,
405 $ -one, v, ldv, work, ldwork, one, c, ldc )
410 CALL dtrmm(
'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 dcopy( m, c( 1, n-k+j ), 1, work( 1, j ), 1 )
435 CALL dtrmm(
'Right',
'Upper',
'No transpose',
'Unit', m,
436 $ k, one, v( n-k+1, 1 ), ldv, work, ldwork )
441 CALL dgemm(
'No transpose',
'No transpose', m, k, n-k,
442 $ one, c, ldc, v, ldv, one, work, ldwork )
447 CALL dtrmm(
'Right',
'Lower', trans,
'Non-unit', m, k,
448 $ one, t, ldt, work, ldwork )
456 CALL dgemm(
'No transpose',
'Transpose', m, n-k, k,
457 $ -one, work, ldwork, v, ldv, one, c, ldc )
462 CALL dtrmm(
'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 dcopy( n, c( j, 1 ), ldc, work( 1, j ), 1 )
497 CALL dtrmm(
'Right',
'Upper',
'Transpose',
'Unit', n, k,
498 $ one, v, ldv, work, ldwork )
503 CALL dgemm(
'Transpose',
'Transpose', n, k, m-k, one,
504 $ c( k+1, 1 ), ldc, v( 1, k+1 ), ldv, one,
510 CALL dtrmm(
'Right',
'Upper', transt,
'Non-unit', n, k,
511 $ one, t, ldt, work, ldwork )
519 CALL dgemm(
'Transpose',
'Transpose', m-k, n, k, -one,
520 $ v( 1, k+1 ), ldv, work, ldwork, one,
526 CALL dtrmm(
'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 dcopy( m, c( 1, j ), 1, work( 1, j ), 1 )
551 CALL dtrmm(
'Right',
'Upper',
'Transpose',
'Unit', m, k,
552 $ one, v, ldv, work, ldwork )
557 CALL dgemm(
'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 dtrmm(
'Right',
'Upper', trans,
'Non-unit', m, k,
565 $ one, t, ldt, work, ldwork )
573 CALL dgemm(
'No transpose',
'No transpose', m, n-k, k,
574 $ -one, work, ldwork, v( 1, k+1 ), ldv, one,
580 CALL dtrmm(
'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 dcopy( n, c( m-k+j, 1 ), ldc, work( 1, j ), 1 )
613 CALL dtrmm(
'Right',
'Lower',
'Transpose',
'Unit', n, k,
614 $ one, v( 1, m-k+1 ), ldv, work, ldwork )
619 CALL dgemm(
'Transpose',
'Transpose', n, k, m-k, one,
620 $ c, ldc, v, ldv, one, work, ldwork )
625 CALL dtrmm(
'Right',
'Lower', transt,
'Non-unit', n, k,
626 $ one, t, ldt, work, ldwork )
634 CALL dgemm(
'Transpose',
'Transpose', m-k, n, k, -one,
635 $ v, ldv, work, ldwork, one, c, ldc )
640 CALL dtrmm(
'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 dcopy( m, c( 1, n-k+j ), 1, work( 1, j ), 1 )
665 CALL dtrmm(
'Right',
'Lower',
'Transpose',
'Unit', m, k,
666 $ one, v( 1, n-k+1 ), ldv, work, ldwork )
671 CALL dgemm(
'No transpose',
'Transpose', m, k, n-k,
672 $ one, c, ldc, v, ldv, one, work, ldwork )
677 CALL dtrmm(
'Right',
'Lower', trans,
'Non-unit', m, k,
678 $ one, t, ldt, work, ldwork )
686 CALL dgemm(
'No transpose',
'No transpose', m, n-k, k,
687 $ -one, work, ldwork, v, ldv, one, c, ldc )
692 CALL dtrmm(
'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 )