296 SUBROUTINE ctfsm( TRANSR, SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, A,
304 CHARACTER TRANSR, DIAG, , TRANS, UPLO
309 COMPLEX A( 0: * ), B( 0: LDB-1, 0: * )
316 parameter( cone = ( 1.0e+0, 0.0e+0 ),
317 $ czero = ( 0.0e+0, 0.0e+0 ) )
320 LOGICAL LOWER, LSIDE, MISODD, NISODD, ,
322 INTEGER M1, M2, , N2, K, INFO, I, J
339 normaltransr = lsame( transr, 'n
' )
340 LSIDE = LSAME( SIDE, 'l
' )
341 LOWER = LSAME( UPLO, 'l
' )
342 NOTRANS = LSAME( TRANS, 'n
' )
343.NOT..AND..NOT.
IF( NORMALTRANSR LSAME( TRANSR, 'c' ) )
THEN
345 ELSE IF( .NOT.lside .AND. .NOT.lsame( side,
'R' ) )
THEN
347 ELSE IF( .NOT.lower .AND. .NOT.lsame( uplo,
'U' ) )
THEN
349 ELSE IF( .NOT.notrans .AND. .NOT.lsame( trans, 'c
' ) ) THEN
351.NOT.
ELSE IF( LSAME( DIAG, 'n.AND..NOT.
' ) LSAME( DIAG, 'u
' ) )
354.LT.
ELSE IF( M0 ) THEN
356.LT.
ELSE IF( N0 ) THEN
358.LT.
ELSE IF( LDBMAX( 1, M ) ) THEN
362 CALL XERBLA( 'ctfsm ', -INFO )
368.EQ..OR..EQ.
IF( ( M0 ) ( N0 ) )
373.EQ.
IF( ALPHACZERO ) THEN
390.EQ.
IF( MOD( M, 2 )0 ) THEN
408 IF( NORMALTRANSR ) THEN
422 CALL CTRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
425 CALL CTRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
426 $ A( 0 ), M, B, LDB )
427 CALL CGEMM( 'n
', 'n
', M2, N, M1, -CONE, A( M1 ),
428 $ M, B, LDB, ALPHA, B( M1, 0 ), LDB )
429 CALL CTRSM( 'l
', 'u',
'C', diag, m2, n, cone,
430 $ a( m ), m, b( m1, 0 ), ldb )
439 CALL ctrsm(
'L',
'L',
'C', diag, m1, n, alpha,
440 $ a( 0 ), m, b, ldb )
442 CALL ctrsm(
'L',
'U',
'N', diag, m2, n, alpha,
443 $ a( m ), m, b( m1, 0 ), ldb )
444 CALL cgemm(
'C',
'N', m1, n, m2, -cone, a( m1 ),
445 $ m, b( m1, 0 ), ldb, alpha, b, ldb )
446 CALL ctrsm(
'L', 'l
', 'c
', DIAG, M1, N, CONE,
447 $ A( 0 ), M, B, LDB )
456.NOT.
IF( NOTRANS ) THEN
461 CALL CTRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
462 $ A( M2 ), M, B, LDB )
463 CALL CGEMM( 'c
', 'n
', M2, N, M1, -CONE, A( 0 ), M,
464 $ B, LDB, ALPHA, B( M1, 0 ), LDB )
465 CALL CTRSM( 'l
', 'u
', 'c
', DIAG, M2, N, CONE,
466 $ A( M1 ), M, B( M1, 0 ), LDB )
473 CALL CTRSM( 'l
', 'u
', 'n
', DIAG, M2, N, ALPHA,
474 $ A( M1 ), M, B( M1, 0 ), LDB )
475 CALL CGEMM( 'n',
'N', m1, n, m2, -cone, a( 0 ), m,
476 $ b( m1, 0 ), ldb, alpha, b, ldb )
477 CALL ctrsm(
'L',
'L',
'C', diag, m1, n, cone,
478 $ a( m2 ), m, b, ldb )
498 CALL ctrsm(
'L',
'U',
'C', diag, m1, n, alpha,
499 $ a( 0 ), m1, b, ldb )
501 CALL ctrsm(
'L',
'U',
'C', diag, m1, n, alpha,
502 $ a( 0 ), m1, b, ldb )
503 CALL cgemm(
'C',
'N', m2, n, m1, -cone,
504 $ a( m1*m1 ), m1, b, ldb, alpha,
506 CALL ctrsm(
'L',
'L',
'N', diag, m2, n, cone,
507 $ a( 1 ), m1, b( m1, 0 ), ldb )
516 CALL ctrsm(
'L',
'U',
'N', diag, m1, n, alpha,
517 $ a( 0 ), m1, b, ldb )
519 CALL ctrsm(
'L',
'L',
'C', diag, m2, n, alpha,
520 $ a( 1 ), m1, b( m1, 0 ), ldb )
521 CALL cgemm(
'N',
'N', m1, n, m2, -cone,
522 $ a( m1*m1 ), m1, b( m1, 0 ), ldb,
524 CALL ctrsm(
'L',
'U',
'N', diag, m1, n, cone,
525 $ a( 0 ), m1, b, ldb )
534 IF( .NOT.notrans )
THEN
539 CALL ctrsm(
'L',
'U',
'C', diag, m1, n, alpha,
540 $ a( m2*m2 ), m2, b, ldb )
541 CALL cgemm(
'N',
'N', m2, n, m1, -cone, a( 0 ), m2,
542 $ b, ldb, alpha, b( m1, 0 ), ldb )
543 CALL ctrsm(
'L',
'L',
'N', diag, m2, n, cone,
544 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
551 CALL ctrsm(
'L',
'L',
'C', diag, m2, n, alpha,
552 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
553 CALL cgemm(
'C',
'N', m1, n, m2, -cone, a( 0 ), m2,
554 $ b( m1, 0 ), ldb, alpha, b, ldb )
555 CALL ctrsm(
'L',
'U',
'N', diag, m1, n, cone,
556 $ a( m2*m2 ), m2, b, ldb )
568 IF( normaltransr )
THEN
581 CALL ctrsm(
'L',
'L',
'N', diag, k, n, alpha,
582 $ a( 1 ), m+1, b, ldb )
583 CALL cgemm(
'N',
'N', k, n, k, -cone, a( k+1 ),
584 $ m+1, b, ldb, alpha, b( k, 0 ), ldb )
585 CALL ctrsm(
'L',
'U',
'C', diag, k, n, cone,
586 $ a( 0 ), m+1, b( k, 0 ), ldb )
593 CALL ctrsm(
'L',
'U',
'N', diag, k, n, alpha,
594 $ a( 0 ), m+1, b( k, 0 ), ldb )
595 CALL cgemm(
'C',
'N', k, n, k, -cone, a( k+1 ),
596 $ m+1, b( k, 0 ), ldb, alpha, b, ldb )
597 CALL ctrsm(
'L',
'L',
'C', diag, k, n, cone,
598 $ a( 1 ), m+1, b, ldb )
606 IF( .NOT.notrans )
THEN
611 CALL ctrsm(
'L',
'L',
'N', diag, k, n, alpha,
612 $ a( k+1 ), m+1, b, ldb )
613 CALL cgemm(
'C',
'N', k, n, k, -cone, a( 0 ), m+1,
614 $ b, ldb, alpha, b( k, 0 ), ldb )
615 CALL ctrsm(
'L',
'U',
'C', diag, k, n, cone,
616 $ a( k ), m+1, b( k, 0 ), ldb )
622 CALL ctrsm(
'L',
'U',
'N', diag, k, n, alpha,
623 $ a( k ), m+1, b( k, 0 ), ldb )
624 CALL cgemm(
'N',
'N', k, n, k, -cone, a( 0 ), m+1,
625 $ b( k, 0 ), ldb, alpha, b, ldb )
626 CALL ctrsm(
'L',
'L',
'C', diag, k, n, cone,
627 $ a( k+1 ), m+1, b, ldb )
646 CALL ctrsm(
'L',
'U',
'C', diag, k, n, alpha,
647 $ a( k ), k, b, ldb )
648 CALL cgemm(
'C',
'N', k, n, k, -cone,
649 $ a( k*( k+1 ) ), k, b, ldb, alpha,
651 CALL ctrsm(
'L',
'L',
'N', diag, k, n, cone,
652 $ a( 0 ), k, b( k, 0 ), ldb )
659 CALL ctrsm(
'L',
'L',
'C', diag, k, n, alpha,
660 $ a( 0 ), k, b( k, 0 ), ldb )
661 CALL cgemm(
'N',
'N', k, n, k, -cone,
662 $ a( k*( k+1 ) ), k, b( k, 0 ), ldb,
664 CALL ctrsm(
'L',
'U',
'N', diag, k, n, cone,
665 $ a( k ), k, b, ldb )
673 IF( .NOT.notrans )
THEN
678 CALL ctrsm(
'L',
'U',
'C', diag, k, n, alpha,
679 $ a( k*( k+1 ) ), k, b, ldb )
680 CALL cgemm(
'N',
'N', k, n, k, -cone, a( 0 ), k, b,
681 $ ldb, alpha, b( k, 0 ), ldb )
682 CALL ctrsm(
'L',
'L',
'N', diag, k, n, cone,
683 $ a( k*k ), k, b( k, 0 ), ldb )
690 CALL ctrsm(
'L',
'L',
'C'
691 $ a( k*k ), k, b( k, 0 ), ldb )
692 CALL cgemm(
'C',
'N', k, n, k, -cone, a( 0 ), k,
693 $ b( k, 0 ), ldb, alpha, b, ldb )
694 CALL ctrsm(
'L',
'U',
'N', diag, k, n, cone,
695 $ a( k*( k+1 ) ), k, b, ldb )
713 IF( mod( n, 2 ).EQ.0 )
THEN
731 IF( normaltransr )
THEN
744 CALL ctrsm(
'R',
'U',
'C', diag, m, n2, alpha,
745 $ a( n ), n, b( 0, n1 ), ldb )
746 CALL cgemm(
'N',
'N', m, n1, n2, -cone, b( 0, n1 ),
747 $ ldb, a( n1 ), n, alpha, b( 0, 0 ),
749 CALL ctrsm(
'R',
'L',
'N', diag, m, n1, cone,
750 $ a( 0 ), n, b( 0, 0 ), ldb )
757 CALL ctrsm(
'R',
'L',
'C', diag, m, n1, alpha,
758 $ a( 0 ), n, b( 0, 0 ), ldb )
759 CALL cgemm(
'N',
'C', m, n2, n1, -cone, b( 0, 0 ),
760 $ ldb, a( n1 ), n, alpha, b( 0, n1 ),
762 CALL ctrsm(
'R',
'U',
'N', diag, m, n2, cone,
763 $ a( n ), n, b( 0, n1 ), ldb )
776 CALL ctrsm( 'r
', 'l
', 'c
', DIAG, M, N1, ALPHA,
777 $ A( N2 ), N, B( 0, 0 ), LDB )
778 CALL CGEMM( 'n
', 'n
', M, N2, N1, -CONE, B( 0, 0 ),
779 $ LDB, A( 0 ), N, ALPHA, B( 0, N1 ),
781 CALL CTRSM( 'r
', 'u
', 'n
', DIAG, M, N2, CONE,
782 $ A( N1 ), N, B( 0, N1 ), LDB )
789 CALL CTRSM( 'r
', 'u
', 'c
', DIAG, M, N2, ALPHA,
790 $ A( N1 ), N, B( 0, N1 ), LDB )
791 CALL CGEMM( 'n
', 'c
', M, N1, N2, -CONE, B( 0, N1 ),
792 $ LDB, A( 0 ), N, ALPHA, B( 0, 0 ), LDB )
793 CALL CTRSM( 'r
', 'l
', 'n
', DIAG, M, N1, CONE,
794 $ A( N2 ), N, B( 0, 0 ), LDB )
813 CALL CTRSM( 'r
', 'l
', 'n
', DIAG, M, N2, ALPHA,
814 $ A( 1 ), N1, B( 0, N1 ), LDB )
815 CALL CGEMM( 'n
', 'c
', M, N1, N2, -CONE, B( 0, N1 ),
816 $ LDB, A( N1*N1 ), N1, ALPHA, B( 0, 0 ),
818 CALL CTRSM( 'r
', 'u
', 'c
', DIAG, M, N1, CONE,
819 $ A( 0 ), N1, B( 0, 0 ), LDB )
826 CALL CTRSM( 'r
', 'u
', 'n
', DIAG, M, N1, ALPHA,
827 $ A( 0 ), N1, B( 0, 0 ), LDB )
828 CALL CGEMM( 'n
', 'n
', M, N2, N1, -CONE, B( 0, 0 ),
829 $ LDB, A( N1*N1 ), N1, ALPHA, B( 0, N1 ),
831 CALL CTRSM( 'r
', 'l
', 'c
', DIAG, M, N2, CONE,
832 $ A( 1 ), N1, B( 0, N1 ), LDB )
845 CALL CTRSM( 'r
', 'u
', 'n
', DIAG, M, N1, ALPHA,
846 $ A( N2*N2 ), N2, B( 0, 0 ), LDB )
847 CALL CGEMM( 'n
', 'c
', M, N2, N1, -CONE, B( 0, 0 ),
848 $ LDB, A( 0 ), N2, ALPHA, B( 0, N1 ),
850 CALL CTRSM( 'r
', 'l
', 'c
', DIAG, M, N2, CONE,
851 $ A( N1*N2 ), N2, B( 0, N1 ), LDB )
858 CALL CTRSM( 'r
', 'l
', 'n
', DIAG, M, N2, ALPHA,
859 $ A( N1*N2 ), N2, B( 0, N1 ), LDB )
860 CALL CGEMM( 'n
', 'n
', M, N1, N2, -CONE, B( 0, N1 ),
861 $ LDB, A( 0 ), N2, ALPHA, B( 0, 0 ),
863 CALL CTRSM( 'r
', 'u
', 'c
', DIAG, M, N1, CONE,
864 $ A( N2*N2 ), N2, B( 0, 0 ), LDB )
876 IF( NORMALTRANSR ) THEN
889 CALL CTRSM( 'r
', 'u
', 'c
', DIAG, M, K, ALPHA,
890 $ A( 0 ), N+1, B( 0, K ), LDB )
891 CALL CGEMM( 'n
', 'n
', M, K, K, -CONE, B( 0, K ),
892 $ LDB, A( K+1 ), N+1, ALPHA, B( 0, 0 ),
894 CALL CTRSM( 'r
', 'l
', 'n
', DIAG, M, K, CONE,
895 $ A( 1 ), N+1, B( 0, 0 ), LDB )
902 CALL CTRSM( 'r
', 'l
', 'c
', DIAG, M, K, ALPHA,
903 $ A( 1 ), N+1, B( 0, 0 ), LDB )
904 CALL CGEMM( 'n
', 'c
', M, K, K, -CONE, B( 0, 0 ),
905 $ LDB, A( K+1 ), N+1, ALPHA, B( 0, K ),
907 CALL CTRSM( 'r
', 'u
', 'n
', DIAG, M, K, CONE,
908 $ A( 0 ), N+1, B( 0, K ), LDB )
921 CALL CTRSM( 'r
', 'l
', 'c
', DIAG, M, K, ALPHA,
922 $ A( K+1 ), N+1, B( 0, 0 ), LDB )
923 CALL CGEMM( 'n
', 'n
', M, K, K, -CONE, B( 0, 0 ),
924 $ LDB, A( 0 ), N+1, ALPHA, B( 0, K ),
926 CALL CTRSM( 'r
', 'u
', 'n
', DIAG, M, K, CONE,
927 $ A( K ), N+1, B( 0, K ), LDB )
934 CALL CTRSM( 'r
', 'u
', 'c
', DIAG, M, K, ALPHA,
935 $ A( K ), N+1, B( 0, K ), LDB )
936 CALL CGEMM( 'n
', 'c
', M, K, K, -CONE, B( 0, K ),
937 $ LDB, A( 0 ), N+1, ALPHA, B( 0, 0 ),
939 CALL CTRSM( 'r
', 'l
', 'n
', DIAG, M, K, CONE,
940 $ A( K+1 ), N+1, B( 0, 0 ), LDB )
959 CALL CTRSM( 'r
', 'l
', 'n
', DIAG, M, K, ALPHA,
960 $ A( 0 ), K, B( 0, K ), LDB )
961 CALL CGEMM( 'n
', 'c
', M, K, K, -CONE, B( 0, K ),
962 $ LDB, A( ( K+1 )*K ), K, ALPHA,
964 CALL CTRSM( 'r
', 'u
', 'c
', DIAG, M, K, CONE,
965 $ A( K ), K, B( 0, 0 ), LDB )
972 CALL CTRSM( 'r
', 'u
', 'n
', DIAG, M, K, ALPHA,
973 $ A( K ), K, B( 0, 0 ), LDB )
974 CALL CGEMM( 'n
', 'n
', M, K, K, -CONE, B( 0, 0 ),
975 $ LDB, A( ( K+1 )*K ), K, ALPHA,
977 CALL CTRSM( 'r
', 'l
', 'c
', DIAG, M, K, CONE,
978 $ A( 0 ), K, B( 0, K ), LDB )
991 CALL CTRSM( 'r
', 'u
', 'n
', DIAG, M, K, ALPHA,
992 $ A( ( K+1 )*K ), K, B( 0, 0 ), LDB )
993 CALL CGEMM( 'n
', 'c
', M, K, K, -CONE, B( 0, 0 ),
994 $ LDB, A( 0 ), K, ALPHA, B( 0, K ), LDB )
995 CALL CTRSM( 'r
', 'l
', 'c
', DIAG, M, K, CONE,
996 $ A( K*K ), K, B( 0, K ), LDB )
1003 CALL CTRSM( 'r
', 'l',
'N', diag, m, k, alpha,
1004 $ a( k*k ), k, b( 0, k ), ldb )
1005 CALL cgemm( 'n
', 'n
', M, K, K, -CONE, B( 0, K ),
1006 $ LDB, A( 0 ), K, ALPHA, B( 0, 0 ), LDB )
1007 CALL CTRSM( 'r
', 'u
', 'c
', DIAG, M, K, CONE,
1008 $ A( ( K+1 )*K ), K, B( 0, 0 ), LDB )