274 SUBROUTINE stfsm( TRANSR, SIDE, UPLO, TRANS, DIAG, M, N, ALPHA,
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.
331 $ .NOT.lsame( diag,
'U' ) )
334 ELSE IF( m.LT.0 )
THEN
336 ELSE IF( n.LT.0 )
THEN
338 ELSE IF( ldb.LT.max( 1, m ) )
THEN
342 CALL xerbla(
'STFSM ', -info )
348 IF( ( m.EQ.0 ) .OR. ( n.EQ.0 ) )
353 IF( alpha.EQ.zero )
THEN
370 IF( mod( m, 2 ).EQ.0 )
THEN
388 IF( normaltransr )
THEN
402 CALL strsm(
'L',
'L',
'N', diag, m1, n,
406 CALL strsm(
'L',
'L',
'N', diag, m1, n,
408 $ a( 0 ), m, b, ldb )
409 CALL sgemm(
'N',
'N', m2, n, m1, -one,
411 $ m, b, ldb, alpha, b( m1, 0 ), ldb )
412 CALL strsm(
'L',
'U',
'T', diag, m2, n, one,
413 $ a( m ), m, b( m1, 0 ), ldb )
422 CALL strsm(
'L',
'L',
'T', diag, m1, n,
424 $ a( 0 ), m, b, ldb )
426 CALL strsm(
'L',
'U',
'N', diag, m2, n,
428 $ a( m ), m, b( m1, 0 ), ldb )
429 CALL sgemm(
'T',
'N', m1, n, m2, -one,
431 $ m, b( m1, 0 ), ldb, alpha, b, ldb )
432 CALL strsm(
'L',
'L',
'T', diag, m1, n, one,
433 $ a( 0 ), m, b, ldb )
442 IF( .NOT.notrans )
THEN
447 CALL strsm(
'L',
'L',
'N', diag, m1, n, alpha,
448 $ a( m2 ), m, b, ldb )
449 CALL sgemm(
'T',
'N', m2, n, m1, -one, a( 0 ),
451 $ b, ldb, alpha, b( m1, 0 ), ldb )
452 CALL strsm(
'L',
'U',
'T', diag, m2, n, one,
453 $ a( m1 ), m, b( m1, 0 ), ldb )
460 CALL strsm(
'L',
'U',
'N', diag, m2, n, alpha,
461 $ a( m1 ), m, b( m1, 0 ), ldb )
462 CALL sgemm(
'N',
'N', m1, n, m2, -one, a( 0 ),
464 $ b( m1, 0 ), ldb, alpha, b, ldb )
465 CALL strsm(
'L',
'L',
'T', diag, m1, n, one,
466 $ a( m2 ), m, b, ldb )
486 CALL strsm(
'L',
'U',
'T', diag, m1, n,
488 $ a( 0 ), m1, b, ldb )
490 CALL strsm(
'L',
'U',
'T', diag, m1, n,
492 $ a( 0 ), m1, b, ldb )
493 CALL sgemm(
'T',
'N', m2, n, m1, -one,
494 $ a( m1*m1 ), m1, b, ldb, alpha,
496 CALL strsm(
'L',
'L',
'N', diag, m2, n, one,
497 $ a( 1 ), m1, b( m1, 0 ), ldb )
506 CALL strsm(
'L',
'U',
'N', diag, m1, n,
508 $ a( 0 ), m1, b, ldb )
510 CALL strsm(
'L',
'L',
'T', diag, m2, n,
512 $ a( 1 ), m1, b( m1, 0 ), ldb )
513 CALL sgemm(
'N',
'N', m1, n, m2, -one,
514 $ a( m1*m1 ), m1, b( m1, 0 ), ldb,
516 CALL strsm(
'L',
'U',
'N', diag, m1, n, one,
517 $ a( 0 ), m1, b, ldb )
526 IF( .NOT.notrans )
THEN
531 CALL strsm(
'L',
'U',
'T', diag, m1, n, alpha,
532 $ a( m2*m2 ), m2, b, ldb )
533 CALL sgemm(
'N',
'N', m2, n, m1, -one, a( 0 ),
535 $ b, ldb, alpha, b( m1, 0 ), ldb )
536 CALL strsm(
'L',
'L',
'N', diag, m2, n, one,
537 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
544 CALL strsm(
'L',
'L',
'T', diag, m2, n, alpha,
545 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
546 CALL sgemm(
'T',
'N', m1, n, m2, -one, a( 0 ),
548 $ b( m1, 0 ), ldb, alpha, b, ldb )
549 CALL strsm(
'L',
'U',
'N', diag, m1, n, one,
550 $ a( m2*m2 ), m2, b, ldb )
562 IF( normaltransr )
THEN
575 CALL strsm(
'L',
'L',
'N', diag, k, n, alpha,
576 $ a( 1 ), m+1, b, ldb )
577 CALL sgemm(
'N',
'N', k, n, k, -one, a( k+1 ),
578 $ m+1, b, ldb, alpha, b( k, 0 ), ldb )
579 CALL strsm(
'L',
'U',
'T', diag, k, n, one,
580 $ a( 0 ), m+1, b( k, 0 ), ldb )
587 CALL strsm(
'L',
'U',
'N', diag, k, n, alpha,
588 $ a( 0 ), m+1, b( k, 0 ), ldb )
589 CALL sgemm(
'T',
'N', k, n, k, -one, a( k+1 ),
590 $ m+1, b( k, 0 ), ldb, alpha, b, ldb )
591 CALL strsm(
'L',
'L',
'T', diag, k, n, one,
592 $ a( 1 ), m+1, b, ldb )
600 IF( .NOT.notrans )
THEN
605 CALL strsm(
'L',
'L',
'N', diag, k, n, alpha,
606 $ a( k+1 ), m+1, b, ldb )
607 CALL sgemm(
'T',
'N', k, n, k, -one, a( 0 ),
609 $ b, ldb, alpha, b( k, 0 ), ldb )
610 CALL strsm(
'L',
'U',
'T', diag, k, n, one,
611 $ a( k ), m+1, b( k, 0 ), ldb )
617 CALL strsm(
'L',
'U',
'N', diag, k, n, alpha,
618 $ a( k ), m+1, b( k, 0 ), ldb )
619 CALL sgemm(
'N',
'N', k, n, k, -one, a( 0 ),
621 $ b( k, 0 ), ldb, alpha, b, ldb )
622 CALL strsm(
'L',
'L',
'T', diag, k, n, one,
623 $ a( k+1 ), m+1, b, ldb )
642 CALL strsm(
'L',
'U',
'T', diag, k, n, alpha,
643 $ a( k ), k, b, ldb )
644 CALL sgemm(
'T',
'N', k, n, k, -one,
645 $ a( k*( k+1 ) ), k, b, ldb, alpha,
647 CALL strsm(
'L',
'L',
'N', diag, k, n, one,
648 $ a( 0 ), k, b( k, 0 ), ldb )
655 CALL strsm(
'L',
'L',
'T', diag, k, n, alpha,
656 $ a( 0 ), k, b( k, 0 ), ldb )
657 CALL sgemm(
'N',
'N', k, n, k, -one,
658 $ a( k*( k+1 ) ), k, b( k, 0 ), ldb,
660 CALL strsm(
'L',
'U',
'N', diag, k, n, one,
661 $ a( k ), k, b, ldb )
669 IF( .NOT.notrans )
THEN
674 CALL strsm(
'L',
'U',
'T', diag, k, n, alpha,
675 $ a( k*( k+1 ) ), k, b, ldb )
676 CALL sgemm(
'N',
'N', k, n, k, -one, a( 0 ), k,
678 $ ldb, alpha, b( k, 0 ), ldb )
679 CALL strsm(
'L',
'L',
'N', diag, k, n, one,
680 $ a( k*k ), k, b( k, 0 ), ldb )
687 CALL strsm(
'L',
'L',
'T', diag, k, n, alpha,
688 $ a( k*k ), k, b( k, 0 ), ldb )
689 CALL sgemm(
'T',
'N', k, n, k, -one, a( 0 ), k,
690 $ b( k, 0 ), ldb, alpha, b, ldb )
691 CALL strsm(
'L',
'U',
'N', diag, k, n, one,
692 $ a( k*( k+1 ) ), k, b, ldb )
710 IF( mod( n, 2 ).EQ.0 )
THEN
728 IF( normaltransr )
THEN
741 CALL strsm(
'R',
'U',
'T', diag, m, n2, alpha,
742 $ a( n ), n, b( 0, n1 ), ldb )
743 CALL sgemm(
'N',
'N', m, n1, n2, -one, b( 0,
745 $ ldb, a( n1 ), n, alpha, b( 0, 0 ),
747 CALL strsm(
'R',
'L',
'N', diag, m, n1, one,
748 $ a( 0 ), n, b( 0, 0 ), ldb )
755 CALL strsm(
'R',
'L',
'T', diag, m, n1, alpha,
756 $ a( 0 ), n, b( 0, 0 ), ldb )
757 CALL sgemm(
'N',
'T', m, n2, n1, -one, b( 0,
759 $ ldb, a( n1 ), n, alpha, b( 0, n1 ),
761 CALL strsm(
'R',
'U',
'N', diag, m, n2, one,
762 $ a( n ), n, b( 0, n1 ), ldb )
775 CALL strsm(
'R',
'L',
'T', diag, m, n1, alpha,
776 $ a( n2 ), n, b( 0, 0 ), ldb )
777 CALL sgemm(
'N',
'N', m, n2, n1, -one, b( 0,
779 $ ldb, a( 0 ), n, alpha, b( 0, n1 ),
781 CALL strsm(
'R',
'U',
'N', diag, m, n2, one,
782 $ a( n1 ), n, b( 0, n1 ), ldb )
789 CALL strsm(
'R',
'U',
'T', diag, m, n2, alpha,
790 $ a( n1 ), n, b( 0, n1 ), ldb )
791 CALL sgemm(
'N',
'T', m, n1, n2, -one, b( 0,
793 $ ldb, a( 0 ), n, alpha, b( 0, 0 ), ldb )
794 CALL strsm(
'R',
'L',
'N', diag, m, n1, one,
795 $ a( n2 ), n, b( 0, 0 ), ldb )
814 CALL strsm(
'R',
'L',
'N', diag, m, n2, alpha,
815 $ a( 1 ), n1, b( 0, n1 ), ldb )
816 CALL sgemm(
'N',
'T', m, n1, n2, -one, b( 0,
818 $ ldb, a( n1*n1 ), n1, alpha, b( 0, 0 ),
820 CALL strsm(
'R',
'U',
'T', diag, m, n1, one,
821 $ a( 0 ), n1, b( 0, 0 ), ldb )
828 CALL strsm(
'R',
'U',
'N', diag, m, n1, alpha,
829 $ a( 0 ), n1, b( 0, 0 ), ldb )
830 CALL sgemm(
'N',
'N', m, n2, n1, -one, b( 0,
832 $ ldb, a( n1*n1 ), n1, alpha, b( 0, n1 ),
834 CALL strsm(
'R',
'L',
'T', diag, m, n2, one,
835 $ a( 1 ), n1, b( 0, n1 ), ldb )
848 CALL strsm(
'R',
'U',
'N', diag, m, n1, alpha,
849 $ a( n2*n2 ), n2, b( 0, 0 ), ldb )
850 CALL sgemm(
'N',
'T', m, n2, n1, -one, b( 0,
852 $ ldb, a( 0 ), n2, alpha, b( 0, n1 ),
854 CALL strsm(
'R',
'L',
'T', diag, m, n2, one,
855 $ a( n1*n2 ), n2, b( 0, n1 ), ldb )
862 CALL strsm(
'R',
'L',
'N', diag, m, n2, alpha,
863 $ a( n1*n2 ), n2, b( 0, n1 ), ldb )
864 CALL sgemm(
'N',
'N', m, n1, n2, -one, b( 0,
866 $ ldb, a( 0 ), n2, alpha, b( 0, 0 ),
868 CALL strsm(
'R',
'U',
'T', diag, m, n1, one,
869 $ a( n2*n2 ), n2, b( 0, 0 ), ldb )
881 IF( normaltransr )
THEN
894 CALL strsm(
'R',
'U',
'T', diag, m, k, alpha,
895 $ a( 0 ), n+1, b( 0, k ), ldb )
896 CALL sgemm(
'N',
'N', m, k, k, -one, b( 0, k ),
897 $ ldb, a( k+1 ), n+1, alpha, b( 0, 0 ),
899 CALL strsm(
'R',
'L',
'N', diag, m, k, one,
900 $ a( 1 ), n+1, b( 0, 0 ), ldb )
907 CALL strsm(
'R',
'L',
'T', diag, m, k, alpha,
908 $ a( 1 ), n+1, b( 0, 0 ), ldb )
909 CALL sgemm(
'N',
'T', m, k, k, -one, b( 0, 0 ),
910 $ ldb, a( k+1 ), n+1, alpha, b( 0, k ),
912 CALL strsm(
'R',
'U',
'N', diag, m, k, one,
913 $ a( 0 ), n+1, b( 0, k ), ldb )
926 CALL strsm(
'R',
'L',
'T', diag, m, k, alpha,
927 $ a( k+1 ), n+1, b( 0, 0 ), ldb )
928 CALL sgemm(
'N',
'N', m, k, k, -one, b( 0, 0 ),
929 $ ldb, a( 0 ), n+1, alpha, b( 0, k ),
931 CALL strsm(
'R',
'U',
'N', diag, m, k, one,
932 $ a( k ), n+1, b( 0, k ), ldb )
939 CALL strsm(
'R',
'U',
'T', diag, m, k, alpha,
940 $ a( k ), n+1, b( 0, k ), ldb )
941 CALL sgemm(
'N',
'T', m, k, k, -one, b( 0, k ),
942 $ ldb, a( 0 ), n+1, alpha, b( 0, 0 ),
944 CALL strsm(
'R',
'L',
'N', diag, m, k, one,
945 $ a( k+1 ), n+1, b( 0, 0 ), ldb )
964 CALL strsm(
'R',
'L',
'N', diag, m, k, alpha,
965 $ a( 0 ), k, b( 0, k ), ldb )
966 CALL sgemm(
'N',
'T', m, k, k, -one, b( 0, k ),
967 $ ldb, a( ( k+1 )*k ), k, alpha,
969 CALL strsm(
'R',
'U',
'T', diag, m, k, one,
970 $ a( k ), k, b( 0, 0 ), ldb )
977 CALL strsm(
'R',
'U',
'N', diag, m, k, alpha,
978 $ a( k ), k, b( 0, 0 ), ldb )
979 CALL sgemm(
'N',
'N', m, k, k, -one, b( 0, 0 ),
980 $ ldb, a( ( k+1 )*k ), k, alpha,
982 CALL strsm(
'R',
'L',
'T', diag, m, k, one,
983 $ a( 0 ), k, b( 0, k ), ldb )
996 CALL strsm(
'R',
'U',
'N', diag, m, k, alpha,
997 $ a( ( k+1 )*k ), k, b( 0, 0 ), ldb )
998 CALL sgemm(
'N',
'T', m, k, k, -one, b( 0, 0 ),
999 $ ldb, a( 0 ), k, alpha, b( 0, k ), ldb )
1000 CALL strsm(
'R',
'L',
'T', diag, m, k, one,
1001 $ a( k*k ), k, b( 0, k ), ldb )
1008 CALL strsm(
'R',
'L',
'N', diag, m, k, alpha,
1009 $ a( k*k ), k, b( 0, k ), ldb )
1010 CALL sgemm(
'N',
'N', m, k, k, -one, b( 0, k ),
1011 $ ldb, a( 0 ), k, alpha, b( 0, 0 ), ldb )
1012 CALL strsm(
'R',
'U',
'T', diag, m, k, one,
1013 $ a( ( k+1 )*k ), k, b( 0, 0 ), ldb )