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' ) .AND. .NOT.lsame( diag,
'U' ) )
333 ELSE IF( m.LT.0 )
THEN
335 ELSE IF( n.LT.0 )
THEN
337 ELSE IF( ldb.LT.
max( 1, m ) )
THEN
341 CALL xerbla(
'STFSM ', -info )
347 IF( ( m.EQ.0 ) .OR. ( n.EQ.0 ) )
352 IF( alpha.EQ.zero )
THEN
369 IF( mod( m, 2 ).EQ.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 IF( .NOT.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,
501 $ a( m1*m1 ), m1, b( m1, 0 ), ldb,
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,
531 $ a( m1*m2 ), m2, b( m1
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.NOT.
IF( 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, N, K, -ONE, A( 0 ), M+1,
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, N, ONE,
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.EQ.
IF( MOD( N, 2 )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 ),
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,
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 )