275 SUBROUTINE dtfsm( TRANSR, SIDE, UPLO, TRANS, DIAG, M, N, ALPHA, A,
283 CHARACTER TRANSR, DIAG, SIDE, TRANS, UPLO
285 DOUBLE PRECISION ALPHA
288 DOUBLE PRECISION A( 0: * ), B( 0: LDB-1, 0: * )
295 DOUBLE PRECISION ONE, ZERO
296 parameter( one = 1.0d+0, zero = 0.0d+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.LT.
ELSE IF( M0 ) THEN
335.LT.
ELSE IF( N0 ) THEN
337.LT.
ELSE IF( LDBMAX( 1, M ) ) THEN
341 CALL XERBLA( 'dtfsm ', -INFO )
347.EQ..OR..EQ.
IF( ( M0 ) ( N0 ) )
352.EQ.
IF( ALPHAZERO ) THEN
369.EQ.
IF( MOD( M, 2 )0 ) THEN
388 IF( NORMALTRANSR ) THEN
402 CALL DTRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
405 CALL DTRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
406 $ A( 0 ), M, B, LDB )
407 CALL DGEMM( 'n
', 'n
', M2, N, M1, -ONE, A( M1 ),
408 $ M, B, LDB, ALPHA, B( M1, 0 ), LDB )
409 CALL DTRSM( 'l
', 'u
', 't
', DIAG, M2, N, ONE,
410 $ A( M ), M, B( M1, 0 ), LDB )
419 CALL DTRSM( 'l
', 'l
', 't
', DIAG, M1, N, ALPHA,
420 $ A( 0 ), M, B, LDB )
422 CALL DTRSM( 'l
', 'u
', 'n
', DIAG, M2, N, ALPHA,
423 $ A( M ), M, B( M1, 0 ), LDB )
424 CALL DGEMM( 't
', 'n
', M1, N, M2, -ONE, A( M1 ),
425 $ M, B( M1, 0 ), LDB, ALPHA, B, LDB )
426 CALL DTRSM( 'l
', 'l
', 't
', DIAG, M1, N, ONE,
427 $ A( 0 ), M, B, LDB )
436.NOT.
IF( NOTRANS ) THEN
441 CALL DTRSM( 'l
', 'l
', 'n
', DIAG, M1, N, ALPHA,
442 $ A( M2 ), M, B, LDB )
443 CALL DGEMM( 't
', 'n
', M2, N, M1, -ONE, A( 0 ), M,
444 $ B, LDB, ALPHA, B( M1, 0 ), LDB )
445 CALL DTRSM( 'l
', 'u
', 't
', DIAG, M2, N, ONE,
446 $ A( M1 ), M, B( M1, 0 ), LDB )
453 CALL DTRSM( 'l
', 'u
', 'n
', DIAG, M2, N, ALPHA,
454 $ A( M1 ), M, B( M1, 0 ), LDB )
455 CALL DGEMM( 'n
', 'n
', M1, N, M2, -ONE, A( 0 ), M,
456 $ B( M1, 0 ), LDB, ALPHA, B, LDB )
457 CALL DTRSM( 'l
', 'l
', 't
', DIAG, M1, N, ONE,
458 $ A( M2 ), M, B, LDB )
478 CALL DTRSM( 'l
', 'u
', 't
', DIAG, M1, N, ALPHA,
479 $ A( 0 ), M1, B, LDB )
481 CALL DTRSM( 'l
', 'u
', 't
', DIAG, M1, N, ALPHA,
482 $ A( 0 ), M1, B, LDB )
483 CALL DGEMM( 't
', 'n
', M2, N, M1, -ONE,
484 $ A( M1*M1 ), M1, B, LDB, ALPHA,
486 CALL DTRSM( 'l
', 'l
', 'n
', DIAG, M2, N, ONE,
487 $ A( 1 ), M1, B( M1, 0 ), LDB )
496 CALL DTRSM( 'l
', 'u
', 'n
', DIAG, M1, N, ALPHA,
497 $ A( 0 ), M1, B, LDB )
499 CALL DTRSM( 'l
', 'l
', 't
', DIAG, M2, N, ALPHA,
500 $ A( 1 ), M1, B( M1, 0 ), LDB )
501 CALL DGEMM( 'n
', 'n
', M1, N, M2, -ONE,
502 $ A( M1*M1 ), M1, B( M1, 0 ), LDB,
504 CALL DTRSM( 'l
', 'u
', 'n
', DIAG, M1, N, ONE,
505 $ A( 0 ), M1, B, LDB )
514.NOT.
IF( NOTRANS ) THEN
519 CALL DTRSM( 'l
', 'u
', 't
', DIAG, M1, N, ALPHA,
520 $ A( M2*M2 ), M2, B, LDB )
521 CALL DGEMM( 'n
', 'n
', M2, N, M1, -ONE, A( 0 ), M2,
522 $ B, LDB, ALPHA, B( M1, 0 ), LDB )
523 CALL DTRSM( 'l
', 'l
', 'n
', DIAG, M2, N, ONE,
524 $ A( M1*M2 ), M2, B( M1, 0 ), LDB )
531 CALL DTRSM( 'l
', 'l
', 't', diag, m2, n, alpha,
532 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
533 CALL dgemm(
'T',
'N', m1, n, m2, -one, a( 0 ), m2,
534 $ b( m1, 0 ), ldb, alpha, b, ldb )
535 CALL dtrsm(
'L',
'U',
'N', diag, m1, n, one,
536 $ a( m2*m2 ), m2, b, ldb )
548 IF( normaltransr )
THEN
561 CALL dtrsm(
'L',
'L',
'N', diag, k, n, alpha,
562 $ a( 1 ), m+1, b, ldb )
563 CALL dgemm(
'N',
'N', k, n, k, -one, a( k+1 ),
564 $ m+1, b, ldb, alpha, b( k, 0 ), ldb )
565 CALL dtrsm(
'L',
'U',
'T', diag, k, n, one,
566 $ a( 0 ), m+1, b( k, 0 ), ldb )
573 CALL dtrsm(
'L',
'U',
'N', diag, k, n, alpha,
574 $ a( 0 ), m+1, b( k, 0 ), ldb )
575 CALL dgemm(
'T',
'N', k, n, k, -one, a( k+1 ),
576 $ m+1, b( k, 0 ), ldb, alpha, b, ldb )
577 CALL dtrsm(
'L',
'L',
'T', diag, k, n, one,
578 $ a( 1 ), m+1, b, ldb )
586 IF( .NOT.notrans )
THEN
591 CALL dtrsm(
'L',
'L',
'N', diag, k, n, alpha,
592 $ a( k+1 ), m+1, b, ldb )
593 CALL dgemm(
'T',
'N', k, n, k, -one, a( 0 ), m+1,
594 $ b, ldb, alpha, b( k, 0 ), ldb )
595 CALL dtrsm(
'L',
'U',
'T', diag, k, n, one,
596 $ a( k ), m+1, b( k, 0 ), ldb )
602 CALL dtrsm(
'L',
'U',
'N', diag, k, n, alpha,
603 $ a( k ), m+1, b( k, 0 ), ldb )
604 CALL dgemm(
'N',
'N', k, n, k, -one, a( 0 ), m+1,
605 $ b( k, 0 ), ldb, alpha, b, ldb )
606 CALL dtrsm(
'L',
'L',
'T', diag, k, n, one,
607 $ a( k+1 ), m+1, b, ldb )
626 CALL dtrsm(
'L',
'U',
'T', diag, k, n, alpha,
627 $ a( k ), k, b, ldb )
628 CALL dgemm(
'T',
'N', k, n, k, -one,
629 $ a( k*( k+1 ) ), k, b, ldb, alpha,
631 CALL dtrsm(
'L',
'L',
'N', diag, k, n, one,
632 $ a( 0 ), k, b( k, 0 ), ldb )
639 CALL dtrsm(
'L',
'L',
'T', diag, k, n, alpha,
640 $ a( 0 ), k, b( k, 0 ), ldb )
641 CALL dgemm(
'N',
'N', k, n, k, -one,
642 $ a( k*( k+1 ) ), k, b( k, 0 ), ldb,
644 CALL dtrsm(
'L',
'U',
'N', diag, k, n, one,
645 $ a( k ), k, b, ldb )
653 IF( .NOT.notrans )
THEN
658 CALL dtrsm(
'L',
'U',
'T', diag, k, n, alpha,
659 $ a( k*( k+1 ) ), k, b, ldb )
660 CALL dgemm(
'N',
'N', k, n, k, -one, a( 0 ), k, b,
661 $ ldb, alpha, b( k, 0 ), ldb )
662 CALL dtrsm(
'L',
'L',
'N', diag, k, n, one,
663 $ a( k*k ), k, b( k, 0 ), ldb )
670 CALL dtrsm(
'L',
'L',
'T', diag, k, n, alpha,
671 $ a( k*k ), k, b( k, 0 ), ldb )
672 CALL dgemm(
'T',
'N', k, n, k, -one, a( 0 ), k,
673 $ b( k, 0 ), ldb, alpha, b, ldb )
674 CALL dtrsm(
'L',
'U',
'N', diag, k, n, one,
675 $ a( k*( k+1 ) ), k, b, ldb )
693 IF( mod( n, 2 ).EQ.0 )
THEN
711 IF( normaltransr )
THEN
724 CALL dtrsm(
'R',
'U',
'T', diag, m, n2, alpha,
725 $ a( n ), n, b( 0, n1 ), ldb )
726 CALL dgemm(
'N',
'N', m, n1, n2, -one, b( 0, n1 ),
727 $ ldb, a( n1 ), n, alpha, b( 0, 0 ),
729 CALL dtrsm(
'R',
'L',
'N', diag
730 $ a( 0 ), n, b( 0, 0 ), ldb )
737 CALL dtrsm(
'R',
'L',
'T', diag, m, n1, alpha,
738 $ a( 0 ), n, b( 0, 0 ), ldb )
739 CALL dgemm(
'N',
'T', m, n2, n1, -one, b( 0, 0 ),
740 $ ldb, a( n1 ), n, alpha, b( 0, n1 ),
742 CALL dtrsm(
'R',
'U',
'N', diag, m, n2, one,
743 $ a( n ), n, b( 0, n1 ), ldb )
756 CALL dtrsm(
'R',
'L',
'T', diag, m, n1, alpha,
757 $ a( n2 ), n, b( 0, 0 ), ldb )
758 CALL dgemm(
'N',
'N', m, n2, n1, -one, b( 0, 0 ),
759 $ ldb, a( 0 ), n, alpha, b( 0, n1 ),
761 CALL dtrsm(
'R',
'U',
'N', diag, m, n2, one,
762 $ a( n1 ), n, b( 0, n1 ), ldb )
769 CALL dtrsm(
'R',
'U',
'T', diag, m, n2, alpha,
770 $ a( n1 ), n, b( 0, n1 ), ldb )
771 CALL dgemm(
'N',
'T', m, n1, n2, -one, b( 0, n1 ),
772 $ ldb, a( 0 ), n, alpha, b( 0, 0 ), ldb )
773 CALL dtrsm(
'R',
'L',
'N', diag, m, n1, one,
774 $ a( n2 ), n, b( 0, 0 ), ldb )
793 CALL dtrsm(
'R',
'L',
'N', diag, m, n2, alpha,
794 $ a( 1 ), n1, b( 0, n1 ), ldb )
795CALL dgemm(
'N',
'T', m, n1, n2, -one, b( 0, n1 ),
796 $ ldb, a( n1*n1 ), n1, alpha, b( 0, 0 ),
798 CALL dtrsm(
'R',
'U',
'T', diag, m, n1, one,
806 CALL dtrsm(
'R',
'U',
'N', diag, m, n1, alpha,
807 $ a( 0 ), n1, b( 0, 0 ), ldb )
808 CALL dgemm(
'N',
'N', m, n2, n1, -one, b( 0, 0 ),
809 $ ldb, a( n1*n1 ), n1, alpha, b( 0, n1 ),
811 CALL dtrsm(
'R',
'L',
'T', diag, m, n2, one,
812 $ a( 1 ), n1, b( 0, n1 ), ldb )
825 CALL dtrsm(
'R',
'U', 'n
', DIAG, M, N1, ALPHA,
826 $ A( N2*N2 ), N2, B( 0, 0 ), LDB )
827 CALL DGEMM( 'n
', 't
', M, N2, N1, -ONE, B( 0, 0 ),
828 $ LDB, A( 0 ), N2, ALPHA, B( 0, N1 ),
830 CALL DTRSM( 'r
', 'l
', 't
', DIAG, M, N2, ONE,
831 $ A( N1*N2 ), N2, B( 0, N1 ), LDB )
838 CALL DTRSM( 'r
', 'l
', 'n
', DIAG, M, N2, ALPHA,
839 $ A( N1*N2 ), N2, B( 0, N1 ), LDB )
840 CALL DGEMM( 'n
', 'n
', M, N1, N2, -ONE, B( 0, N1 ),
841 $ LDB, A( 0 ), N2, ALPHA, B( 0, 0 ),
843 CALL DTRSM( 'r
', 'u
', 't
', DIAG, M, N1, ONE,
844 $ A( N2*N2 ), N2, B( 0, 0 ), LDB )
856 IF( NORMALTRANSR ) THEN
869 CALL DTRSM( 'r
', 'u
', 't
', DIAG, M, K, ALPHA,
870 $ A( 0 ), N+1, B( 0, K ), LDB )
871 CALL DGEMM( 'n
', 'n
', M, K, K, -ONE, B( 0, K ),
872 $ LDB, A( K+1 ), N+1, ALPHA, B( 0, 0 ),
874 CALL DTRSM( 'r
', 'l
', 'n
', DIAG, M, K, ONE,
875 $ A( 1 ), N+1, B( 0, 0 ), LDB )
882 CALL DTRSM( 'r
', 'l
', 't
', DIAG, M, K, ALPHA,
883 $ A( 1 ), N+1, B( 0, 0 ), LDB )
884 CALL DGEMM( 'n
', 't
', M, K, K, -ONE, B( 0, 0 ),
885 $ LDB, A( K+1 ), N+1, ALPHA, B( 0, K ),
887 CALL DTRSM( 'r
', 'u
', 'n
', DIAG, M, K, ONE,
888 $ A( 0 ), N+1, B( 0, K ), LDB )
901 CALL DTRSM( 'r
', 'l
', 't
', DIAG, M, K, ALPHA,
902 $ A( K+1 ), N+1, B( 0, 0 ), LDB )
903 CALL DGEMM( 'n
', 'n
', M, K, K, -ONE, B( 0, 0 ),
904 $ LDB, A( 0 ), N+1, ALPHA, B( 0, K ),
906 CALL DTRSM( 'r
', 'u
', 'n
', DIAG, M, K, ONE,
907 $ A( K ), N+1, B( 0, K ), LDB )
914 CALL DTRSM( 'r
', 'u
', 't
', DIAG, M, K, ALPHA,
915 $ A( K ), N+1, B( 0, K ), LDB )
916 CALL DGEMM( 'n
', 't
', M, K, K, -ONE, B( 0, K ),
917 $ LDB, A( 0 ), N+1, ALPHA, B( 0, 0 ),
919 CALL DTRSM( 'r
', 'l
', 'n
', DIAG, M, K, ONE,
920 $ A( K+1 ), N+1, B( 0, 0 ), LDB )
939 CALL DTRSM( 'r
', 'l
', 'n
', DIAG, M, K, ALPHA,
940 $ A( 0 ), K, B( 0, K ), LDB )
941 CALL DGEMM( 'n
', 't
', M, K, K, -ONE, B( 0, K ),
942 $ LDB, A( ( K+1 )*K ), K, ALPHA,
944 CALL DTRSM( 'r
', 'u
', 't
', DIAG, M, K, ONE,
945 $ A( K ), K, B( 0, 0 ), LDB )
952 CALL DTRSM( 'r
', 'u
', 'n
', DIAG, M, K, ALPHA,
953 $ A( K ), K, B( 0, 0 ), LDB )
954 CALL DGEMM( 'n
', 'n
', M, K, K, -ONE, B( 0, 0 ),
955 $ LDB, A( ( K+1 )*K ), K, ALPHA,
957 CALL DTRSM( 'r
', 'l
', 't
', DIAG, M, K, ONE,
958 $ A( 0 ), K, B( 0, K ), LDB )
971 CALL DTRSM( 'r
', 'u
', 'n
', DIAG, M, K, ALPHA,
972 $ A( ( K+1 )*K ), K, B( 0, 0 ), LDB )
973 CALL DGEMM( 'n
', 't
', M, K, K, -ONE, B( 0, 0 ),
974 $ LDB, A( 0 ), K, ALPHA, B( 0, K ), LDB )
975 CALL DTRSM( 'r
', 'l
', 't
', DIAG, M, K, ONE,
976 $ A( K*K ), K, B( 0, K ), LDB )
983 CALL DTRSM( 'r
', 'l
', 'n
', DIAG, M, K, ALPHA,
984 $ A( K*K ), K, B( 0, K ), LDB )
985 CALL DGEMM( 'n
', 'n
', M, K, K, -ONE, B( 0, K ),
986 $ LDB, A( 0 ), K, ALPHA, B( 0, 0 ), LDB )
987 CALL DTRSM( 'r
', 'u
', 't
', DIAG, M, K, ONE,
988 $ A( ( K+1 )*K ), K, B( 0, 0 ), LDB )