249 SUBROUTINE stprfb( 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 REAL A( lda, * ), B( ldb, * ), T( ldt, * ),
262 $ v( ldv, * ), work( ldwork, * )
269 parameter( one = 1.0, zero = 0.0 )
272 INTEGER I, J, MP, NP, KP
273 LOGICAL LEFT, FORWARD, COLUMN, RIGHT, BACKWARD, ROW
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 strmm(
'L',
'U',
'T',
'N', l, n, one, v( mp, 1 ), ldv,
350 CALL sgemm(
'T',
'N', l, n, m-l, one, v, ldv, b, ldb,
351 $ one, work, ldwork )
352 CALL sgemm(
'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 strmm(
'L',
'U', trans,
'N', k, n, one, t, ldt,
366 a( i, j ) = a( i, j ) - work( i, j )
370 CALL sgemm(
'N',
'N', m-l, n, k, -one, v, ldv, work, ldwork,
372 CALL sgemm(
'N',
'N', l, n, k-l, -one, v( mp, kp ), ldv,
373 $ work( kp, 1 ), ldwork, one, b( mp, 1 ), ldb )
374 CALL strmm(
'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 strmm(
'R',
'U',
'N',
'N', m, l, one, v( np, 1 ), ldv,
410 CALL sgemm(
'N',
'N', m, l, n-l, one, b, ldb,
411 $ v, ldv, one, work, ldwork )
412 CALL sgemm(
'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 strmm(
'R',
'U', trans,
'N', m, k, one, t, ldt,
426 a( i, j ) = a( i, j ) - work( i, j )
430 CALL sgemm(
'N',
'T', m, n-l, k, -one, work, ldwork,
431 $ v, ldv, one, b, ldb )
432 CALL sgemm(
'N',
'T', m, l, k-l, -one, work( 1, kp ), ldwork,
433 $ v( np, kp ), ldv, one, b( 1, np ), ldb )
434 CALL strmm(
'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 ELSE IF( column .AND. backward .AND. left )
THEN 466 work( k-l+i, j ) = b( i, j )
470 CALL strmm(
'L',
'L',
'T',
'N', l, n, one, v( 1, kp ), ldv,
471 $ work( kp, 1 ), ldwork )
472 CALL sgemm(
'T',
'N', l, n, m-l, one, v( mp, kp ), ldv,
473 $ b( mp, 1 ), ldb, one, work( kp, 1 ), ldwork )
474 CALL sgemm(
'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 strmm(
'L',
'L', trans,
'N', k, n, one, t, ldt,
488 a( i, j ) = a( i, j ) - work( i, j )
492 CALL sgemm(
'N',
'N', m-l, n, k, -one, v( mp, 1 ), ldv,
493 $ work, ldwork, one, b( mp, 1 ), ldb )
494 CALL sgemm(
'N',
'N', l, n, k-l, -one, v, ldv,
495 $ work, ldwork, one, b, ldb )
496 CALL strmm(
'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 ELSE IF( column .AND. backward .AND. right )
THEN 527 work( i, k-l+j ) = b( i, j )
530 CALL strmm(
'R',
'L',
'N',
'N', m, l, one, v( 1, kp ), ldv,
531 $ work( 1, kp ), ldwork )
532 CALL sgemm(
'N',
'N', m, l, n-l, one, b( 1, np ), ldb,
533 $ v( np, kp ), ldv, one, work( 1, kp ), ldwork )
534 CALL sgemm(
'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 strmm(
'R',
'L', trans,
'N', m, k, one, t, ldt,
548 a( i, j ) = a( i, j ) - work( i, j )
552 CALL sgemm(
'N',
'T', m, n-l, k, -one, work, ldwork,
553 $ v( np, 1 ), ldv, one, b( 1, np ), ldb )
554 CALL sgemm(
'N',
'T', m, l, k-l, -one, work, ldwork,
555 $ v, ldv, one, b, ldb )
556 CALL strmm(
'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 ELSE IF( row .AND. forward .AND. left )
THEN 587 work( i, j ) = b( m-l+i, j )
590 CALL strmm(
'L',
'L',
'N',
'N', l, n, one, v( 1, mp ), ldv,
592 CALL sgemm(
'N',
'N', l, n, m-l, one, v, ldv,b, ldb,
593 $ one, work, ldwork )
594 CALL sgemm(
'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 strmm(
'L',
'U', trans,
'N', k, n, one, t, ldt,
608 a( i, j ) = a( i, j ) - work( i, j )
612 CALL sgemm(
'T',
'N', m-l, n, k, -one, v, ldv, work, ldwork,
614 CALL sgemm(
'T',
'N', l, n, k-l, -one, v( kp, mp ), ldv,
615 $ work( kp, 1 ), ldwork, one, b( mp, 1 ), ldb )
616 CALL strmm(
'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 ELSE IF( row .AND. forward .AND. right )
THEN 646 work( i, j ) = b( i, n-l+j )
649 CALL strmm(
'R',
'L',
'T',
'N', m, l, one, v( 1, np ), ldv,
651 CALL sgemm(
'N',
'T', m, l, n-l, one, b, ldb, v, ldv,
652 $ one, work, ldwork )
653 CALL sgemm(
'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 strmm(
'R',
'U', trans,
'N', m, k, one, t, ldt,
667 a( i, j ) = a( i, j ) - work( i, j )
671 CALL sgemm(
'N',
'N', m, n-l, k, -one, work, ldwork,
672 $ v, ldv, one, b, ldb )
673 CALL sgemm(
'N',
'N', m, l, k-l, -one, work( 1, kp ), ldwork,
674 $ v( kp, np ), ldv, one, b( 1, np ), ldb )
675 CALL strmm(
'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 strmm(
'L',
'U',
'N',
'N', l, n, one, v( kp, 1 ), ldv,
710 $ work( kp, 1 ), ldwork )
711 CALL sgemm(
'N',
'N', l, n, m-l, one, v( kp, mp ), ldv,
712 $ b( mp, 1 ), ldb, one, work( kp, 1 ), ldwork )
713 CALL sgemm(
'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 strmm(
'L',
'L ', trans,
'N', k, n, one, t, ldt,
727 a( i, j ) = a( i, j ) - work( i, j )
731 CALL sgemm(
'T',
'N', m-l, n, k, -one, v( 1, mp ), ldv,
732 $ work, ldwork, one, b( mp, 1 ), ldb )
733 CALL sgemm(
'T',
'N', l, n, k-l, -one, v, ldv,
734 $ work, ldwork, one, b, ldb )
735 CALL strmm(
'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 strmm(
'R',
'U',
'T',
'N', m, l, one, v( kp, 1 ), ldv,
769 $ work( 1, kp ), ldwork )
770 CALL sgemm(
'N',
'T', m, l, n-l, one, b( 1, np ), ldb,
771 $ v( kp, np ), ldv, one, work( 1, kp ), ldwork )
772 CALL sgemm(
'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 strmm(
'R',
'L', trans,
'N', m, k, one, t, ldt,
786 a( i, j ) = a( i, j ) - work( i, j )
790 CALL sgemm(
'N',
'N', m, n-l, k, -one, work, ldwork,
791 $ v( 1, np ), ldv, one, b( 1, np ), ldb )
792 CALL sgemm(
'N',
'N', m, l, k-l , -one, work, ldwork,
793 $ v, ldv, one, b, ldb )
794 CALL strmm(
'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 )
subroutine strmm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
STRMM
subroutine sgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
SGEMM
subroutine stprfb(SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V, LDV, T, LDT, A, LDA, B, LDB, WORK, LDWORK)
STPRFB applies a real "triangular-pentagonal" block reflector to a real matrix, which is composed of ...