296 SUBROUTINE ztfsm( TRANSR, SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, A,
304 CHARACTER TRANSR, DIAG, SIDE, TRANS, UPLO
309 COMPLEX*16 ( 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' )
342 notrans =
lsame( trans,
'N' )
343 IF( .NOT.normaltransr .AND. .NOT.
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 ELSE IF( .NOT.
lsame( diag,
'N' ) .AND. .NOT.
lsame( diag,
'U' ) )
354 ELSE IF( m.LT.0 )
THEN
356 ELSE IF( n.LT.0 )
THEN
358 ELSE IF( ldb.LT.
max( 1, m ) )
THEN
362 CALL xerbla(
'ZTFSM ', -info )
368 IF( ( m.EQ.0 ) .OR. ( n.EQ.0 ) )
373 IF( alpha.EQ.czero )
THEN
390 IF( mod( m, 2 ).EQ.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.NOT.
IF( 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.EQ.
IF( MOD( N, 2 )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,
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 )