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
'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(
'DTFSM ', -info )
347 IF( ( m.EQ.0 ) .OR. ( n.EQ.0 ) )
352 IF( alpha.EQ.zero )
THEN
369 IF( mod( m, 2 ).EQ.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 IF( .NOT.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,
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 IF( .NOT.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'
524 $ a( m1*m2 ), m2, b( m1, 0 ), ldb )
531 CALL dtrsm(
'L',
'L',
'T', diag, m2, n, alpha
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,
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.EQ.
IF( MOD( N, 2 )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, M, N1, ONE,
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 )
795 CALL 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,
799 $ A( 0 ), N1, B( 0, 0 ), LDB )
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
988 $ a( ( k+1 )*k ), k, b( 0, 0 ), ldb )