295 SUBROUTINE ztfsm( TRANSR, SIDE, UPLO, TRANS, DIAG, M, N, ALPHA,
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 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.
352 $ .NOT.lsame( diag,
'U' ) )
355 ELSE IF( m.LT.0 )
THEN
357 ELSE IF( n.LT.0 )
THEN
359 ELSE IF( ldb.LT.max( 1, m ) )
THEN
363 CALL xerbla(
'ZTFSM ', -info )
369 IF( ( m.EQ.0 ) .OR. ( n.EQ.0 ) )
374 IF( alpha.EQ.czero )
THEN
391 IF( mod( m, 2 ).EQ.0 )
THEN
409 IF( normaltransr )
THEN
423 CALL ztrsm(
'L',
'L',
'N', diag, m1, n,
427 CALL ztrsm(
'L',
'L',
'N', diag, m1, n,
429 $ a( 0 ), m, b, ldb )
430 CALL zgemm(
'N',
'N', m2, n, m1, -cone,
432 $ m, b, ldb, alpha, b( m1, 0 ), ldb )
433 CALL ztrsm(
'L',
'U',
'C', diag, m2, n, cone,
434 $ a( m ), m, b( m1, 0 ), ldb )
443 CALL ztrsm(
'L',
'L',
'C', diag, m1, n,
445 $ a( 0 ), m, b, ldb )
447 CALL ztrsm(
'L',
'U',
'N', diag, m2, n,
449 $ a( m ), m, b( m1, 0 ), ldb )
450 CALL zgemm(
'C',
'N', m1, n, m2, -cone,
452 $ m, b( m1, 0 ), ldb, alpha, b, ldb )
453 CALL ztrsm(
'L',
'L',
'C', diag, m1, n, cone,
454 $ a( 0 ), m, b, ldb )
463 IF( .NOT.notrans )
THEN
468 CALL ztrsm(
'L',
'L',
'N', diag, m1, n, alpha,
469 $ a( m2 ), m, b, ldb )
470 CALL zgemm(
'C',
'N', m2, n, m1, -cone, a( 0 ),
472 $ b, ldb, alpha, b( m1, 0 ), ldb )
473 CALL ztrsm(
'L',
'U',
'C', diag, m2, n, cone,
474 $ a( m1 ), m, b( m1, 0 ), ldb )
481 CALL ztrsm(
'L',
'U',
'N', diag, m2, n, alpha,
482 $ a( m1 ), m, b( m1, 0 ), ldb )
483 CALL zgemm(
'N',
'N', m1, n, m2, -cone, a( 0 ),
485 $ b( m1, 0 ), ldb, alpha, b, ldb )
486 CALL ztrsm(
'L',
'L',
'C', diag, m1, n, cone,
487 $ a( m2 ), m, b, ldb )
507 CALL ztrsm(
'L',
'U',
'C', diag, m1, n,
509 $ a( 0 ), m1, b, ldb )
511 CALL ztrsm(
'L',
'U',
'C', diag, m1, n,
513 $ a( 0 ), m1, b, ldb )
514 CALL zgemm(
'C',
'N', m2, n, m1, -cone,
515 $ a( m1*m1 ), m1, b, ldb, alpha,
517 CALL ztrsm(
'L',
'L',
'N', diag, m2, n, cone,
518 $ a( 1 ), m1, b( m1, 0 ), ldb )
527 CALL ztrsm(
'L',
'U',
'N', diag, m1, n,
529 $ a( 0 ), m1, b, ldb )
531 CALL ztrsm(
'L',
'L',
'C', diag, m2, n,
533 $ a( 1 ), m1, b( m1, 0 ), ldb )
534 CALL zgemm(
'N',
'N', m1, n, m2, -cone,
535 $ a( m1*m1 ), m1, b( m1, 0 ), ldb,
537 CALL ztrsm(
'L',
'U',
'N', diag, m1, n, cone,
538 $ a( 0 ), m1, b, ldb )
547 IF( .NOT.notrans )
THEN
552 CALL ztrsm(
'L',
'U',
'C', diag, m1, n, alpha,
553 $ a( m2*m2 ), m2, b, ldb )
554 CALL zgemm(
'N',
'N', m2, n, m1, -cone, a( 0 ),
556 $ b, ldb, alpha, b( m1, 0 ), ldb )
557 CALL ztrsm(
'L',
'L',
'N', diag, m2, n, cone,
558 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
565 CALL ztrsm(
'L',
'L',
'C', diag, m2, n, alpha,
566 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
567 CALL zgemm(
'C',
'N', m1, n, m2, -cone, a( 0 ),
569 $ b( m1, 0 ), ldb, alpha, b, ldb )
570 CALL ztrsm(
'L',
'U',
'N', diag, m1, n, cone,
571 $ a( m2*m2 ), m2, b, ldb )
583 IF( normaltransr )
THEN
596 CALL ztrsm(
'L',
'L',
'N', diag, k, n, alpha,
597 $ a( 1 ), m+1, b, ldb )
598 CALL zgemm(
'N',
'N', k, n, k, -cone, a( k+1 ),
599 $ m+1, b, ldb, alpha, b( k, 0 ), ldb )
600 CALL ztrsm(
'L',
'U',
'C', diag, k, n, cone,
601 $ a( 0 ), m+1, b( k, 0 ), ldb )
608 CALL ztrsm(
'L',
'U',
'N', diag, k, n, alpha,
609 $ a( 0 ), m+1, b( k, 0 ), ldb )
610 CALL zgemm(
'C',
'N', k, n, k, -cone, a( k+1 ),
611 $ m+1, b( k, 0 ), ldb, alpha, b, ldb )
612 CALL ztrsm(
'L',
'L',
'C', diag, k, n, cone,
613 $ a( 1 ), m+1, b, ldb )
621 IF( .NOT.notrans )
THEN
626 CALL ztrsm(
'L',
'L',
'N', diag, k, n, alpha,
627 $ a( k+1 ), m+1, b, ldb )
628 CALL zgemm(
'C',
'N', k, n, k, -cone, a( 0 ),
630 $ b, ldb, alpha, b( k, 0 ), ldb )
631 CALL ztrsm(
'L',
'U',
'C', diag, k, n, cone,
632 $ a( k ), m+1, b( k, 0 ), ldb )
638 CALL ztrsm(
'L',
'U',
'N', diag, k, n, alpha,
639 $ a( k ), m+1, b( k, 0 ), ldb )
640 CALL zgemm(
'N',
'N', k, n, k, -cone, a( 0 ),
642 $ b( k, 0 ), ldb, alpha, b, ldb )
643 CALL ztrsm(
'L',
'L',
'C', diag, k, n, cone,
644 $ a( k+1 ), m+1, b, ldb )
663 CALL ztrsm(
'L',
'U',
'C', diag, k, n, alpha,
664 $ a( k ), k, b, ldb )
665 CALL zgemm(
'C',
'N', k, n, k, -cone,
666 $ a( k*( k+1 ) ), k, b, ldb, alpha,
668 CALL ztrsm(
'L',
'L',
'N', diag, k, n, cone,
669 $ a( 0 ), k, b( k, 0 ), ldb )
676 CALL ztrsm(
'L',
'L',
'C', diag, k, n, alpha,
677 $ a( 0 ), k, b( k, 0 ), ldb )
678 CALL zgemm(
'N',
'N', k, n, k, -cone,
679 $ a( k*( k+1 ) ), k, b( k, 0 ), ldb,
681 CALL ztrsm(
'L',
'U',
'N', diag, k, n, cone,
682 $ a( k ), k, b, ldb )
690 IF( .NOT.notrans )
THEN
695 CALL ztrsm(
'L',
'U',
'C', diag, k, n, alpha,
696 $ a( k*( k+1 ) ), k, b, ldb )
697 CALL zgemm(
'N',
'N', k, n, k, -cone, a( 0 ), k,
699 $ ldb, alpha, b( k, 0 ), ldb )
700 CALL ztrsm(
'L',
'L',
'N', diag, k, n, cone,
701 $ a( k*k ), k, b( k, 0 ), ldb )
708 CALL ztrsm(
'L',
'L',
'C', diag, k, n, alpha,
709 $ a( k*k ), k, b( k, 0 ), ldb )
710 CALL zgemm(
'C',
'N', k, n, k, -cone, a( 0 ), k,
711 $ b( k, 0 ), ldb, alpha, b, ldb )
712 CALL ztrsm(
'L',
'U',
'N', diag, k, n, cone,
713 $ a( k*( k+1 ) ), k, b, ldb )
731 IF( mod( n, 2 ).EQ.0 )
THEN
749 IF( normaltransr )
THEN
762 CALL ztrsm(
'R',
'U',
'C', diag, m, n2, alpha,
763 $ a( n ), n, b( 0, n1 ), ldb )
764 CALL zgemm(
'N',
'N', m, n1, n2, -cone, b( 0,
766 $ ldb, a( n1 ), n, alpha, b( 0, 0 ),
768 CALL ztrsm(
'R',
'L',
'N', diag, m, n1, cone,
769 $ a( 0 ), n, b( 0, 0 ), ldb )
776 CALL ztrsm(
'R',
'L',
'C', diag, m, n1, alpha,
777 $ a( 0 ), n, b( 0, 0 ), ldb )
778 CALL zgemm(
'N',
'C', m, n2, n1, -cone, b( 0,
780 $ ldb, a( n1 ), n, alpha, b( 0, n1 ),
782 CALL ztrsm(
'R',
'U',
'N', diag, m, n2, cone,
783 $ a( n ), n, b( 0, n1 ), ldb )
796 CALL ztrsm(
'R',
'L',
'C', diag, m, n1, alpha,
797 $ a( n2 ), n, b( 0, 0 ), ldb )
798 CALL zgemm(
'N',
'N', m, n2, n1, -cone, b( 0,
800 $ ldb, a( 0 ), n, alpha, b( 0, n1 ),
802 CALL ztrsm(
'R',
'U',
'N', diag, m, n2, cone,
803 $ a( n1 ), n, b( 0, n1 ), ldb )
810 CALL ztrsm(
'R',
'U',
'C', diag, m, n2, alpha,
811 $ a( n1 ), n, b( 0, n1 ), ldb )
812 CALL zgemm(
'N',
'C', m, n1, n2, -cone, b( 0,
814 $ ldb, a( 0 ), n, alpha, b( 0, 0 ), ldb )
815 CALL ztrsm(
'R',
'L',
'N', diag, m, n1, cone,
816 $ a( n2 ), n, b( 0, 0 ), ldb )
835 CALL ztrsm(
'R',
'L',
'N', diag, m, n2, alpha,
836 $ a( 1 ), n1, b( 0, n1 ), ldb )
837 CALL zgemm(
'N',
'C', m, n1, n2, -cone, b( 0,
839 $ ldb, a( n1*n1 ), n1, alpha, b( 0, 0 ),
841 CALL ztrsm(
'R',
'U',
'C', diag, m, n1, cone,
842 $ a( 0 ), n1, b( 0, 0 ), ldb )
849 CALL ztrsm(
'R',
'U',
'N', diag, m, n1, alpha,
850 $ a( 0 ), n1, b( 0, 0 ), ldb )
851 CALL zgemm(
'N',
'N', m, n2, n1, -cone, b( 0,
853 $ ldb, a( n1*n1 ), n1, alpha, b( 0, n1 ),
855 CALL ztrsm(
'R',
'L',
'C', diag, m, n2, cone,
856 $ a( 1 ), n1, b( 0, n1 ), ldb )
869 CALL ztrsm(
'R',
'U',
'N', diag, m, n1, alpha,
870 $ a( n2*n2 ), n2, b( 0, 0 ), ldb )
871 CALL zgemm(
'N',
'C', m, n2, n1, -cone, b( 0,
873 $ ldb, a( 0 ), n2, alpha, b( 0, n1 ),
875 CALL ztrsm(
'R',
'L',
'C', diag, m, n2, cone,
876 $ a( n1*n2 ), n2, b( 0, n1 ), ldb )
883 CALL ztrsm(
'R',
'L',
'N', diag, m, n2, alpha,
884 $ a( n1*n2 ), n2, b( 0, n1 ), ldb )
885 CALL zgemm(
'N',
'N', m, n1, n2, -cone, b( 0,
887 $ ldb, a( 0 ), n2, alpha, b( 0, 0 ),
889 CALL ztrsm(
'R',
'U',
'C', diag, m, n1, cone,
890 $ a( n2*n2 ), n2, b( 0, 0 ), ldb )
902 IF( normaltransr )
THEN
915 CALL ztrsm(
'R',
'U',
'C', diag, m, k, alpha,
916 $ a( 0 ), n+1, b( 0, k ), ldb )
917 CALL zgemm(
'N',
'N', m, k, k, -cone, b( 0, k ),
918 $ ldb, a( k+1 ), n+1, alpha, b( 0, 0 ),
920 CALL ztrsm(
'R',
'L',
'N', diag, m, k, cone,
921 $ a( 1 ), n+1, b( 0, 0 ), ldb )
928 CALL ztrsm(
'R',
'L',
'C', diag, m, k, alpha,
929 $ a( 1 ), n+1, b( 0, 0 ), ldb )
930 CALL zgemm(
'N',
'C', m, k, k, -cone, b( 0, 0 ),
931 $ ldb, a( k+1 ), n+1, alpha, b( 0, k ),
933 CALL ztrsm(
'R',
'U',
'N', diag, m, k, cone,
934 $ a( 0 ), n+1, b( 0, k ), ldb )
947 CALL ztrsm(
'R',
'L',
'C', diag, m, k, alpha,
948 $ a( k+1 ), n+1, b( 0, 0 ), ldb )
949 CALL zgemm(
'N',
'N', m, k, k, -cone, b( 0, 0 ),
950 $ ldb, a( 0 ), n+1, alpha, b( 0, k ),
952 CALL ztrsm(
'R',
'U',
'N', diag, m, k, cone,
953 $ a( k ), n+1, b( 0, k ), ldb )
960 CALL ztrsm(
'R',
'U',
'C', diag, m, k, alpha,
961 $ a( k ), n+1, b( 0, k ), ldb )
962 CALL zgemm(
'N',
'C', m, k, k, -cone, b( 0, k ),
963 $ ldb, a( 0 ), n+1, alpha, b( 0, 0 ),
965 CALL ztrsm(
'R',
'L',
'N', diag, m, k, cone,
966 $ a( k+1 ), n+1, b( 0, 0 ), ldb )
985 CALL ztrsm(
'R',
'L',
'N', diag, m, k, alpha,
986 $ a( 0 ), k, b( 0, k ), ldb )
987 CALL zgemm(
'N',
'C', m, k, k, -cone, b( 0, k ),
988 $ ldb, a( ( k+1 )*k ), k, alpha,
990 CALL ztrsm(
'R',
'U',
'C', diag, m, k, cone,
991 $ a( k ), k, b( 0, 0 ), ldb )
998 CALL ztrsm(
'R',
'U',
'N', diag, m, k, alpha,
999 $ a( k ), k, b( 0, 0 ), ldb )
1000 CALL zgemm(
'N',
'N', m, k, k, -cone, b( 0, 0 ),
1001 $ ldb, a( ( k+1 )*k ), k, alpha,
1003 CALL ztrsm(
'R',
'L',
'C', diag, m, k, cone,
1004 $ a( 0 ), k, b( 0, k ), ldb )
1017 CALL ztrsm(
'R',
'U',
'N', diag, m, k, alpha,
1018 $ a( ( k+1 )*k ), k, b( 0, 0 ), ldb )
1019 CALL zgemm(
'N',
'C', m, k, k, -cone, b( 0, 0 ),
1020 $ ldb, a( 0 ), k, alpha, b( 0, k ), ldb )
1021 CALL ztrsm(
'R',
'L',
'C', diag, m, k, cone,
1022 $ a( k*k ), k, b( 0, k ), ldb )
1029 CALL ztrsm(
'R',
'L',
'N', diag, m, k, alpha,
1030 $ a( k*k ), k, b( 0, k ), ldb )
1031 CALL zgemm(
'N',
'N', m, k, k, -cone, b( 0, k ),
1032 $ ldb, a( 0 ), k, alpha, b( 0, 0 ), ldb )
1033 CALL ztrsm(
'R',
'U',
'C', diag, m, k, cone,
1034 $ a( ( k+1 )*k ), k, b( 0, 0 ), ldb )