247 SUBROUTINE dtprfb( SIDE, TRANS, DIRECT, STOREV, M, N, K, L,
248 $ V, LDV, T, LDT, A, LDA, B, LDB, WORK, LDWORK )
255 CHARACTER DIRECT, SIDE, STOREV, TRANS
256 INTEGER K, L, LDA, LDB, LDT, LDV, LDWORK, M, N
259 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), T( LDT, * ),
260 $ v( ldv, * ), work( ldwork, * )
266 DOUBLE PRECISION ONE, ZERO
267 parameter( one = 1.0, zero = 0.0 )
270 INTEGER I, J, MP, NP, KP
271 LOGICAL LEFT, FORWARD, COLUMN, RIGHT, BACKWARD, ROW
284 IF( m.LE.0 .OR. n.LE.0 .OR. k.LE.0 .OR. l.LT.0 )
RETURN
286 IF( lsame( storev,
'C' ) )
THEN
289 ELSE IF ( lsame( storev,
'R' ) )
THEN
297 IF( lsame( side,
'L' ) )
THEN
300 ELSE IF( lsame( side,
'R' ) )
THEN
308 IF( lsame( direct,
'F' ) )
THEN
311 ELSE IF( lsame( direct,
'B' ) )
THEN
321 IF( column .AND. forward .AND. left )
THEN
343 work( i, j ) = b( m-l+i, j )
346 CALL dtrmm(
'L',
'U',
'T',
'N', l, n, one, v( mp, 1 ), ldv,
348 CALL dgemm(
'T',
'N', l, n, m-l, one, v, ldv, b, ldb,
349 $ one, work, ldwork )
350 CALL dgemm(
'T',
'N', k-l, n, m, one, v( 1, kp ), ldv,
351 $ b, ldb, zero, work( kp, 1 ), ldwork )
355 work( i, j ) = work( i, j ) + a( i, j )
359 CALL dtrmm(
'L',
'U', trans,
'N', k, n, one, t, ldt,
364 a( i, j ) = a( i, j ) - work( i, j )
368 CALL dgemm(
'N',
'N', m-l, n, k, -one, v, ldv, work, ldwork,
370 CALL dgemm(
'N',
'N', l, n, k-l, -one, v( mp, kp ), ldv,
371 $ work( kp, 1 ), ldwork, one, b( mp, 1 ), ldb )
372 CALL dtrmm(
'L',
'U',
'N',
'N', l, n, one, v( mp, 1 ), ldv,
376 b( m-l+i, j ) = b( m-l+i, j ) - work( i, j )
382 ELSE IF( column .AND. forward .AND. right )
THEN
403 work( i, j ) = b( i, n-l+j )
406 CALL dtrmm(
'R',
'U',
'N',
'N', m, l, one, v( np, 1 ), ldv,
408 CALL dgemm(
'N',
'N', m, l, n-l, one, b, ldb,
409 $ v, ldv, one, work, ldwork )
410 CALL dgemm(
'N',
'N', m, k-l, n, one, b, ldb,
411 $ v( 1, kp ), ldv, zero, work( 1, kp ), ldwork )
415 work( i, j ) = work( i, j ) + a( i, j )
419 CALL dtrmm(
'R',
'U', trans,
'N', m, k, one, t, ldt,
424 a( i, j ) = a( i, j ) - work( i, j )
428 CALL dgemm(
'N',
'T', m, n-l, k, -one, work, ldwork,
429 $ v, ldv, one, b, ldb )
430 CALL dgemm(
'N',
'T', m, l, k-l, -one, work( 1, kp ),
432 $ v( np, kp ), ldv, one, b( 1, np ), ldb )
433 CALL dtrmm(
'R',
'U',
'T',
'N', m, l, one, v( np, 1 ), ldv,
437 b( i, n-l+j ) = b( i, n-l+j ) - work( i, j )
443 ELSE IF( column .AND. backward .AND. left )
THEN
465 work( k-l+i, j ) = b( i, j )
469 CALL dtrmm(
'L',
'L',
'T',
'N', l, n, one, v( 1, kp ), ldv,
470 $ work( kp, 1 ), ldwork )
471 CALL dgemm(
'T',
'N', l, n, m-l, one, v( mp, kp ), ldv,
472 $ b( mp, 1 ), ldb, one, work( kp, 1 ), ldwork )
473 CALL dgemm(
'T',
'N', k-l, n, m, one, v, ldv,
474 $ b, ldb, zero, work, ldwork )
478 work( i, j ) = work( i, j ) + a( i, j )
482 CALL dtrmm(
'L',
'L', trans,
'N', k, n, one, t, ldt,
487 a( i, j ) = a( i, j ) - work( i, j )
491 CALL dgemm(
'N',
'N', m-l, n, k, -one, v( mp, 1 ), ldv,
492 $ work, ldwork, one, b( mp, 1 ), ldb )
493 CALL dgemm(
'N',
'N', l, n, k-l, -one, v, ldv,
494 $ work, ldwork, one, b, ldb )
495 CALL dtrmm(
'L',
'L',
'N',
'N', l, n, one, v( 1, kp ), ldv,
496 $ work( kp, 1 ), ldwork )
499 b( i, j ) = b( i, j ) - work( k-l+i, j )
505 ELSE IF( column .AND. backward .AND. right )
THEN
526 work( i, k-l+j ) = b( i, j )
529 CALL dtrmm(
'R',
'L',
'N',
'N', m, l, one, v( 1, kp ), ldv,
530 $ work( 1, kp ), ldwork )
531 CALL dgemm(
'N',
'N', m, l, n-l, one, b( 1, np ), ldb,
532 $ v( np, kp ), ldv, one, work( 1, kp ), ldwork )
533 CALL dgemm(
'N',
'N', m, k-l, n, one, b, ldb,
534 $ v, ldv, zero, work, ldwork )
538 work( i, j ) = work( i, j ) + a( i, j )
542 CALL dtrmm(
'R',
'L', trans,
'N', m, k, one, t, ldt,
547 a( i, j ) = a( i, j ) - work( i, j )
551 CALL dgemm(
'N',
'T', m, n-l, k, -one, work, ldwork,
552 $ v( np, 1 ), ldv, one, b( 1, np ), ldb )
553 CALL dgemm(
'N',
'T', m, l, k-l, -one, work, ldwork,
554 $ v, ldv, one, b, ldb )
555 CALL dtrmm(
'R',
'L',
'T',
'N', m, l, one, v( 1, kp ), ldv,
556 $ work( 1, kp ), ldwork )
559 b( i, j ) = b( i, j ) - work( i, k-l+j )
565 ELSE IF( row .AND. forward .AND. left )
THEN
586 work( i, j ) = b( m-l+i, j )
589 CALL dtrmm(
'L',
'L',
'N',
'N', l, n, one, v( 1, mp ), ldv,
591 CALL dgemm(
'N',
'N', l, n, m-l, one, v, ldv,b, ldb,
592 $ one, work, ldwork )
593 CALL dgemm(
'N',
'N', k-l, n, m, one, v( kp, 1 ), ldv,
594 $ b, ldb, zero, work( kp, 1 ), ldwork )
598 work( i, j ) = work( i, j ) + a( i, j )
602 CALL dtrmm(
'L',
'U', trans,
'N', k, n, one, t, ldt,
607 a( i, j ) = a( i, j ) - work( i, j )
611 CALL dgemm(
'T',
'N', m-l, n, k, -one, v, ldv, work, ldwork,
613 CALL dgemm(
'T',
'N', l, n, k-l, -one, v( kp, mp ), ldv,
614 $ work( kp, 1 ), ldwork, one, b( mp, 1 ), ldb )
615 CALL dtrmm(
'L',
'L',
'T',
'N', l, n, one, v( 1, mp ), ldv,
619 b( m-l+i, j ) = b( m-l+i, j ) - work( i, j )
625 ELSE IF( row .AND. forward .AND. right )
THEN
645 work( i, j ) = b( i, n-l+j )
648 CALL dtrmm(
'R',
'L',
'T',
'N', m, l, one, v( 1, np ), ldv,
650 CALL dgemm(
'N',
'T', m, l, n-l, one, b, ldb, v, ldv,
651 $ one, work, ldwork )
652 CALL dgemm(
'N',
'T', m, k-l, n, one, b, ldb,
653 $ v( kp, 1 ), ldv, zero, work( 1, kp ), ldwork )
657 work( i, j ) = work( i, j ) + a( i, j )
661 CALL dtrmm(
'R',
'U', trans,
'N', m, k, one, t, ldt,
666 a( i, j ) = a( i, j ) - work( i, j )
670 CALL dgemm(
'N',
'N', m, n-l, k, -one, work, ldwork,
671 $ v, ldv, one, b, ldb )
672 CALL dgemm(
'N',
'N', m, l, k-l, -one, work( 1, kp ),
674 $ v( kp, np ), ldv, one, b( 1, np ), ldb )
675 CALL dtrmm(
'R',
'L',
'N',
'N', m, l, one, v( 1, np ), ldv,
679 b( i, n-l+j ) = b( i, n-l+j ) - work( i, j )
685 ELSE IF( row .AND. backward .AND. left )
THEN
706 work( k-l+i, j ) = b( i, j )
709 CALL dtrmm(
'L',
'U',
'N',
'N', l, n, one, v( kp, 1 ), ldv,
710 $ work( kp, 1 ), ldwork )
711 CALL dgemm(
'N',
'N', l, n, m-l, one, v( kp, mp ), ldv,
712 $ b( mp, 1 ), ldb, one, work( kp, 1 ), ldwork )
713 CALL dgemm(
'N',
'N', k-l, n, m, one, v, ldv, b, ldb,
714 $ zero, work, ldwork )
718 work( i, j ) = work( i, j ) + a( i, j )
722 CALL dtrmm(
'L',
'L ', trans,
'N', k, n, one, t, ldt,
727 a( i, j ) = a( i, j ) - work( i, j )
731 CALL dgemm(
'T',
'N', m-l, n, k, -one, v( 1, mp ), ldv,
732 $ work, ldwork, one, b( mp, 1 ), ldb )
733 CALL dgemm(
'T',
'N', l, n, k-l, -one, v, ldv,
734 $ work, ldwork, one, b, ldb )
735 CALL dtrmm(
'L',
'U',
'T',
'N', l, n, one, v( kp, 1 ), ldv,
736 $ work( kp, 1 ), ldwork )
739 b( i, j ) = b( i, j ) - work( k-l+i, j )
745 ELSE IF( row .AND. backward .AND. right )
THEN
765 work( i, k-l+j ) = b( i, j )
768 CALL dtrmm(
'R',
'U',
'T',
'N', m, l, one, v( kp, 1 ), ldv,
769 $ work( 1, kp ), ldwork )
770 CALL dgemm(
'N',
'T', m, l, n-l, one, b( 1, np ), ldb,
771 $ v( kp, np ), ldv, one, work( 1, kp ), ldwork )
772 CALL dgemm(
'N',
'T', m, k-l, n, one, b, ldb, v, ldv,
773 $ zero, work, ldwork )
777 work( i, j ) = work( i, j ) + a( i, j )
781 CALL dtrmm(
'R',
'L', trans,
'N', m, k, one, t, ldt,
786 a( i, j ) = a( i, j ) - work( i, j )
790 CALL dgemm(
'N',
'N', m, n-l, k, -one, work, ldwork,
791 $ v( 1, np ), ldv, one, b( 1, np ), ldb )
792 CALL dgemm(
'N',
'N', m, l, k-l , -one, work, ldwork,
793 $ v, ldv, one, b, ldb )
794 CALL dtrmm(
'R',
'U',
'N',
'N', m, l, one, v( kp, 1 ), ldv,
795 $ work( 1, kp ), ldwork )
798 b( i, j ) = b( i, j ) - work( i, k-l+j )