271 SUBROUTINE dtgsy2( TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC, D,
272 $ LDD, E, LDE, F, LDF, SCALE, RDSUM, RDSCAL,
281 INTEGER IJOB, INFO, LDA, LDB, LDC, LDD, LDE, LDF, M, N,
283 DOUBLE PRECISION RDSCAL, RDSUM, SCALE
287 DOUBLE PRECISION A( , * ), B( LDB, * ), C( LDC, * ),
288 $ d( ldd, * ), e( lde, * ), f( ldf, * )
298 DOUBLE PRECISION ZERO, ONE
299 parameter( zero = 0.0d+0, one = 1.0d+0 )
303 INTEGER I, IE, IERR, II, IS, ISP1, J, JE, JJ, JS, JSP1,
304 $ k, mb, nb, p, q, zdim
305 DOUBLE PRECISION ALPHA, SCALOC
308 INTEGER IPIV( LDZ ), JPIV( LDZ )
309 DOUBLE PRECISION RHS( LDZ ), Z( LDZ, LDZ )
328 notran = lsame( trans,
'N' )
329 IF( .NOT.notran .AND. .NOT.lsame( trans, 't
' ) ) THEN
331 ELSE IF( NOTRAN ) THEN
332.LT..OR..GT.
IF( ( IJOB0 ) ( IJOB2 ) ) THEN
339.LE.
ELSE IF( N0 ) THEN
341.LT.
ELSE IF( LDAMAX( 1, M ) ) THEN
343.LT.
ELSE IF( LDBMAX( 1, N ) ) THEN
345.LT.
ELSE IF( LDCMAX( 1, M ) ) THEN
347.LT.
ELSE IF( LDDMAX( 1, M ) ) THEN
349.LT.
ELSE IF( LDEMAX( 1, N ) ) THEN
351.LT.
ELSE IF( LDFMAX( 1, M ) ) THEN
356 CALL XERBLA( 'dtgsy2', -INFO )
372.NE.
IF( A( I+1, I )ZERO ) THEN
392.NE.
IF( B( J+1, J )ZERO ) THEN
414 JE = IWORK( J+1 ) - 1
420 IE = IWORK( I+1 ) - 1
424.EQ..AND..EQ.
IF( ( MB1 ) ( NB1 ) ) THEN
428 Z( 1, 1 ) = A( IS, IS )
429 Z( 2, 1 ) = D( IS, IS )
430 Z( 1, 2 ) = -B( JS, JS )
431 Z( 2, 2 ) = -E( JS, JS )
435 RHS( 1 ) = C( IS, JS )
436 RHS( 2 ) = F( IS, JS )
440 CALL DGETC2( ZDIM, Z, LDZ, IPIV, JPIV, IERR )
445 CALL DGESC2( ZDIM, Z, LDZ, RHS, IPIV, JPIV,
447.NE.
IF( SCALOCONE ) THEN
449 CALL DSCAL( M, SCALOC, C( 1, K ), 1 )
450 CALL DSCAL( M, SCALOC, F( 1, K ), 1 )
455 CALL DLATDF( IJOB, ZDIM, Z, LDZ, RHS, RDSUM,
456 $ RDSCAL, IPIV, JPIV )
461 C( IS, JS ) = RHS( 1 )
462 F( IS, JS ) = RHS( 2 )
469 CALL DAXPY( IS-1, ALPHA, A( 1, IS ), 1, C( 1, JS ),
471 CALL DAXPY( IS-1, ALPHA, D( 1, IS ), 1, F( 1, JS ),
475 CALL DAXPY( N-JE, RHS( 2 ), B( JS, JE+1 ), LDB,
476 $ C( IS, JE+1 ), LDC )
477 CALL DAXPY( N-JE, RHS( 2 ), E( JS, JE+1 ), LDE,
478 $ F( IS, JE+1 ), LDF )
481.EQ..AND..EQ.
ELSE IF( ( MB1 ) ( NB2 ) ) THEN
485 Z( 1, 1 ) = A( IS, IS )
487 Z( 3, 1 ) = D( IS, IS )
491 Z( 2, 2 ) = A( IS, IS )
493 Z( 4, 2 ) = D( IS, IS )
495 Z( 1, 3 ) = -B( JS, JS )
496 Z( 2, 3 ) = -B( JS, JSP1 )
497 Z( 3, 3 ) = -E( JS, JS )
498 Z( 4, 3 ) = -E( JS, JSP1 )
500 Z( 1, 4 ) = -B( JSP1, JS )
501 Z( 2, 4 ) = -B( JSP1, JSP1 )
503 Z( 4, 4 ) = -E( JSP1, JSP1 )
507 RHS( 1 ) = C( IS, JS )
508 RHS( 2 ) = C( IS, JSP1 )
509 RHS( 3 ) = F( IS, JS )
510 RHS( 4 ) = F( IS, JSP1 )
514 CALL DGETC2( ZDIM, Z, LDZ, IPIV, JPIV, IERR )
519 CALL DGESC2( ZDIM, Z, LDZ, RHS, IPIV, JPIV,
521.NE.
IF( SCALOCONE ) THEN
523 CALL DSCAL( M, SCALOC, C( 1, K ), 1 )
524 CALL DSCAL( M, SCALOC, F( 1, K ), 1 )
529 CALL DLATDF( IJOB, ZDIM, Z, LDZ, RHS, RDSUM,
530 $ RDSCAL, IPIV, JPIV )
535 C( IS, JS ) = RHS( 1 )
536 C( IS, JSP1 ) = RHS( 2 )
537 F( IS, JS ) = RHS( 3 )
538 F( IS, JSP1 ) = RHS( 4 )
544 CALL DGER( IS-1, NB, -ONE, A( 1, IS ), 1, RHS( 1 ),
545 $ 1, C( 1, JS ), LDC )
546 CALL DGER( IS-1, NB, -ONE, D( 1, IS ), 1, RHS( 1 ),
547 $ 1, F( 1, JS ), LDF )
550 CALL DAXPY( N-JE, RHS( 3 ), B( JS, JE+1 ), LDB,
551 $ C( IS, JE+1 ), LDC )
552 CALL DAXPY( N-JE, RHS( 3 ), E( JS, JE+1 ), LDE,
553 $ F( IS, JE+1 ), LDF )
554 CALL DAXPY( N-JE, RHS( 4 ), B( JSP1, JE+1 ), LDB,
555 $ C( IS, JE+1 ), LDC )
556 CALL DAXPY( N-JE, RHS( 4 ), E( JSP1, JE+1 ), LDE,
557 $ F( IS, JE+1 ), LDF )
560.EQ..AND..EQ.
ELSE IF( ( MB2 ) ( NB1 ) ) THEN
564 Z( 1, 1 ) = A( IS, IS )
565 Z( 2, 1 ) = A( ISP1, IS )
566 Z( 3, 1 ) = D( IS, IS )
569 Z( 1, 2 ) = A( IS, ISP1 )
570 Z( 2, 2 ) = A( ISP1, ISP1 )
571 Z( 3, 2 ) = D( IS, ISP1 )
572 Z( 4, 2 ) = D( ISP1, ISP1 )
574 Z( 1, 3 ) = -B( JS, JS )
576 Z( 3, 3 ) = -E( JS, JS )
580 Z( 2, 4 ) = -B( JS, JS )
582 Z( 4, 4 ) = -E( JS, JS )
586 RHS( 1 ) = C( IS, JS )
587 RHS( 2 ) = C( ISP1, JS )
588 RHS( 3 ) = F( IS, JS )
589 RHS( 4 ) = F( ISP1, JS )
593 CALL DGETC2( ZDIM, Z, LDZ, IPIV, JPIV, IERR )
597 CALL DGESC2( ZDIM, Z, LDZ, RHS, IPIV, JPIV,
599.NE.
IF( SCALOCONE ) THEN
601 CALL DSCAL( M, SCALOC, C( 1, K ), 1 )
602 CALL DSCAL( M, SCALOC, F( 1, K ), 1 )
607 CALL DLATDF( IJOB, ZDIM, Z, LDZ, RHS, RDSUM,
608 $ RDSCAL, IPIV, JPIV )
613 C( IS, JS ) = RHS( 1 )
614 C( ISP1, JS ) = RHS( 2 )
615 F( IS, JS ) = RHS( 3 )
616 F( ISP1, JS ) = RHS( 4 )
622 CALL DGEMV( 'n
', IS-1, MB, -ONE, A( 1, IS ), LDA,
623 $ RHS( 1 ), 1, ONE, C( 1, JS ), 1 )
624 CALL DGEMV( 'n
', IS-1, MB, -ONE, D( 1, IS ), LDD,
625 $ RHS( 1 ), 1, ONE, F( 1, JS ), 1 )
628 CALL DGER( MB, N-JE, ONE, RHS( 3 ), 1,
629 $ B( JS, JE+1 ), LDB, C( IS, JE+1 ), LDC )
630 CALL DGER( MB, N-JE, ONE, RHS( 3 ), 1,
631 $ E( JS, JE+1 ), LDE, F( IS, JE+1 ), LDF )
634.EQ..AND..EQ.
ELSE IF( ( MB2 ) ( NB2 ) ) THEN
638 CALL DLASET( 'f
', LDZ, LDZ, ZERO, ZERO, Z, LDZ )
640 Z( 1, 1 ) = A( IS, IS )
641 Z( 2, 1 ) = A( ISP1, IS )
642 Z( 5, 1 ) = D( IS, IS )
644 Z( 1, 2 ) = A( IS, ISP1 )
645 Z( 2, 2 ) = A( ISP1, ISP1 )
646 Z( 5, 2 ) = D( IS, ISP1 )
647 Z( 6, 2 ) = D( ISP1, ISP1 )
649 Z( 3, 3 ) = A( IS, IS )
650 Z( 4, 3 ) = A( ISP1, IS )
651 Z( 7, 3 ) = D( IS, IS )
653 Z( 3, 4 ) = A( IS, ISP1 )
654 Z( 4, 4 ) = A( ISP1, ISP1 )
655 Z( 7, 4 ) = D( IS, ISP1 )
656 Z( 8, 4 ) = D( ISP1, ISP1 )
658 Z( 1, 5 ) = -B( JS, JS )
659 Z( 3, 5 ) = -B( JS, JSP1 )
660 Z( 5, 5 ) = -E( JS, JS )
661 Z( 7, 5 ) = -E( JS, JSP1 )
663 Z( 2, 6 ) = -B( JS, JS )
664 Z( 4, 6 ) = -B( JS, JSP1 )
665 Z( 6, 6 ) = -E( JS, JS )
666 Z( 8, 6 ) = -E( JS, JSP1 )
668 Z( 1, 7 ) = -B( JSP1, JS )
669 Z( 3, 7 ) = -B( JSP1, JSP1 )
670 Z( 7, 7 ) = -E( JSP1, JSP1 )
672 Z( 2, 8 ) = -B( JSP1, JS )
673 Z( 4, 8 ) = -B( JSP1, JSP1 )
674 Z( 8, 8 ) = -E( JSP1, JSP1 )
681 CALL DCOPY( MB, C( IS, JS+JJ ), 1, RHS( K ), 1 )
682 CALL DCOPY( MB, F( IS, JS+JJ ), 1, RHS( II ), 1 )
689 CALL DGETC2( ZDIM, Z, LDZ, IPIV, JPIV, IERR )
693 CALL DGESC2( ZDIM, Z, LDZ, RHS, IPIV, JPIV,
695.NE.
IF( SCALOCONE ) THEN
697 CALL DSCAL( M, SCALOC, C( 1, K ), 1 )
698 CALL DSCAL( M, SCALOC, F( 1, K ), 1 )
703 CALL DLATDF( IJOB, ZDIM, Z, LDZ, RHS, RDSUM,
704 $ RDSCAL, IPIV, JPIV )
711 DO 100 JJ = 0, NB - 1
712 CALL DCOPY( MB, RHS( K ), 1, C( IS, JS+JJ ), 1 )
713 CALL DCOPY( MB, RHS( II ), 1, F( IS, JS+JJ ), 1 )
722 CALL DGEMM( 'n
', 'n
', IS-1, NB, MB, -ONE,
723 $ A( 1, IS ), LDA, RHS( 1 ), MB, ONE,
725 CALL DGEMM( 'n
', 'n
', IS-1, NB, MB, -ONE,
726 $ D( 1, IS ), LDD, RHS( 1 ), MB, ONE,
731 CALL DGEMM( 'n
', 'n
', MB, N-JE, NB, ONE, RHS( K ),
732 $ MB, B( JS, JE+1 ), LDB, ONE,
733 $ C( IS, JE+1 ), LDC )
734 CALL DGEMM( 'n
', 'n
', MB, N-JE, NB, ONE, RHS( K ),
735 $ MB, E( JS, JE+1 ), LDE, ONE,
736 $ F( IS, JE+1 ), LDF )
756 IE = IWORK ( I+1 ) - 1
758 DO 190 J = Q, P + 2, -1
762 JE = IWORK( J+1 ) - 1
765.EQ..AND..EQ.
IF( ( MB1 ) ( NB1 ) ) THEN
769 Z( 1, 1 ) = A( IS, IS )
770 Z( 2, 1 ) = -B( JS, JS )
771 Z( 1, 2 ) = D( IS, IS )
772 Z( 2, 2 ) = -E( JS, JS )
776 RHS( 1 ) = C( IS, JS )
777 RHS( 2 ) = F( IS, JS )
781 CALL DGETC2( ZDIM, Z, LDZ, IPIV, JPIV, IERR )
785 CALL DGESC2( ZDIM, Z, LDZ, RHS, IPIV, JPIV, SCALOC )
786.NE.
IF( SCALOCONE ) THEN
788 CALL DSCAL( M, SCALOC, C( 1, K ), 1 )
789 CALL DSCAL( M, SCALOC, F( 1, K ), 1 )
796 C( IS, JS ) = RHS( 1 )
797 F( IS, JS ) = RHS( 2 )
804 CALL DAXPY( JS-1, ALPHA, B( 1, JS ), 1, F( IS, 1 ),
807 CALL DAXPY( JS-1, ALPHA, E( 1, JS ), 1, F( IS, 1 ),
812 CALL DAXPY( M-IE, ALPHA, A( IS, IE+1 ), LDA,
815 CALL DAXPY( M-IE, ALPHA, D( IS, IE+1 ), LDD,
819.EQ..AND..EQ.
ELSE IF( ( MB1 ) ( NB2 ) ) THEN
823 Z( 1, 1 ) = A( IS, IS )
825 Z( 3, 1 ) = -B( JS, JS )
826 Z( 4, 1 ) = -B( JSP1, JS )
829 Z( 2, 2 ) = A( IS, IS )
830 Z( 3, 2 ) = -B( JS, JSP1 )
831 Z( 4, 2 ) = -B( JSP1, JSP1 )
833 Z( 1, 3 ) = D( IS, IS )
835 Z( 3, 3 ) = -E( JS, JS )
839 Z( 2, 4 ) = D( IS, IS )
840 Z( 3, 4 ) = -E( JS, JSP1 )
841 Z( 4, 4 ) = -E( JSP1, JSP1 )
845 RHS( 1 ) = C( IS, JS )
846 RHS( 2 ) = C( IS, JSP1 )
847 RHS( 3 ) = F( IS, JS )
848 RHS( 4 ) = F( IS, JSP1 )
852 CALL DGETC2( ZDIM, Z, LDZ, IPIV, JPIV, IERR )
855 CALL DGESC2( ZDIM, Z, LDZ, RHS, IPIV, JPIV, SCALOC )
856.NE.
IF( SCALOCONE ) THEN
858 CALL DSCAL( M, SCALOC, C( 1, K ), 1 )
859 CALL DSCAL( M, SCALOC, F( 1, K ), 1 )
866 C( IS, JS ) = RHS( 1 )
867 C( IS, JSP1 ) = RHS( 2 )
868 F( IS, JS ) = RHS( 3 )
869 F( IS, JSP1 ) = RHS( 4 )
875 CALL DAXPY( JS-1, RHS( 1 ), B( 1, JS ), 1,
877 CALL DAXPY( JS-1, RHS( 2 ), B( 1, JSP1 ), 1,
879 CALL DAXPY( JS-1, RHS( 3 ), E( 1, JS ), 1,
881 CALL DAXPY( JS-1, RHS( 4 ), E( 1, JSP1 ), 1,
885 CALL DGER( M-IE, NB, -ONE, A( IS, IE+1 ), LDA,
886 $ RHS( 1 ), 1, C( IE+1, JS ), LDC )
887 CALL DGER( M-IE, NB, -ONE, D( IS, IE+1 ), LDD,
888 $ RHS( 3 ), 1, C( IE+1, JS ), LDC )
891.EQ..AND..EQ.
ELSE IF( ( MB2 ) ( NB1 ) ) THEN
895 Z( 1, 1 ) = A( IS, IS )
896 Z( 2, 1 ) = A( IS, ISP1 )
897 Z( 3, 1 ) = -B( JS, JS )
900 Z( 1, 2 ) = A( ISP1, IS )
901 Z( 2, 2 ) = A( ISP1, ISP1 )
903 Z( 4, 2 ) = -B( JS, JS )
905 Z( 1, 3 ) = D( IS, IS )
906 Z( 2, 3 ) = D( IS, ISP1 )
907 Z( 3, 3 ) = -E( JS, JS )
911 Z( 2, 4 ) = D( ISP1, ISP1 )
913 Z( 4, 4 ) = -E( JS, JS )
917 RHS( 1 ) = C( IS, JS )
918 RHS( 2 ) = C( ISP1, JS )
919 RHS( 3 ) = F( IS, JS )
920 RHS( 4 ) = F( ISP1, JS )
924 CALL DGETC2( ZDIM, Z, LDZ, IPIV, JPIV, IERR )
928 CALL DGESC2( ZDIM, Z, LDZ, RHS, IPIV, JPIV, SCALOC )
929.NE.
IF( SCALOCONE ) THEN
931 CALL DSCAL( M, SCALOC, C( 1, K ), 1 )
932 CALL DSCAL( M, SCALOC, F( 1, K ), 1 )
939 C( IS, JS ) = RHS( 1 )
940 C( ISP1, JS ) = RHS( 2 )
941 F( IS, JS ) = RHS( 3 )
942 F( ISP1, JS ) = RHS( 4 )
948 CALL DGER( MB, JS-1, ONE, RHS( 1 ), 1, B( 1, JS ),
949 $ 1, F( IS, 1 ), LDF )
950 CALL DGER( MB, JS-1, ONE, RHS( 3 ), 1, E( 1, JS ),
951 $ 1, F( IS, 1 ), LDF )
954 CALL DGEMV( 't
', MB, M-IE, -ONE, A( IS, IE+1 ),
955 $ LDA, RHS( 1 ), 1, ONE, C( IE+1, JS ),
957 CALL DGEMV( 't
', MB, M-IE, -ONE, D( IS, IE+1 ),
958 $ LDD, RHS( 3 ), 1, ONE, C( IE+1, JS ),
962.EQ..AND..EQ.
ELSE IF( ( MB2 ) ( NB2 ) ) THEN
966 CALL DLASET( 'f
', LDZ, LDZ, ZERO, ZERO, Z, LDZ )
968 Z( 1, 1 ) = A( IS, IS )
969 Z( 2, 1 ) = A( IS, ISP1 )
970 Z( 5, 1 ) = -B( JS, JS )
971 Z( 7, 1 ) = -B( JSP1, JS )
973 Z( 1, 2 ) = A( ISP1, IS )
974 Z( 2, 2 ) = A( ISP1, ISP1 )
975 Z( 6, 2 ) = -B( JS, JS )
976 Z( 8, 2 ) = -B( JSP1, JS )
978 Z( 3, 3 ) = A( IS, IS )
979 Z( 4, 3 ) = A( IS, ISP1 )
980 Z( 5, 3 ) = -B( JS, JSP1 )
981 Z( 7, 3 ) = -B( JSP1, JSP1 )
983 Z( 3, 4 ) = A( ISP1, IS )
984 Z( 4, 4 ) = A( ISP1, ISP1 )
985 Z( 6, 4 ) = -B( JS, JSP1 )
986 Z( 8, 4 ) = -B( JSP1, JSP1 )
988 Z( 1, 5 ) = D( IS, IS )
989 Z( 2, 5 ) = D( IS, ISP1 )
990 Z( 5, 5 ) = -E( JS, JS )
992 Z( 2, 6 ) = D( ISP1, ISP1 )
993 Z( 6, 6 ) = -E( JS, JS )
995 Z( 3, 7 ) = D( IS, IS )
996 Z( 4, 7 ) = D( IS, ISP1 )
997 Z( 5, 7 ) = -E( JS, JSP1 )
998 Z( 7, 7 ) = -E( JSP1, JSP1 )
1000 Z( 4, 8 ) = D( ISP1, ISP1 )
1001 Z( 6, 8 ) = -E( JS, JSP1 )
1002 Z( 8, 8 ) = -E( JSP1, JSP1 )
1008 DO 160 JJ = 0, NB - 1
1009 CALL DCOPY( MB, C( IS, JS+JJ ), 1, RHS( K ), 1 )
1010 CALL DCOPY( MB, F( IS, JS+JJ ), 1, RHS( II ), 1 )
1018 CALL DGETC2( ZDIM, Z, LDZ, IPIV, JPIV, IERR )
1022 CALL DGESC2( ZDIM, Z, LDZ, RHS, IPIV, JPIV, SCALOC )
1023.NE.
IF( SCALOCONE ) THEN
1025 CALL DSCAL( M, SCALOC, C( 1, K ), 1 )
1026 CALL DSCAL( M, SCALOC, F( 1, K ), 1 )
1028 SCALE = SCALE*SCALOC
1035 DO 180 JJ = 0, NB - 1
1036 CALL DCOPY( MB, RHS( K ), 1, C( IS, JS+JJ ), 1 )
1037 CALL DCOPY( MB, RHS( II ), 1, F( IS, JS+JJ ), 1 )
1046 CALL DGEMM( 'n
', 't
', MB, JS-1, NB, ONE,
1047 $ C( IS, JS ), LDC, B( 1, JS ), LDB, ONE,
1049 CALL DGEMM( 'n
', 't
', MB, JS-1, NB, ONE,
1050 $ F( IS, JS ), LDF, E( 1, JS ), LDE, ONE,
1054 CALL DGEMM( 't
', 'n
', M-IE, NB, MB, -ONE,
1055 $ A( IS, IE+1 ), LDA, C( IS, JS ), LDC,
1056 $ ONE, C( IE+1, JS ), LDC )
1057 CALL DGEMM( 't
', 'n
', M-IE, NB, MB, -ONE,
1058 $ D( IS, IE+1 ), LDD, F( IS, JS ), LDF,
1059 $ ONE, C( IE+1, JS ), LDC )
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine xerbla(srname, info)
XERBLA
subroutine dgetc2(n, a, lda, ipiv, jpiv, info)
DGETC2 computes the LU factorization with complete pivoting of the general n-by-n matrix.
subroutine dgesc2(n, a, lda, rhs, ipiv, jpiv, scale)
DGESC2 solves a system of linear equations using the LU factorization with complete pivoting computed...
subroutine dlatdf(ijob, n, z, ldz, rhs, rdsum, rdscal, ipiv, jpiv)
DLATDF uses the LU factorization of the n-by-n matrix computed by sgetc2 and computes a contribution ...
subroutine dtgsy2(trans, ijob, m, n, a, lda, b, ldb, c, ldc, d, ldd, e, lde, f, ldf, scale, rdsum, rdscal, iwork, pq, info)
DTGSY2 solves the generalized Sylvester equation (unblocked algorithm).
subroutine dscal(n, da, dx, incx)
DSCAL
subroutine daxpy(n, da, dx, incx, dy, incy)
DAXPY
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY
subroutine dgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
DGEMV
subroutine dger(m, n, alpha, x, incx, y, incy, a, lda)
DGER
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM