249 SUBROUTINE ctprfb( 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
261 COMPLEX A( LDA, * ), B( LDB, * ), T( LDT, * ),
262 $ v( ldv, * ), work( ldwork, * )
269 parameter( one = (1.0,0.0), zero = (0.0,0.0) )
272 INTEGER I, J, MP, NP, KP
273 LOGICAL LEFT, FORWARD, COLUMN, , BACKWARD, ROW
289 IF( m.LE.0 .OR. n.LE.0 .OR. k.LE.0 .OR. l.LT.0 )
RETURN
291 IF( lsame( storev,
'C' ) )
THEN
294 ELSE IF ( lsame( storev,
'R' ) )
THEN
302 IF( lsame( side,
'L' ) )
THEN
305 ELSE IF( lsame( side,
'R' ) )
THEN
313 IF( lsame( direct,
'F' ) )
THEN
316 ELSE IF( lsame( direct,
'B' ) )
THEN
326 IF( column .AND. forward .AND. left )
THEN
348 work( i, j ) = b( m-l+i, j )
351 CALL ctrmm(
'L',
'U',
'C',
'N', l, n, one, v( mp, 1 ), ldv,
353 CALL cgemm(
'C',
'N', l, n, m-l, one, v, ldv, b, ldb,
354 $ one, work, ldwork )
355 CALL cgemm(
'C',
'N', k-l, n, m, one, v( 1, kp ), ldv,
356 $ b, ldb, zero, work( kp, 1 ), ldwork )
360 work( i, j ) = work( i, j ) + a( i, j )
364 CALL ctrmm(
'L',
'U', trans,
'N', k, n, one, t, ldt,
369 a( i, j ) = a( i, j ) - work( i, j )
373 CALL cgemm(
'N',
'N', m-l, n, k, -one, v, ldv, work, ldwork,
375 CALL cgemm(
'N',
'N', l, n, k-l, -one, v( mp, kp ), ldv,
377 CALL ctrmm(
'L',
'U',
'N',
'N', l, n, one, v( mp, 1 ), ldv,
381 b( m-l+i, j ) = b( m-l+i, j ) - work( i, j )
387 ELSE IF( column .AND. forward .AND. right )
THEN
408 work( i, j ) = b( i, n-l+j )
411 CALL ctrmm(
'R',
'U',
'N',
'N', m, l, one, v( np, 1 ), ldv,
413 CALL cgemm(
'N', 'n
', M, L, N-L, ONE, B, LDB,
414 $ V, LDV, ONE, WORK, LDWORK )
415 CALL CGEMM( 'n
', 'n
', M, K-L, N, ONE, B, LDB,
416 $ V( 1, KP ), LDV, ZERO, WORK( 1, KP ), LDWORK )
420 WORK( I, J ) = WORK( I, J ) + A( I, J )
424 CALL CTRMM( 'r
', 'u
', TRANS, 'n
', M, K, ONE, T, LDT,
429 A( I, J ) = A( I, J ) - WORK( I, J )
433 CALL CGEMM( 'n
', 'c
', M, N-L, K, -ONE, WORK, LDWORK,
434 $ V, LDV, ONE, B, LDB )
435 CALL CGEMM( 'n
', 'c
', M, L, K-L, -ONE, WORK( 1, KP ), LDWORK,
436 $ V( NP, KP ), LDV, ONE, B( 1, NP ), LDB )
437 CALL CTRMM( 'r
', 'u
', 'c
', 'n
', M, L, ONE, V( NP, 1 ), LDV,
441 B( I, N-L+J ) = B( I, N-L+J ) - WORK( I, J )
447.AND..AND.
ELSE IF( COLUMN BACKWARD LEFT ) THEN
469 WORK( K-L+I, J ) = B( I, J )
473 CALL CTRMM( 'l
', 'l
', 'c
', 'n
', L, N, ONE, V( 1, KP ), LDV,
474 $ WORK( KP, 1 ), LDWORK )
475 CALL CGEMM( 'c
', 'n
', L, N, M-L, ONE, V( MP, KP ), LDV,
476 $ B( MP, 1 ), LDB, ONE, WORK( KP, 1 ), LDWORK )
477 CALL CGEMM( 'c
', 'n
', K-L, N, M, ONE, V, LDV,
478 $ B, LDB, ZERO, WORK, LDWORK )
482 WORK( I, J ) = WORK( I, J ) + A( I, J )
486 CALL CTRMM( 'l
', 'l
', TRANS, 'n
', K, N, ONE, T, LDT,
491 A( I, J ) = A( I, J ) - WORK( I, J )
495 CALL CGEMM( 'n
', 'n
', M-L, N, K, -ONE, V( MP, 1 ), LDV,
496 $ WORK, LDWORK, ONE, B( MP, 1 ), LDB )
497 CALL CGEMM( 'n
', 'n
', L, N, K-L, -ONE, V, LDV,
498 $ WORK, LDWORK, ONE, B, LDB )
499 CALL CTRMM( 'l
', 'l
', 'n
', 'n
', L, N, ONE, V( 1, KP ), LDV,
500 $ WORK( KP, 1 ), LDWORK )
503 B( I, J ) = B( I, J ) - WORK( K-L+I, J )
509.AND..AND.
ELSE IF( COLUMN BACKWARD RIGHT ) THEN
530 WORK( I, K-L+J ) = B( I, J )
533 CALL CTRMM( 'r
', 'l
', 'n
', 'n
', M, L, ONE, V( 1, KP ), LDV,
534 $ WORK( 1, KP ), LDWORK )
535 CALL CGEMM( 'n
', 'n
', M, L, N-L, ONE, B( 1, NP ), LDB,
536 $ V( NP, KP ), LDV, ONE, WORK( 1, KP ), LDWORK )
537 CALL CGEMM( 'n
', 'n
', M, K-L, N, ONE, B, LDB,
538 $ V, LDV, ZERO, WORK, LDWORK )
542 WORK( I, J ) = WORK( I, J ) + A( I, J )
546 CALL CTRMM( 'r
', 'l
', TRANS, 'n
', M, K, ONE, T, LDT,
551 A( I, J ) = A( I, J ) - WORK( I, J )
555 CALL CGEMM( 'n
', 'c
', M, N-L, K, -ONE, WORK, LDWORK,
556 $ V( NP, 1 ), LDV, ONE, B( 1, NP ), LDB )
557 CALL CGEMM( 'n
', 'c
', M, L, K-L, -ONE, WORK, LDWORK,
558 $ V, LDV, ONE, B, LDB )
559 CALL CTRMM( 'r
', 'l
', 'c
', 'n
', M, L, ONE, V( 1, KP ), LDV,
560 $ WORK( 1, KP ), LDWORK )
563 B( I, J ) = B( I, J ) - WORK( I, K-L+J )
569.AND..AND.
ELSE IF( ROW FORWARD LEFT ) THEN
590 WORK( I, J ) = B( M-L+I, J )
593 CALL CTRMM( 'l
', 'l
', 'n
', 'n
', L, N, ONE, V( 1, MP ), LDV,
595 CALL CGEMM( 'n
', 'n
', L, N, M-L, ONE, V, LDV,B, LDB,
596 $ ONE, WORK, LDWORK )
597 CALL CGEMM( 'n
', 'n
', K-L, N, M, ONE, V( KP, 1 ), LDV,
598 $ B, LDB, ZERO, WORK( KP, 1 ), LDWORK )
602 WORK( I, J ) = WORK( I, J ) + A( I, J )
606 CALL CTRMM( 'l
', 'u
', TRANS, 'n
', K, N, ONE, T, LDT,
611 A( I, J ) = A( I, J ) - WORK( I, J )
615 CALL CGEMM( 'c
', 'n
', M-L, N, K, -ONE, V, LDV, WORK, LDWORK,
617 CALL CGEMM( 'c
', 'n
', L, N, K-L, -ONE, V( KP, MP ), LDV,
618 $ WORK( KP, 1 ), LDWORK, ONE, B( MP, 1 ), LDB )
619 CALL CTRMM( 'l
', 'l
', 'c
', 'n
', L, N, ONE, V( 1, MP ), LDV,
623 B( M-L+I, J ) = B( M-L+I, J ) - WORK( I, J )
629.AND..AND.
ELSE IF( ROW FORWARD RIGHT ) THEN
649 WORK( I, J ) = B( I, N-L+J )
652 CALL CTRMM( 'r
', 'l
', 'c
', 'n
', M, L, ONE, V( 1, NP ), LDV,
654 CALL CGEMM( 'n
', 'c
', M, L, N-L, ONE, B, LDB, V, LDV,
655 $ ONE, WORK, LDWORK )
656 CALL CGEMM( 'n
', 'c
', M, K-L, N, ONE, B, LDB,
657 $ V( KP, 1 ), LDV, ZERO, WORK( 1, KP ), LDWORK )
661 WORK( I, J ) = WORK( I, J ) + A( I, J )
665 CALL CTRMM( 'r
', 'u
', TRANS, 'n
', M, K, ONE, T, LDT,
670 A( I, J ) = A( I, J ) - WORK( I, J )
674 CALL CGEMM( 'n
', 'n
', M, N-L, K, -ONE, WORK, LDWORK,
675 $ V, LDV, ONE, B, LDB )
676 CALL CGEMM( 'n
', 'n
', M, L, K-L, -ONE, WORK( 1, KP ), LDWORK,
677 $ V( KP, NP ), LDV, ONE, B( 1, NP ), LDB )
678 CALL CTRMM( 'r
', 'l
', 'n
', 'n
', M, L, ONE, V( 1, NP ), LDV,
682 B( I, N-L+J ) = B( I, N-L+J ) - WORK( I, J )
688.AND..AND.
ELSE IF( ROW BACKWARD LEFT ) THEN
709 WORK( K-L+I, J ) = B( I, J )
712 CALL CTRMM( 'l
', 'u
', 'n
', 'n
', L, N, ONE, V( KP, 1 ), LDV,
713 $ WORK( KP, 1 ), LDWORK )
714 CALL CGEMM( 'n
', 'n
', L, N, M-L, ONE, V( KP, MP ), LDV,
715 $ B( MP, 1 ), LDB, ONE, WORK( KP, 1 ), LDWORK )
716 CALL CGEMM( 'n
', 'n
', K-L, N, M, ONE, V, LDV, B, LDB,
717 $ ZERO, WORK, LDWORK )
721 WORK( I, J ) = WORK( I, J ) + A( I, J )
725 CALL CTRMM( 'l
', 'l
', TRANS, 'n
', K, N, ONE, T, LDT,
730 A( I, J ) = A( I, J ) - WORK( I, J )
734 CALL CGEMM( 'c
', 'n
', M-L, N, K, -ONE, V( 1, MP ), LDV,
735 $ WORK, LDWORK, ONE, B( MP, 1 ), LDB )
736 CALL CGEMM( 'c
', 'n
', L, N, K-L, -ONE, V, LDV,
737 $ WORK, LDWORK, ONE, B, LDB )
738 CALL CTRMM( 'l
', 'u
', 'c
', 'n
', L, N, ONE, V( KP, 1 ), LDV,
739 $ WORK( KP, 1 ), LDWORK )
742 B( I, J ) = B( I, J ) - WORK( K-L+I, J )
748.AND..AND.
ELSE IF( ROW BACKWARD RIGHT ) THEN
768 WORK( I, K-L+J ) = B( I, J )
771 CALL CTRMM( 'r
', 'u
', 'c
', 'n
', M, L, ONE, V( KP, 1 ), LDV,
772 $ WORK( 1, KP ), LDWORK )
773 CALL CGEMM( 'n
', 'c
', M, L, N-L, ONE, B( 1, NP ), LDB,
774 $ V( KP, NP ), LDV, ONE, WORK( 1, KP ), LDWORK )
775 CALL CGEMM( 'n
', 'c
', M, K-L, N, ONE, B, LDB, V, LDV,
776 $ ZERO, WORK, LDWORK )
780 WORK( I, J ) = WORK( I, J ) + A( I, J )
784 CALL CTRMM( 'r
', 'l
', TRANS, 'n
', M, K, ONE, T, LDT,
789 A( I, J ) = A( I, J ) - WORK( I, J )
793 CALL CGEMM( 'n
', 'n
', M, N-L, K, -ONE, WORK, LDWORK,
794 $ V( 1, NP ), LDV, ONE, B( 1, NP ), LDB )
795 CALL CGEMM( 'n
', 'n
', M, L, K-L , -ONE, WORK, LDWORK,
796 $ V, LDV, ONE, B, LDB )
797 CALL CTRMM( 'r
', 'u
', 'n
', 'n
', M, L, ONE, V( KP, 1 ), LDV,
798 $ WORK( 1, KP ), LDWORK )
801 B( I, J ) = B( I, J ) - WORK( I, K-L+J )
subroutine ctprfb(side, trans, direct, storev, m, n, k, l, v, ldv, t, ldt, a, lda, b, ldb, work, ldwork)
CTPRFB applies a real or complex "triangular-pentagonal" blocked reflector to a real or complex matri...