195 SUBROUTINE dlarfb( 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 DOUBLE PRECISION c( ldc, * ), t( ldt, * ), v( ldv, * ),
216 parameter( one = 1.0d+0 )
220 INTEGER i, j, lastv, lastc
234 IF( m.LE.0 .OR. n.LE.0 )
237 IF(
lsame( trans,
'N' ) )
THEN
243 IF(
lsame( storev,
'C' ) )
THEN
245 IF(
lsame( direct,
'F' ) )
THEN
251 IF(
lsame( side,
'L' ) )
THEN
256 lastv = max( k,
iladlr( m, k, v, ldv ) )
257 lastc =
iladlc( lastv, n, c, ldc )
264 CALL
dcopy( lastc, c( j, 1 ), ldc, work( 1, j ), 1 )
269 CALL
dtrmm(
'Right',
'Lower',
'No transpose',
'Unit',
270 $ lastc, k, one, v, ldv, work, ldwork )
271 IF( lastv.GT.k )
THEN
275 CALL
dgemm(
'Transpose',
'No transpose',
277 $ one, c( k+1, 1 ), ldc, v( k+1, 1 ), ldv,
278 $ one, work, ldwork )
283 CALL
dtrmm(
'Right',
'Upper', transt,
'Non-unit',
284 $ lastc, k, one, t, ldt, work, ldwork )
288 IF( lastv.GT.k )
THEN
292 CALL
dgemm(
'No transpose',
'Transpose',
294 $ -one, v( k+1, 1 ), ldv, work, ldwork, one,
300 CALL
dtrmm(
'Right',
'Lower',
'Transpose',
'Unit',
301 $ lastc, k, one, v, ldv, work, ldwork )
307 c( j, i ) = c( j, i ) - work( i, j )
311 ELSE IF(
lsame( side,
'R' ) )
THEN
315 lastv = max( k,
iladlr( n, k, v, ldv ) )
316 lastc =
iladlr( m, lastv, c, ldc )
323 CALL
dcopy( lastc, c( 1, j ), 1, work( 1, j ), 1 )
328 CALL
dtrmm(
'Right',
'Lower',
'No transpose',
'Unit',
329 $ lastc, k, one, v, ldv, work, ldwork )
330 IF( lastv.GT.k )
THEN
334 CALL
dgemm(
'No transpose',
'No transpose',
336 $ one, c( 1, k+1 ), ldc, v( k+1, 1 ), ldv,
337 $ one, work, ldwork )
342 CALL
dtrmm(
'Right',
'Upper', trans,
'Non-unit',
343 $ lastc, k, one, t, ldt, work, ldwork )
347 IF( lastv.GT.k )
THEN
351 CALL
dgemm(
'No transpose',
'Transpose',
353 $ -one, work, ldwork, v( k+1, 1 ), ldv, one,
359 CALL
dtrmm(
'Right',
'Lower',
'Transpose',
'Unit',
360 $ lastc, k, one, v, ldv, work, ldwork )
366 c( i, j ) = c( i, j ) - work( i, j )
377 IF(
lsame( side,
'L' ) )
THEN
382 lastv = max( k,
iladlr( m, k, v, ldv ) )
383 lastc =
iladlc( lastv, n, c, ldc )
390 CALL
dcopy( lastc, c( lastv-k+j, 1 ), ldc,
396 CALL
dtrmm(
'Right',
'Upper',
'No transpose',
'Unit',
397 $ lastc, k, one, v( lastv-k+1, 1 ), ldv,
399 IF( lastv.GT.k )
THEN
403 CALL
dgemm(
'Transpose',
'No transpose',
404 $ lastc, k, lastv-k, one, c, ldc, v, ldv,
405 $ one, work, ldwork )
410 CALL
dtrmm(
'Right',
'Lower', transt,
'Non-unit',
411 $ lastc, k, one, t, ldt, work, ldwork )
415 IF( lastv.GT.k )
THEN
419 CALL
dgemm(
'No transpose',
'Transpose',
420 $ lastv-k, lastc, k, -one, v, ldv, work, ldwork,
426 CALL
dtrmm(
'Right',
'Upper',
'Transpose',
'Unit',
427 $ lastc, k, one, v( lastv-k+1, 1 ), ldv,
434 c( lastv-k+j, i ) = c( lastv-k+j, i ) - work(i, j)
438 ELSE IF(
lsame( side,
'R' ) )
THEN
442 lastv = max( k,
iladlr( n, k, v, ldv ) )
443 lastc =
iladlr( m, lastv, c, ldc )
450 CALL
dcopy( lastc, c( 1, n-k+j ), 1, work( 1, j ), 1 )
455 CALL
dtrmm(
'Right',
'Upper',
'No transpose',
'Unit',
456 $ lastc, k, one, v( lastv-k+1, 1 ), ldv,
458 IF( lastv.GT.k )
THEN
462 CALL
dgemm(
'No transpose',
'No transpose',
463 $ lastc, k, lastv-k, one, c, ldc, v, ldv,
464 $ one, work, ldwork )
469 CALL
dtrmm(
'Right',
'Lower', trans,
'Non-unit',
470 $ lastc, k, one, t, ldt, work, ldwork )
474 IF( lastv.GT.k )
THEN
478 CALL
dgemm(
'No transpose',
'Transpose',
479 $ lastc, lastv-k, k, -one, work, ldwork, v, ldv,
485 CALL
dtrmm(
'Right',
'Upper',
'Transpose',
'Unit',
486 $ lastc, k, one, v( lastv-k+1, 1 ), ldv,
493 c( i, lastv-k+j ) = c( i, lastv-k+j ) - work(i, j)
499 ELSE IF(
lsame( storev,
'R' ) )
THEN
501 IF(
lsame( direct,
'F' ) )
THEN
506 IF(
lsame( side,
'L' ) )
THEN
511 lastv = max( k,
iladlc( k, m, v, ldv ) )
512 lastc =
iladlc( lastv, n, c, ldc )
519 CALL
dcopy( lastc, c( j, 1 ), ldc, work( 1, j ), 1 )
524 CALL
dtrmm(
'Right',
'Upper',
'Transpose',
'Unit',
525 $ lastc, k, one, v, ldv, work, ldwork )
526 IF( lastv.GT.k )
THEN
530 CALL
dgemm(
'Transpose',
'Transpose',
532 $ one, c( k+1, 1 ), ldc, v( 1, k+1 ), ldv,
533 $ one, work, ldwork )
538 CALL
dtrmm(
'Right',
'Upper', transt,
'Non-unit',
539 $ lastc, k, one, t, ldt, work, ldwork )
543 IF( lastv.GT.k )
THEN
547 CALL
dgemm(
'Transpose',
'Transpose',
549 $ -one, v( 1, k+1 ), ldv, work, ldwork,
550 $ one, c( k+1, 1 ), ldc )
555 CALL
dtrmm(
'Right',
'Upper',
'No transpose',
'Unit',
556 $ lastc, k, one, v, ldv, work, ldwork )
562 c( j, i ) = c( j, i ) - work( i, j )
566 ELSE IF(
lsame( side,
'R' ) )
THEN
570 lastv = max( k,
iladlc( k, n, v, ldv ) )
571 lastc =
iladlr( m, lastv, c, ldc )
578 CALL
dcopy( lastc, c( 1, j ), 1, work( 1, j ), 1 )
583 CALL
dtrmm(
'Right',
'Upper',
'Transpose',
'Unit',
584 $ lastc, k, one, v, ldv, work, ldwork )
585 IF( lastv.GT.k )
THEN
589 CALL
dgemm(
'No transpose',
'Transpose',
591 $ one, c( 1, k+1 ), ldc, v( 1, k+1 ), ldv,
592 $ one, work, ldwork )
597 CALL
dtrmm(
'Right',
'Upper', trans,
'Non-unit',
598 $ lastc, k, one, t, ldt, work, ldwork )
602 IF( lastv.GT.k )
THEN
606 CALL
dgemm(
'No transpose',
'No transpose',
608 $ -one, work, ldwork, v( 1, k+1 ), ldv,
609 $ one, c( 1, k+1 ), ldc )
614 CALL
dtrmm(
'Right',
'Upper',
'No transpose',
'Unit',
615 $ lastc, k, one, v, ldv, work, ldwork )
621 c( i, j ) = c( i, j ) - work( i, j )
632 IF(
lsame( side,
'L' ) )
THEN
637 lastv = max( k,
iladlc( k, m, v, ldv ) )
638 lastc =
iladlc( lastv, n, c, ldc )
645 CALL
dcopy( lastc, c( lastv-k+j, 1 ), ldc,
651 CALL
dtrmm(
'Right',
'Lower',
'Transpose',
'Unit',
652 $ lastc, k, one, v( 1, lastv-k+1 ), ldv,
654 IF( lastv.GT.k )
THEN
658 CALL
dgemm(
'Transpose',
'Transpose',
659 $ lastc, k, lastv-k, one, c, ldc, v, ldv,
660 $ one, work, ldwork )
665 CALL
dtrmm(
'Right',
'Lower', transt,
'Non-unit',
666 $ lastc, k, one, t, ldt, work, ldwork )
670 IF( lastv.GT.k )
THEN
674 CALL
dgemm(
'Transpose',
'Transpose',
675 $ lastv-k, lastc, k, -one, v, ldv, work, ldwork,
681 CALL
dtrmm(
'Right',
'Lower',
'No transpose',
'Unit',
682 $ lastc, k, one, v( 1, lastv-k+1 ), ldv,
689 c( lastv-k+j, i ) = c( lastv-k+j, i ) - work(i, j)
693 ELSE IF(
lsame( side,
'R' ) )
THEN
697 lastv = max( k,
iladlc( k, n, v, ldv ) )
698 lastc =
iladlr( m, lastv, c, ldc )
705 CALL
dcopy( lastc, c( 1, lastv-k+j ), 1,
711 CALL
dtrmm(
'Right',
'Lower',
'Transpose',
'Unit',
712 $ lastc, k, one, v( 1, lastv-k+1 ), ldv,
714 IF( lastv.GT.k )
THEN
718 CALL
dgemm(
'No transpose',
'Transpose',
719 $ lastc, k, lastv-k, one, c, ldc, v, ldv,
720 $ one, work, ldwork )
725 CALL
dtrmm(
'Right',
'Lower', trans,
'Non-unit',
726 $ lastc, k, one, t, ldt, work, ldwork )
730 IF( lastv.GT.k )
THEN
734 CALL
dgemm(
'No transpose',
'No transpose',
735 $ lastc, lastv-k, k, -one, work, ldwork, v, ldv,
741 CALL
dtrmm(
'Right',
'Lower',
'No transpose',
'Unit',
742 $ lastc, k, one, v( 1, lastv-k+1 ), ldv,
749 c( i, lastv-k+j ) = c( i, lastv-k+j ) - work(i, j)