275 SUBROUTINE stfsm( TRANSR, SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, A,
283 CHARACTER TRANSR, DIAG, SIDE, TRANS, UPLO
288 REAL A( 0: * ), B( 0: LDB-1, 0: * )
296 parameter( one = 1.0e+0, zero = 0.0e+0 )
299 LOGICAL LOWER, LSIDE, MISODD, NISODD, NORMALTRANSR,
301 INTEGER M1, M2, N1, N2, K, INFO, I, J
318 normaltransr = lsame( transr,
'N' )
319 lside = lsame( side,
'L' )
320 lower = lsame( uplo,
'L' )
321 notrans = lsame( trans,
'N' )
322 IF( .NOT.normaltransr .AND. .NOT.lsame( transr,
'T' ) )
THEN
324 ELSE IF( .NOT.lside .AND. .NOT.lsame( side,
'R' ) )
THEN
326 ELSE IF( .NOT.lower .AND. .NOT.lsame( uplo,
'U' ) )
THEN
328 ELSE IF( .NOT.notrans .AND. .NOT.lsame( trans,
'T' ) )
THEN
330 ELSE IF( .NOT.lsame( diag
'N''U' ) )
333 ELSE IF( m.LT.0 )
THEN
335 ELSE IF( n.LT.0 )
THEN
337 ELSE IF( ldb.LT.
max( 1, m ) )
THEN
347.EQ..OR..EQ.
IF( ( M0 ) ( N0 ) )
352.EQ.
IF( ALPHAZERO ) THEN
369.EQ.
IF( MOD( M, 2 )0 ) THEN
387 IF( NORMALTRANSR ) THEN
401 CALL STRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
404 CALL STRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
405 $ A( 0 ), M, B, LDB )
406 CALL SGEMM( 'n
', 'n
', M2, N, M1, -ONE, A( M1 ),
407 $ M, B, LDB, ALPHA, B( M1, 0 ), LDB )
408 CALL STRSM( 'l
', 'u
', 't
', DIAG, M2, N, ONE,
409 $ A( M ), M, B( M1, 0 ), LDB )
418 CALL STRSM( 'l
', 'l
', 't
', DIAG, M1, N, ALPHA,
419 $ A( 0 ), M, B, LDB )
421 CALL STRSM( 'l
', 'u
', 'n
', DIAG, M2, N, ALPHA,
422 $ A( M ), M, B( M1, 0 ), LDB )
423 CALL SGEMM( 't
', 'n
', M1, N, M2, -ONE, A( M1 ),
424 $ M, B( M1, 0 ), LDB, ALPHA, B, LDB )
425 CALL STRSM( 'l
', 'l
', 't
', DIAG, M1, N, ONE,
426 $ A( 0 ), M, B, LDB )
435.NOT.
IF( NOTRANS ) THEN
440 CALL STRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
441 $ A( M2 ), M, B, LDB )
442 CALL SGEMM( 't
', 'n
', M2, N, M1, -ONE, A( 0 ), M,
443 $ B, LDB, ALPHA, B( M1, 0 ), LDB )
444 CALL STRSM( 'l
', 'u
', 't
', DIAG, M2, N, ONE,
445 $ A( M1 ), M, B( M1, 0 ), LDB )
452 CALL STRSM( 'l
', 'u
', 'n
', DIAG, M2, N, ALPHA,
453 $ A( M1 ), M, B( M1, 0 ), LDB )
454 CALL SGEMM( 'n
', 'n
', M1, N, M2, -ONE, A( 0 ), M,
455 $ B( M1, 0 ), LDB, ALPHA, B, LDB )
456 CALL STRSM( 'l
', 'l
', 't
', DIAG, M1, N, ONE,
457 $ A( M2 ), M, B, LDB )
477 CALL STRSM( 'l
', 'u
', 't
', DIAG, M1, N, ALPHA,
478 $ A( 0 ), M1, B, LDB )
480 CALL STRSM( 'l
', 'u
', 't
', DIAG, M1, N, ALPHA,
481 $ A( 0 ), M1, B, LDB )
482 CALL SGEMM( 't
', 'n', m2, n, m1, -one,
483 $ a( m1*m1 ), m1, b, ldb, alpha,
485 CALL strsm(
'L',
'L',
'N', diag, m2, n, one,
486 $ a( 1 ), m1, b( m1, 0 ), ldb )
495 CALL strsm(
'L',
'U',
'N', diag, m1, n, alpha,
496 $ a( 0 ), m1, b, ldb )
498 CALL strsm(
'L',
'L',
'T', diag, m2, n, alpha,
499 $ a( 1 ), m1, b( m1, 0 ), ldb )
500 CALL sgemm(
'N',
'N', m1, n, m2, -one,
503 CALL strsm(
'L',
'U',
'N', diag, m1, n, one,
504 $ a( 0 ), m1, b, ldb )
513 IF( .NOT.notrans )
THEN
518 CALL strsm(
'L',
'U',
'T', diag, m1, n, alpha,
519 $ a( m2*m2 ), m2, b, ldb )
520 CALL sgemm(
'N',
'N', m2, n, m1, -one, a( 0 ), m2,
521 $ b, ldb, alpha, b( m1, 0 ), ldb )
522 CALL strsm(
'L',
'L',
'N', diag, m2, n, one,
523 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
530 CALL strsm(
'L',
'L',
'T', diag, m2, n, alpha,
531 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
532 CALL sgemm(
'T',
'N', m1, n, m2, -one, a( 0 ), m2,
533 $ b( m1, 0 ), ldb, alpha, b, ldb )
534 CALL strsm(
'L',
'U',
'N', diag, m1, n, one,
535 $ a( m2*m2 ), m2, b, ldb )
547 IF( normaltransr )
THEN
560 CALL strsm(
'L',
'L',
'N', diag, k, n, alpha,
561 $ a( 1 ), m+1, b, ldb )
562 CALL sgemm(
'N',
'N', k, n, k, -one, a( k+1 ),
563 $ m+1, b, ldb, alpha, b( k, 0 ), ldb )
564 CALL strsm(
'L',
'U',
'T', diag, k, n, one,
565 $ a( 0 ), m+1, b( k, 0 ), ldb )
572 CALL strsm(
'L',
'U',
'N', diag, k, n, alpha,
573 $ a( 0 ), m+1, b( k, 0 ), ldb )
574 CALL sgemm(
'T',
'N', k, n, k, -one, a( k+1 ),
575 $ m+1, b( k, 0 ), ldb, alpha, b, ldb )
576 CALL strsm(
'L',
'L',
'T', diag, k, n, one,
577 $ a( 1 ), m+1, b, ldb )
585 IF( .NOT.notrans )
THEN
590 CALL strsm(
'L',
'L',
'N', diag, k, n, alpha,
591 $ a( k+1 ), m+1, b, ldb )
592 CALL sgemm(
'T',
'N', k
593 $ b, ldb, alpha, b( k, 0 ), ldb )
594 CALL strsm(
'L',
'U',
'T', diag, k, n, one,
595 $ a( k ), m+1, b( k, 0 ), ldb )
601 CALL strsm(
'L',
'U',
'N', diag, k, n, alpha,
602 $ a( k ), m+1, b( k, 0 ), ldb )
603 CALL sgemm(
'N',
'N', k, n, k, -one, a( 0 ), m+1,
604 $ b( k, 0 ), ldb, alpha, b, ldb )
605 CALL strsm(
'L',
'L',
'T', diag, k
606 $ a( k+1 ), m+1, b, ldb )
625 CALL strsm(
'L',
'U',
'T', diag, k, n, alpha,
626 $ a( k ), k, b, ldb )
627 CALL sgemm(
'T',
'N', k, n, k, -one,
628 $ a( k*( k+1 ) ), k, b, ldb, alpha,
630 CALL strsm( 'l
', 'l
', 'n
', DIAG, K, N, ONE,
631 $ A( 0 ), K, B( K, 0 ), LDB )
638 CALL STRSM( 'l
', 'l
', 't
', DIAG, K, N, ALPHA,
639 $ A( 0 ), K, B( K, 0 ), LDB )
640 CALL SGEMM( 'n
', 'n
', K, N, K, -ONE,
641 $ A( K*( K+1 ) ), K, B( K, 0 ), LDB,
643 CALL STRSM( 'l
', 'u
', 'n
', DIAG, K, N, ONE,
644 $ A( K ), K, B, LDB )
652.NOT.
IF( NOTRANS ) THEN
657 CALL STRSM( 'l
', 'u
', 't
', DIAG, K, N, ALPHA,
658 $ A( K*( K+1 ) ), K, B, LDB )
659 CALL SGEMM( 'n
', 'n
', K, N, K, -ONE, A( 0 ), K, B,
660 $ LDB, ALPHA, B( K, 0 ), LDB )
661 CALL STRSM( 'l
', 'l
', 'n
', DIAG, K, N, ONE,
662 $ A( K*K ), K, B( K, 0 ), LDB )
669 CALL STRSM( 'l
', 'l
', 't
', DIAG, K, N, ALPHA,
670 $ A( K*K ), K, B( K, 0 ), LDB )
671 CALL SGEMM( 't
', 'n
', K, N, K, -ONE, A( 0 ), K,
672 $ B( K, 0 ), LDB, ALPHA, B, LDB )
673 CALL STRSM( 'l
', 'u
', 'n', diag, k, n, one,
674 $ a( k*( k+1 ) ), k, b, ldb )
692 IF( mod( n, 2 ).EQ.0 )
THEN
710 IF( normaltransr )
THEN
723 CALL strsm(
'R',
'U',
'T', diag, m, n2, alpha,
724 $ a( n ), n, b( 0, n1 ), ldb )
725 CALL sgemm(
'N',
'N', m, n1, n2, -one, b( 0, n1 ),
726 $ ldb, a( n1 ), n, alpha, b( 0, 0 ),
728 CALL strsm(
'R',
'L', 'n
', DIAG, M, N1, ONE,
729 $ A( 0 ), N, B( 0, 0 ), LDB )
736 CALL STRSM( 'r
', 'l
', 't
', DIAG, M, N1, ALPHA,
737 $ A( 0 ), N, B( 0, 0 ), LDB )
738 CALL SGEMM( 'n
', 't
', M, N2, N1, -ONE, B( 0, 0 ),
739 $ LDB, A( N1 ), N, ALPHA, B( 0, N1 ),
741 CALL STRSM( 'r
', 'u
', 'n
', DIAG, M, N2, ONE,
742 $ A( N ), N, B( 0, N1 ), LDB )
755 CALL STRSM( 'r
', 'l
', 't
', DIAG, M, N1, ALPHA,
756 $ A( N2 ), N, B( 0, 0 ), LDB )
757 CALL SGEMM( 'n
', 'n
', M, N2, N1, -ONE, B( 0, 0 ),
758 $ LDB, A( 0 ), N, ALPHA, B( 0, N1 ),
760 CALL STRSM( 'r
', 'u
', 'n
', DIAG, M, N2, ONE,
761 $ A( N1 ), N, B( 0, N1 ), LDB )
768 CALL STRSM( 'r
', 'u
', 't
', DIAG, M, N2, ALPHA,
769 $ A( N1 ), N, B( 0, N1 ), LDB )
770 CALL SGEMM( 'n
', 't
', M, N1, N2, -ONE, B( 0, N1 ),
771 $ LDB, A( 0 ), N, ALPHA, B( 0, 0 ), LDB )
772 CALL STRSM( 'r
', 'l
', 'n
', DIAG, M, N1, ONE,
773 $ A( N2 ), N, B( 0, 0 ), LDB )
792 CALL STRSM( 'r
', 'l
', 'n
', DIAG, M, N2, ALPHA,
793 $ A( 1 ), N1, B( 0, N1 ), LDB )
794 CALL SGEMM( 'n
', 't
', M, N1, N2, -ONE, B( 0, N1 ),
795 $ LDB, A( N1*N1 ), N1, ALPHA, B( 0, 0 ),
797 CALL STRSM( 'r
', 'u
', 't
', DIAG, M, N1, ONE,
798 $ A( 0 ), N1, B( 0, 0 ), LDB )
805 CALL STRSM( 'r
', 'u
', 'n
', DIAG, M, N1, ALPHA,
806 $ A( 0 ), N1, B( 0, 0 ), LDB )
807 CALL SGEMM( 'n
', 'n
', M, N2, N1, -ONE, B( 0, 0 ),
808 $ LDB, A( N1*N1 ), N1, ALPHA, B( 0, N1 ),
810 CALL STRSM( 'r
', 'l
', 't
', DIAG, M, N2, ONE,
811 $ A( 1 ), N1, B( 0, N1 ), LDB )
824 CALL STRSM( 'r
', 'u
', 'n
', DIAG, M, N1, ALPHA,
825 $ A( N2*N2 ), N2, B( 0, 0 ), LDB )
826 CALL SGEMM( 'n
', 't
', M, N2, N1, -ONE, B( 0, 0 ),
827 $ LDB, A( 0 ), N2, ALPHA, B( 0, N1 ),
829 CALL STRSM( 'r
', 'l
', 't
', DIAG, M, N2, ONE,
830 $ A( N1*N2 ), N2, B( 0, N1 ), LDB )
837 CALL STRSM( 'r
', 'l
', 'n
', DIAG, M, N2, ALPHA,
838 $ A( N1*N2 ), N2, B( 0, N1 ), LDB )
839 CALL SGEMM( 'n
', 'n
', M, N1, N2, -ONE, B( 0, N1 ),
840 $ LDB, A( 0 ), N2, ALPHA, B( 0, 0 ),
842 CALL STRSM( 'r
', 'u
', 't
', DIAG, M, N1, ONE,
843 $ A( N2*N2 ), N2, B( 0, 0 ), LDB )
855 IF( NORMALTRANSR ) THEN
868 CALL STRSM( 'r
', 'u
', 't
', DIAG, M, K, ALPHA,
869 $ A( 0 ), N+1, B( 0, K ), LDB )
870 CALL SGEMM( 'n
', 'n
', M, K, K, -ONE, B( 0, K ),
871 $ LDB, A( K+1 ), N+1, ALPHA, B( 0, 0 ),
873 CALL STRSM( 'r
', 'l
', 'n
', DIAG, M, K, ONE,
874 $ A( 1 ), N+1, B( 0, 0 ), LDB )
881 CALL STRSM( 'r
', 'l
', 't
', DIAG, M, K, ALPHA,
882 $ A( 1 ), N+1, B( 0, 0 ), LDB )
883 CALL SGEMM( 'n
', 't
', M, K, K, -ONE, B( 0, 0 ),
884 $ LDB, A( K+1 ), N+1, ALPHA, B( 0, K ),
886 CALL STRSM( 'r
', 'u
', 'n
', DIAG, M, K, ONE,
887 $ A( 0 ), N+1, B( 0, K ), LDB )
900 CALL STRSM( 'r
', 'l',
'T', diag, m, k, alpha,
901 $ a( k+1 ), n+1, b( 0, 0 ), ldb )
902 CALL sgemm(
'N',
'N', m, k, k, -one, b( 0, 0 ),
903 $ ldb, a( 0 ), n+1, alpha, b( 0, k ),
905 CALL strsm(
'R',
'U',
'N', diag, m, k, one,
906 $ a( k ), n+1, b( 0, k ), ldb )
913 CALL strsm(
'R',
'U',
'T', diag, m, k, alpha,
914 $ a( k ), n+1, b( 0, k ), ldb )
915 CALL sgemm(
'N',
'T', m, k, k, -one, b( 0, k ),
916 $ ldb, a( 0 ), n+1, alpha, b( 0, 0 ),
918 CALL strsm(
'R',
'L',
'N', diag, m, k, one,
919 $ a( k+1 ), n+1, b( 0, 0 ), ldb )
938 CALL strsm(
'R',
'L',
'N', diag, m, k, alpha,
939 $ a( 0 ), k, b( 0, k ), ldb )
940 CALL sgemm(
'N', 't
', M, K, K, -ONE, B( 0, K ),
941 $ LDB, A( ( K+1 )*K ), K, ALPHA,
943 CALL STRSM( 'r
', 'u
', 't
', DIAG, M, K, ONE,
944 $ A( K ), K, B( 0, 0 ), LDB )
951 CALL STRSM( 'r
', 'u
', 'n
', DIAG, M, K, ALPHA,
952 $ A( K ), K, B( 0, 0 ), LDB )
953 CALL SGEMM( 'n
', 'n
', M, K, K, -ONE, B( 0, 0 ),
954 $ LDB, A( ( K+1 )*K ), K, ALPHA,
956 CALL STRSM( 'r
', 'l
', 't
', DIAG, M, K, ONE,
957 $ A( 0 ), K, B( 0, K ), LDB )
970 CALL STRSM( 'r
', 'u
', 'n
', DIAG, M, K, ALPHA,
971 $ A( ( K+1 )*K ), K, B( 0, 0 ), LDB )
972 CALL SGEMM( 'n
', 't
', M, K, K, -ONE, B( 0, 0 ),
973 $ LDB, A( 0 ), K, ALPHA, B( 0, K ), LDB )
974 CALL STRSM( 'r
', 'l
', 't
', DIAG, M, K, ONE,
975 $ A( K*K ), K, B( 0, K ), LDB )
982 CALL STRSM( 'r
', 'l
', 'n
', DIAG, M, K, ALPHA,
983 $ A( K*K ), K, B( 0, K ), LDB )
984 CALL SGEMM( 'n
', 'n
', M, K, K, -ONE, B( 0, K ),
985 $ LDB, A( 0 ), K, ALPHA, B( 0, 0 ), LDB )
986 CALL STRSM( 'r
', 'u
', 't
', DIAG, M, K, ONE,
987 $ A( ( K+1 )*K ), K, B( 0, 0 ), LDB )