247 SUBROUTINE stprfb( 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 REAL A( LDA, * ), B( LDB, * ), T( LDT, * ),
260 $ v( ldv, * ), work( ldwork, * )
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 strmm(
'L',
'U',
'T',
'N', l, n, one, v( mp, 1 ), ldv,
348 CALL sgemm(
'T',
'N', l, n, m-l, one, v, ldv, b, ldb,
349 $ one, work, ldwork )
350 CALL sgemm(
'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 strmm(
'L',
'U', trans,
'N', k, n, one, t, ldt,
364 a( i, j ) = a( i, j ) - work( i, j )
368 CALL sgemm(
'N',
'N', m-l, n, k, -one, v, ldv, work, ldwork,
370 CALL sgemm(
'N',
'N', l, n, k-l, -one, v( mp, kp ), ldv,
371 $ work( kp, 1 ), ldwork, one, b( mp, 1 ), ldb )
372 CALL strmm(
'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 strmm(
'R',
'U',
'N',
'N', m, l, one, v( np, 1 ), ldv,
408 CALL sgemm(
'N',
'N', m, l, n-l, one, b, ldb,
409 $ v, ldv, one, work, ldwork )
410 CALL sgemm(
'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 strmm(
'R',
'U', trans,
'N', m, k, one, t, ldt,
424 a( i, j ) = a( i, j ) - work( i, j )
428 CALL sgemm(
'N',
'T', m, n-l, k, -one, work, ldwork,
429 $ v, ldv, one, b, ldb )
430 CALL sgemm(
'N',
'T', m, l, k-l, -one, work( 1, kp ),
432 $ v( np, kp ), ldv, one, b( 1, np ), ldb )
433 CALL strmm(
'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 strmm(
'L',
'L',
'T',
'N', l, n, one, v( 1, kp ), ldv,
470 $ work( kp, 1 ), ldwork )
471 CALL sgemm(
'T',
'N', l, n, m-l, one, v( mp, kp ), ldv,
472 $ b( mp, 1 ), ldb, one, work( kp, 1 ), ldwork )
473 CALL sgemm(
'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 strmm(
'L',
'L', trans,
'N', k, n, one, t, ldt,
487 a( i, j ) = a( i, j ) - work( i, j )
491 CALL sgemm(
'N',
'N', m-l, n, k, -one, v( mp, 1 ), ldv,
492 $ work, ldwork, one, b( mp, 1 ), ldb )
493 CALL sgemm(
'N',
'N', l, n, k-l, -one, v, ldv,
494 $ work, ldwork, one, b, ldb )
495 CALL strmm(
'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 strmm(
'R',
'L',
'N',
'N', m, l, one, v( 1, kp ), ldv,
530 $ work( 1, kp ), ldwork )
531 CALL sgemm(
'N',
'N', m, l, n-l, one, b( 1, np ), ldb,
532 $ v( np, kp ), ldv, one, work( 1, kp ), ldwork )
533 CALL sgemm(
'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 strmm(
'R',
'L', trans,
'N', m, k, one, t, ldt,
547 a( i, j ) = a( i, j ) - work( i, j )
551 CALL sgemm(
'N',
'T', m, n-l, k, -one, work, ldwork,
552 $ v( np, 1 ), ldv, one, b( 1, np ), ldb )
553 CALL sgemm(
'N',
'T', m, l, k-l, -one, work, ldwork,
554 $ v, ldv, one, b, ldb )
555 CALL strmm(
'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 strmm(
'L',
'L',
'N',
'N', l, n, one, v( 1, mp ), ldv,
591 CALL sgemm(
'N',
'N', l, n, m-l, one, v, ldv,b, ldb,
592 $ one, work, ldwork )
593 CALL sgemm(
'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 strmm(
'L',
'U', trans,
'N', k, n, one, t, ldt,
607 a( i, j ) = a( i, j ) - work( i, j )
611 CALL sgemm(
'T',
'N', m-l, n, k, -one, v, ldv, work, ldwork,
613 CALL sgemm(
'T',
'N', l, n, k-l, -one, v( kp, mp ), ldv,
614 $ work( kp, 1 ), ldwork, one, b( mp, 1 ), ldb )
615 CALL strmm(
'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 strmm(
'R',
'L',
'T',
'N', m, l, one, v( 1, np ), ldv,
650 CALL sgemm(
'N',
'T', m, l, n-l, one, b, ldb, v, ldv,
651 $ one, work, ldwork )
652 CALL sgemm(
'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 strmm(
'R',
'U', trans,
'N', m, k, one, t, ldt,
666 a( i, j ) = a( i, j ) - work( i, j )
670 CALL sgemm(
'N',
'N', m, n-l, k, -one, work, ldwork,
671 $ v, ldv, one, b, ldb )
672 CALL sgemm(
'N',
'N', m, l, k-l, -one, work( 1, kp ),
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 )