296 SUBROUTINE ztfsm( TRANSR, SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, A,
304 CHARACTER TRANSR, DIAG, SIDE, TRANS, UPLO
309 COMPLEX*16 A( 0: * ), B( 0: LDB-1, 0: * )
315 COMPLEX*16 CONE, CZERO
316 parameter( cone = ( 1.0d+0, 0.0d+0 ),
317 $ czero = ( 0.0d+0, 0.0d+0 ) )
320 LOGICAL LOWER, LSIDE, MISODD, NISODD, NORMALTRANSR,
322 INTEGER M1, M2, N1, 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.NOT..AND..NOT.
ELSE IF( LSIDE LSAME( SIDE, 'r
' ) ) THEN
347.NOT..AND..NOT.
ELSE IF( LOWER LSAME( UPLO, 'u
' ) ) THEN
349.NOT..AND..NOT.
ELSE IF( NOTRANS 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( 'ztfsm ', -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 ZTRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
425 CALL ZTRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
426 $ A( 0 ), M, B, LDB )
427 CALL ZGEMM( 'n
', 'n
', M2, N, M1, -CONE, A( M1 ),
428 $ M, B, LDB, ALPHA, B( M1, 0 ), LDB )
429 CALL ZTRSM( 'l
', 'u
', 'c
', DIAG, M2, N, CONE,
430 $ A( M ), M, B( M1, 0 ), LDB )
439 CALL ZTRSM( 'l
', 'l
', 'c
', DIAG, M1, N, ALPHA,
440 $ A( 0 ), M, B, LDB )
442 CALL ZTRSM( 'l
', 'u
', 'n
', DIAG, M2, N, ALPHA,
443 $ A( M ), M, B( M1, 0 ), LDB )
444 CALL ZGEMM( 'c
', 'n
', M1, N, M2, -CONE, A( M1 ),
445 $ M, B( M1, 0 ), LDB, ALPHA, B, LDB )
446 CALL ZTRSM( 'l
', 'l
', 'c
', DIAG, M1, N, CONE,
447 $ A( 0 ), M, B, LDB )
456.NOT.
IF( NOTRANS ) THEN
461 CALL ZTRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
462 $ A( M2 ), M, B, LDB )
463 CALL ZGEMM( 'c
', 'n
', M2, N, M1, -CONE, A( 0 ), M,
464 $ B, LDB, ALPHA, B( M1, 0 ), LDB )
465 CALL ZTRSM( 'l
', 'u
', 'c
', DIAG, M2, N, CONE,
466 $ A( M1 ), M, B( M1, 0 ), LDB )
473 CALL ZTRSM( 'l
', 'u
', 'n
', DIAG, M2, N, ALPHA,
474 $ A( M1 ), M, B( M1, 0 ), LDB )
475 CALL ZGEMM( 'n
', 'n
', M1, N, M2, -CONE, A( 0 ), M,
476 $ B( M1, 0 ), LDB, ALPHA, B, LDB )
477 CALL ZTRSM( 'l
', 'l
', 'c
', DIAG, M1, N, CONE,
478 $ A( M2 ), M, B, LDB )
498 CALL ZTRSM( 'l
', 'u
', 'c
', DIAG, M1, N, ALPHA,
499 $ A( 0 ), M1, B, LDB )
501 CALL ZTRSM( 'l
', 'u
', 'c
', DIAG, M1, N, ALPHA,
502 $ A( 0 ), M1, B, LDB )
503 CALL ZGEMM( 'c
', 'n
', M2, N, M1, -CONE,
504 $ A( M1*M1 ), M1, B, LDB, ALPHA,
506 CALL ZTRSM( 'l
', 'l
', 'n
', DIAG, M2, N, CONE,
507 $ A( 1 ), M1, B( M1, 0 ), LDB )
516 CALL ZTRSM( 'l
', 'u
', 'n
', DIAG, M1, N, ALPHA,
517 $ A( 0 ), M1, B, LDB )
519 CALL ZTRSM( 'l
', 'l
', 'c
', DIAG, M2, N, ALPHA,
520 $ A( 1 ), M1, B( M1, 0 ), LDB )
521 CALL ZGEMM( 'n
', 'n
', M1, N, M2, -CONE,
522 $ A( M1*M1 ), M1, B( M1, 0 ), LDB,
524 CALL ZTRSM( 'l
', 'u
', 'n
', DIAG, M1, N, CONE,
525 $ A( 0 ), M1, B, LDB )
534.NOT.
IF( NOTRANS ) THEN
539 CALL ZTRSM( 'l
', 'u
', 'c
', DIAG, M1, N, ALPHA,
540 $ A( M2*M2 ), M2, B, LDB )
541 CALL ZGEMM( 'n
', 'n
', M2, N, M1, -CONE, A( 0 ), M2,
542 $ B, LDB, ALPHA, B( M1, 0 ), LDB )
543 CALL ZTRSM( 'l
', 'l
', 'n
', DIAG, M2, N, CONE,
544 $ A( M1*M2 ), M2, B( M1, 0 ), LDB )
551 CALL ZTRSM( 'l
', 'l
', 'c
', DIAG, M2, N, ALPHA,
552 $ A( M1*M2 ), M2, B( M1, 0 ), LDB )
553 CALL ZGEMM( 'c
', 'n
', M1, N, M2, -CONE, A( 0 ), M2,
554 $ B( M1, 0 ), LDB, ALPHA, B, LDB )
555 CALL ZTRSM( 'l
', 'u
', 'n
', DIAG, M1, N, CONE,
556 $ A( M2*M2 ), M2, B, LDB )
568 IF( NORMALTRANSR ) THEN
581 CALL ZTRSM( 'l
', 'l
', 'n
', DIAG, K, N, ALPHA,
582 $ A( 1 ), M+1, B, LDB )
583 CALL ZGEMM( 'n
', 'n
', K, N, K, -CONE, A( K+1 ),
584 $ M+1, B, LDB, ALPHA, B( K, 0 ), LDB )
585 CALL ZTRSM( 'l
', 'u
', 'c
', DIAG, K, N, CONE,
586 $ A( 0 ), M+1, B( K, 0 ), LDB )
593 CALL ZTRSM( 'l
', 'u
', 'n
', DIAG, K, N, ALPHA,
594 $ A( 0 ), M+1, B( K, 0 ), LDB )
595 CALL ZGEMM( 'c
', 'n
', K, N, K, -CONE, A( K+1 ),
596 $ M+1, B( K, 0 ), LDB, ALPHA, B, LDB )
597 CALL ZTRSM( 'l
', 'l
', 'c
', DIAG, K, N, CONE,
598 $ A( 1 ), M+1, B, LDB )
606.NOT.
IF( NOTRANS ) THEN
611 CALL ZTRSM( 'l
', 'l
', 'n
', DIAG, K, N, ALPHA,
612 $ A( K+1 ), M+1, B, LDB )
613 CALL ZGEMM( 'c
', 'n
', K, N, K, -CONE, A( 0 ), M+1,
614 $ B, LDB, ALPHA, B( K, 0 ), LDB )
615 CALL ZTRSM( 'l
', 'u
', 'c
', DIAG, K, N, CONE,
616 $ A( K ), M+1, B( K, 0 ), LDB )
622 CALL ZTRSM( 'l
', 'u
', 'n
', DIAG, K, N, ALPHA,
623 $ A( K ), M+1, B( K, 0 ), LDB )
624 CALL ZGEMM( 'n
', 'n
', K, N, K, -CONE, A( 0 ), M+1,
625 $ B( K, 0 ), LDB, ALPHA, B, LDB )
626 CALL ZTRSM( 'l
', 'l
', 'c
', DIAG, K, N, CONE,
627 $ A( K+1 ), M+1, B, LDB )
646 CALL ZTRSM( 'l
', 'u
', 'c
', DIAG, K, N, ALPHA,
647 $ A( K ), K, B, LDB )
648 CALL ZGEMM( 'c',
'N', k, n, k, -cone,
649 $ a( k*( k+1 ) ), k, b, ldb, alpha,
651 CALL ztrsm(
'L',
'L',
'N', diag, k, n, cone,
652 $ a( 0 ), k, b( k, 0 ), ldb )
659 CALL ztrsm(
'L',
'L',
'C', diag, k, n, alpha,
660 $ a( 0 ), k, b( k, 0 ), ldb )
661 CALL zgemm(
'N',
'N', k, n, k, -cone,
662 $ a( k*( k+1 ) ), k, b( k, 0 ), ldb,
664 CALL ztrsm(
'L',
'U',
'N', diag, k, n, cone,
665 $ a( k ), k, b, ldb )
673 IF( .NOT.notrans )
THEN
678 CALL ztrsm(
'L',
'U',
'C', diag, k, n, alpha,
679 $ a( k*( k+1 ) ), k, b, ldb )
680 CALL zgemm(
'N',
'N', k, n, k, -cone, a( 0 ), k, b,
681 $ ldb, alpha, b( k, 0 ), ldb )
682 CALL ztrsm(
'L',
'L',
'N', diag, k, n, cone,
683 $ a( k*k ), k, b( k, 0 ), ldb )
690 CALL ztrsm(
'L',
'L',
'C', diag, k, n, alpha,
691 $ a( k*k ), k, b( k, 0 ), ldb )
692 CALL zgemm(
'C',
'N', k, n, k, -cone, a( 0 ), k,
693 $ b( k, 0 ), ldb, alpha, b, ldb )
694 CALL ztrsm(
'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 ztrsm(
'R',
'U',
'C', diag, m, n2, alpha,
745 $ a( n ), n, b( 0, n1 ), ldb )
746 CALL zgemm(
'N',
'N', m, n1, n2, -cone, b( 0, n1 ),
747 $ ldb, a( n1 ), n, alpha, b( 0, 0 ),
749 CALL ztrsm(
'R',
'L',
'N', diag, m, n1, cone,
750 $ a( 0 ), n, b( 0, 0 ), ldb )
757 CALL ztrsm(
'R',
'L',
'C', diag, m, n1, alpha,
758 $ a( 0 ), n, b( 0, 0 ), ldb )
759 CALL zgemm(
'N', 'c
', M, N2, N1, -CONE, B( 0, 0 ),
760 $ LDB, A( N1 ), N, ALPHA, B( 0, N1 ),
762 CALL ZTRSM( 'r
', 'u
', 'n
', DIAG, M, N2, CONE,
763 $ A( N ), N, B( 0, N1 ), LDB )
776 CALL ZTRSM( 'r
', 'l
', 'c
', DIAG, M, N1, ALPHA,
777 $ A( N2 ), N, B( 0, 0 ), LDB )
778 CALL ZGEMM( 'n
', 'n
', M, N2, N1, -CONE, B( 0, 0 ),
779 $ LDB, A( 0 ), N, ALPHA, B( 0, N1 ),
781 CALL ZTRSM( 'r
', 'u
', 'n
', DIAG, M, N2, CONE,
782 $ A( N1 ), N, B( 0, N1 ), LDB )
789 CALL ZTRSM( 'r
', 'u
', 'c
', DIAG, M, N2, ALPHA,
790 $ A( N1 ), N, B( 0, N1 ), LDB )
791 CALL ZGEMM( 'n
', 'c
', M, N1, N2, -CONE, B( 0, N1 ),
792 $ LDB, A( 0 ), N, ALPHA, B( 0, 0 ), LDB )
793 CALL ZTRSM( 'r
', 'l
', 'n
', DIAG, M, N1, CONE,
794 $ A( N2 ), N, B( 0, 0 ), LDB )
813 CALL ZTRSM( 'r
', 'l
', 'n
', DIAG, M, N2, ALPHA,
814 $ A( 1 ), N1, B( 0, N1 ), LDB )
815 CALL ZGEMM( 'n
', 'c
', M, N1, N2, -CONE, B( 0, N1 ),
816 $ LDB, A( N1*N1 ), N1, ALPHA, B( 0, 0 ),
818 CALL ZTRSM( 'r
', 'u
', 'c
', DIAG, M, N1, CONE,
819 $ A( 0 ), N1, B( 0, 0 ), LDB )
826 CALL ZTRSM( 'r
', 'u
', 'n
', DIAG, M, N1, ALPHA,
827 $ A( 0 ), N1, B( 0, 0 ), LDB )
828 CALL ZGEMM( 'n
', 'n
', M, N2, N1, -CONE, B( 0, 0 ),
829 $ LDB, A( N1*N1 ), N1, ALPHA, B( 0, N1 ),
831 CALL ZTRSM( 'r
', 'l
', 'c
', DIAG, M, N2, CONE,
832 $ A( 1 ), N1, B( 0, N1 ), LDB )
845 CALL ZTRSM( 'r
', 'u
', 'n
', DIAG, M, N1, ALPHA,
846 $ A( N2*N2 ), N2, B( 0, 0 ), LDB )
847 CALL ZGEMM( 'n
', 'c
', M, N2, N1, -CONE, B( 0, 0 ),
848 $ LDB, A( 0 ), N2, ALPHA, B( 0, N1 ),
850 CALL ZTRSM( 'r
', 'l
', 'c
', DIAG, M, N2, CONE,
851 $ A( N1*N2 ), N2, B( 0, N1 ), LDB )
858 CALL ZTRSM( 'r
', 'l
', 'n
', DIAG, M, N2, ALPHA,
859 $ A( N1*N2 ), N2, B( 0, N1 ), LDB )
860 CALL ZGEMM( 'n
', 'n
', M, N1, N2, -CONE, B( 0, N1 ),
861 $ LDB, A( 0 ), N2, ALPHA, B( 0, 0 ),
863 CALL ZTRSM( 'r
', 'u
', 'c
', DIAG, M, N1, CONE,
864 $ A( N2*N2 ), N2, B( 0, 0 ), LDB )
876 IF( NORMALTRANSR ) THEN
889 CALL ZTRSM( 'r
', 'u
', 'c
', DIAG, M, K, ALPHA,
890 $ A( 0 ), N+1, B( 0, K ), LDB )
891 CALL ZGEMM( 'n
', 'n
', M, K, K, -CONE, B( 0, K ),
892 $ LDB, A( K+1 ), N+1, ALPHA, B( 0, 0 ),
894 CALL ZTRSM( 'r
', 'l
', 'n
', DIAG, M, K, CONE,
895 $ A( 1 ), N+1, B( 0, 0 ), LDB )
902 CALL ZTRSM( 'r
', 'l
', 'c
', DIAG, M, K, ALPHA,
903 $ A( 1 ), N+1, B( 0, 0 ), LDB )
904 CALL ZGEMM( 'n
', 'c
', M, K, K, -CONE, B( 0, 0 ),
905 $ LDB, A( K+1 ), N+1, ALPHA, B( 0, K ),
907 CALL ZTRSM( 'r
', 'u
', 'n
', DIAG, M, K, CONE,
908 $ A( 0 ), N+1, B( 0, K ), LDB )
921 CALL ZTRSM( 'r
', 'l
', 'c
', DIAG, M, K, ALPHA,
922 $ A( K+1 ), N+1, B( 0, 0 ), LDB )
923 CALL ZGEMM( 'n
', 'n
', M, K, K, -CONE, B( 0, 0 ),
924 $ LDB, A( 0 ), N+1, ALPHA, B( 0, K ),
926 CALL ZTRSM( 'r
', 'u
', 'n
', DIAG, M, K, CONE,
927 $ A( K ), N+1, B( 0, K ), LDB )
934 CALL ZTRSM( 'r
', 'u
', 'c
', DIAG, M, K, ALPHA,
935 $ A( K ), N+1, B( 0, K ), LDB )
936 CALL ZGEMM( 'n
', 'c
', M, K, K, -CONE, B( 0, K ),
937 $ LDB, A( 0 ), N+1, ALPHA, B( 0, 0 ),
939 CALL ZTRSM( 'r
', 'l
', 'n
', DIAG, M, K, CONE,
940 $ A( K+1 ), N+1, B( 0, 0 ), LDB )
959 CALL ZTRSM( 'r
', 'l
', 'n
', DIAG, M, K, ALPHA,
960 $ A( 0 ), K, B( 0, K ), LDB )
961 CALL ZGEMM( 'n
', 'c
', M, K, K, -CONE, B( 0, K ),
962 $ LDB, A( ( K+1 )*K ), K, ALPHA,
964 CALL ZTRSM( 'r
', 'u
', 'c
', DIAG, M, K, CONE,
965 $ A( K ), K, B( 0, 0 ), LDB )
972 CALL ZTRSM( 'r
', 'u
', 'n
', DIAG, M, K, ALPHA,
973 $ A( K ), K, B( 0, 0 ), LDB )
974 CALL ZGEMM( 'n
', 'n
', M, K, K, -CONE, B( 0, 0 ),
975 $ LDB, A( ( K+1 )*K ), K, ALPHA,
977 CALL ZTRSM( 'r
', 'l
', 'c
', DIAG, M, K, CONE,
978 $ A( 0 ), K, B( 0, K ), LDB )
991 CALL ZTRSM( 'r
', 'u
', 'n
', DIAG, M, K, ALPHA,
992 $ A( ( K+1 )*K ), K, B( 0, 0 ), LDB )
993 CALL ZGEMM( 'n
', 'c
', M, K, K, -CONE, B( 0, 0 ),
994 $ LDB, A( 0 ), K, ALPHA, B( 0, K ), LDB )
995 CALL ZTRSM( 'r
', 'l
', 'c
', DIAG, M, K, CONE,
996 $ A( K*K ), K, B( 0, K ), LDB )
1003 CALL ZTRSM( 'r
', 'l
', 'n
', DIAG, M, K, ALPHA,
1004 $ A( K*K ), K, B( 0, K ), LDB )
1005 CALL ZGEMM( 'n
', 'n
', M, K, K, -CONE, B( 0, K ),
1006 $ LDB, A( 0 ), K, ALPHA, B( 0, 0 ), LDB )
1007 CALL ZTRSM( 'r
', 'u
', 'c
', DIAG, M, K, CONE,
1008 $ A( ( K+1 )*K ), K, B( 0, 0 ), LDB )
subroutine ztfsm(transr, side, uplo, trans, diag, m, n, alpha, a, b, ldb)
ZTFSM solves a matrix equation (one operand is a triangular matrix in RFP format).