249 SUBROUTINE dtprfb( SIDE, TRANS, DIRECT, STOREV, M, N, K, L,
250 $ V, LDV, T, LDT, A, LDA, B, LDB, WORK, LDWORK )
257 CHARACTER DIRECT, SIDE, STOREV, TRANS
258 INTEGER K, L, LDA, LDB, LDT, LDV, LDWORK, M, N
261 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), T( LDT, * ),
262 $ v( ldv, * ), work( ldwork, * )
268 DOUBLE PRECISION ONE, ZERO
269 parameter( one = 1.0, zero = 0.0 )
272 INTEGER , J, MP, NP, KP
273 LOGICAL LEFT, FORWARD, COLUMN, RIGHT, BACKWARD,
286 IF( m.LE.0 .OR. n.LE.0 .OR. k.LE.0 .OR. l.LT.0 )
RETURN
288 IF( lsame( storev,
'C' ) )
THEN
291 ELSE IF ( lsame( storev,
'R' ) )
THEN
299 IF( lsame( side,
'L' ) )
THEN
302 ELSE IF( lsame( side,
'R' ) )
THEN
310 IF( lsame( direct,
'F' ) )
THEN
313 ELSE IF( lsame( direct,
'B' ) )
THEN
323 IF( column .AND. forward .AND. left )
THEN
345 work( i, j ) = b( m-l+i, j )
348 CALL dtrmm(
'L',
'U',
'T',
'N', l, n, one, v( mp, 1 ), ldv,
350 CALL dgemm(
'T',
'N', l, n, m-l, one, v, ldv, b, ldb,
351 $ one, work, ldwork )
352 CALL dgemm(
'T',
'N', k-l, n, m, one, v( 1, kp ), ldv,
353 $ b, ldb, zero, work( kp, 1 ), ldwork )
357 work( i, j ) = work( i, j ) + a( i, j )
361 CALL dtrmm(
'L',
'U', trans,
'N', k, n, one, t, ldt,
366 a( i, j ) = a( i, j ) - work( i, j )
370 CALL dgemm(
'N',
'N', m-l, n, k, -one, v, ldv, work, ldwork,
372 CALL dgemm(
'N',
'N', l, n, k-l, -one, v( mp, kp ), ldv
373 $ work( kp, 1 ), ldwork, one, b( mp, 1 ), ldb )
374 CALL dtrmm(
'L',
'U',
'N',
'N', l, n, one, v( mp, 1 ), ldv,
378 b( m-l+i, j ) = b( m-l+i, j ) - work( i, j )
384 ELSE IF( column .AND. forward .AND. right )
THEN
405 work( i, j ) = b( i, n-l+j )
408 CALL dtrmm(
'R',
'U',
'N',
'N', m, l, one, v( np, 1 ), ldv,
410 CALL dgemm(
'N',
'N', m, l, n-l, one, b, ldb,
411 $ v, ldv, one, work, ldwork )
412 CALL dgemm(
'N',
'N', m, k-l, n, one, b, ldb,
413 $ v( 1, kp ), ldv, zero, work( 1, kp ), ldwork )
417 work( i, j ) = work( i, j ) + a( i, j )
421 CALL dtrmm( 'r
', 'u
', TRANS, 'n
', M, K, ONE, T, LDT,
426 A( I, J ) = A( I, J ) - WORK( I, J )
430 CALL DGEMM( 'n
', 't
', M, N-L, K, -ONE, WORK, LDWORK,
431 $ V, LDV, ONE, B, LDB )
432 CALL DGEMM( 'n
', 't
', M, L, K-L, -ONE, WORK( 1, KP ), LDWORK,
433 $ V( NP, KP ), LDV, ONE, B( 1, NP ), LDB )
434 CALL DTRMM( 'r
', 'u
', 't
', 'n
', M, L, ONE, V( NP, 1 ), LDV,
438 B( I, N-L+J ) = B( I, N-L+J ) - WORK( I, J )
444.AND..AND.
ELSE IF( COLUMN BACKWARD LEFT ) THEN
466 WORK( K-L+I, J ) = B( I, J )
470 CALL DTRMM( 'l
', 'l
', 't
', 'n
', L, N, ONE, V( 1, KP ), LDV,
471 $ WORK( KP, 1 ), LDWORK )
472 CALL DGEMM( 't
', 'n
', L, N, M-L, ONE, V( MP, KP ), LDV,
473 $ B( MP, 1 ), LDB, ONE, WORK( KP, 1 ), LDWORK )
474 CALL DGEMM( 't
', 'n
', K-L, N, M, ONE, V, LDV,
475 $ B, LDB, ZERO, WORK, LDWORK )
479 WORK( I, J ) = WORK( I, J ) + A( I, J )
483 CALL DTRMM( 'l
', 'l
', TRANS, 'n
', K, N, ONE, T, LDT,
488 A( I, J ) = A( I, J ) - WORK( I, J )
492 CALL DGEMM( 'n
', 'n
', M-L, N, K, -ONE, V( MP, 1 ), LDV,
493 $ WORK, LDWORK, ONE, B( MP, 1 ), LDB )
494 CALL DGEMM( 'n
', 'n
', L, N, K-L, -ONE, V, LDV,
495 $ WORK, LDWORK, ONE, B, LDB )
496 CALL DTRMM( 'l
', 'l
', 'n
', 'n
', L, N, ONE, V( 1, KP ), LDV,
497 $ WORK( KP, 1 ), LDWORK )
500 B( I, J ) = B( I, J ) - WORK( K-L+I, J )
506.AND..AND.
ELSE IF( COLUMN BACKWARD RIGHT ) THEN
527 WORK( I, K-L+J ) = B( I, J )
530 CALL DTRMM( 'r
', 'l
', 'n
', 'n
', M, L, ONE, V( 1, KP ), LDV,
531 $ WORK( 1, KP ), LDWORK )
532 CALL DGEMM( 'n
', 'n
', M, L, N-L, ONE, B( 1, NP ), LDB,
533 $ V( NP, KP ), LDV, ONE, WORK( 1, KP ), LDWORK )
534 CALL DGEMM( 'n
', 'n
', M, K-L, N, ONE, B, LDB,
535 $ V, LDV, ZERO, WORK, LDWORK )
539 WORK( I, J ) = WORK( I, J ) + A( I, J )
543 CALL DTRMM( 'r
', 'l
', TRANS, 'n
', M, K, ONE, T, LDT,
548 A( I, J ) = A( I, J ) - WORK( I, J )
552 CALL DGEMM( 'n
', 't
', M, N-L, K, -ONE, WORK, LDWORK,
553 $ V( NP, 1 ), LDV, ONE, B( 1, NP ), LDB )
554 CALL DGEMM( 'n
', 't
', M, L, K-L, -ONE, WORK, LDWORK,
555 $ V, LDV, ONE, B, LDB )
556 CALL DTRMM( 'r
', 'l
', 't
', 'n
', M, L, ONE, V( 1, KP ), LDV,
557 $ WORK( 1, KP ), LDWORK )
560 B( I, J ) = B( I, J ) - WORK( I, K-L+J )
566.AND..AND.
ELSE IF( ROW FORWARD LEFT ) THEN
587 WORK( I, J ) = B( M-L+I, J )
590 CALL DTRMM( 'l
', 'l
', 'n
', 'n
', L, N, ONE, V( 1, MP ), LDV,
592 CALL DGEMM( 'n
', 'n
', L, N, M-L, ONE, V, LDV,B, LDB,
593 $ ONE, WORK, LDWORK )
594 CALL DGEMM( 'n
', 'n
', K-L, N, M, ONE, V( KP, 1 ), LDV,
595 $ B, LDB, ZERO, WORK( KP, 1 ), LDWORK )
599 WORK( I, J ) = WORK( I, J ) + A( I, J )
603 CALL DTRMM( 'l
', 'u
', TRANS, 'n
', K, N, ONE, T, LDT,
608 A( I, J ) = A( I, J ) - WORK( I, J )
612 CALL DGEMM( 't
', 'n
', M-L, N, K, -ONE, V, LDV, WORK, LDWORK,
614 CALL DGEMM( 't
', 'n
', L, N, K-L, -ONE, V( KP, MP ), LDV,
615 $ WORK( KP, 1 ), LDWORK, ONE, B( MP, 1 ), LDB )
616 CALL DTRMM( 'l
', 'l
', 't
', 'n
', L, N, ONE, V( 1, MP ), LDV,
620 B( M-L+I, J ) = B( M-L+I, J ) - WORK( I, J )
626.AND..AND.
ELSE IF( ROW FORWARD RIGHT ) THEN
646 WORK( I, J ) = B( I, N-L+J )
649 CALL DTRMM( 'r
', 'l
', 't
', 'n
', M, L, ONE, V( 1, NP ), LDV,
651 CALL DGEMM( 'n
', 't
', M, L, N-L, ONE, B, LDB, V, LDV,
652 $ ONE, WORK, LDWORK )
653 CALL DGEMM( 'n',
'T', m, k-l, n, one, b, ldb,
654 $ v( kp, 1 ), ldv, zero, work( 1, kp ), ldwork )
658 work( i, j ) = work( i, j ) + a( i, j )
662 CALL dtrmm(
'R',
'U', trans,
'N', m, k, one, t, ldt,
667 a( i, j ) = a( i, j ) - work( i, j )
671 CALL dgemm(
'N',
'N', m, n-l, k, -one, work, ldwork,
672 $ v, ldv, one, b, ldb )
673 CALL dgemm(
'N',
'N', m, l, k-l, -one, work( 1, kp ), ldwork,
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.AND..AND.
ELSE IF( ROW BACKWARD 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 )