448 SUBROUTINE dtgsen( IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B, LDB,
449 $ ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, M, PL,
450 $ PR, DIF, WORK, LWORK, IWORK, LIWORK, INFO )
458 INTEGER IJOB, INFO, LDA, LDB, LDQ, LDZ, LIWORK, LWORK,
460 DOUBLE PRECISION PL, PR
465 DOUBLE PRECISION A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
466 $ b( ldb, * ), beta( * ), dif( * ), q( ldq, * ),
467 $ work( * ), z( ldz, * )
474 PARAMETER ( IDIFJB = 3 )
475 DOUBLE PRECISION ZERO, ONE
476 parameter( zero = 0.0d+0, one = 1.0d+0 )
479 LOGICAL LQUERY, PAIR, , WANTD, WANTD1, WANTD2,
481 INTEGER I, IERR, IJB, K, KASE, KK, KS, LIWMIN, LWMIN,
483 DOUBLE PRECISION DSCALE, DSUM, EPS, RDSCAL, SMLNUM
493 DOUBLE PRECISION DLAMCH
497 INTRINSIC max, sign, sqrt
504 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
506 IF( ijob.LT.0 .OR. ijob.GT.5 )
THEN
508 ELSE IF( n.LT.0 )
THEN
510 ELSE IF( lda.LT.
max( 1, n ) )
THEN
512 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
514 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
516 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
521 CALL xerbla(
'DTGSEN', -info )
528 smlnum = dlamch(
'S' ) / eps
531 wantp = ijob.EQ.1 .OR. ijob.GE.4
532 wantd1 = ijob.EQ.2 .OR. ijob.EQ.4
533 wantd2 = ijob.EQ.3 .OR. ijob.EQ.5
534 wantd = wantd1 .OR. wantd2
541 IF( .NOT.lquery .OR. ijob.NE.0 )
THEN
547 IF( a( k+1, k ).EQ.zero )
THEN
552 IF(
SELECT( k ) .OR.
SELECT( k+1 ) )
563 IF( ijob.EQ.1 .OR. ijob.EQ.2 .OR. ijob.EQ.4 )
THEN
564 lwmin =
max( 1, 4*n+16, 2*m*( n-m ) )
565 liwmin =
max( 1, n+6 )
566 ELSE IF( ijob.EQ.3 .OR. ijob.EQ.5 )
THEN
567 lwmin =
max( 1, 4*n+16, 4*m*( n-m ) )
568 liwmin =
max( 1, 2*m*( n-m ), n+6 )
570 lwmin =
max( 1, 4*n+16 )
577 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
579 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
584 CALL xerbla(
'DTGSEN', -info )
586 ELSE IF( lquery )
THEN
592 IF( m.EQ.n .OR. m.EQ.0 )
THEN
601 CALL dlassq( n, a( 1, i ), 1, dscale, dsum )
602 CALL dlassq( n, b( 1, i ), 1, dscale, dsum )
604 dif( 1 ) = dscale*sqrt( dsum )
621 IF( a( k+1, k ).NE.zero )
THEN
637 $
CALL dtgexc( wantq, wantz, n, a, lda, b, ldb, q, ldq,
638 $ z, ldz, kk, ks, work, lwork, ierr )
670 CALL dlacpy(
'Full', n1, n2, a( 1, i ), lda, work, n1 )
671 CALL dlacpy(
'Full', n1, n2, b( 1, i ), ldb, work( n1*n2+1 ),
673 CALL dtgsyl(
'N', ijb, n1, n2, a, lda, a( i, i ), lda, work,
674 $ n1, b, ldb, b( i, i ), ldb, work( n1*n2+1 ), n1,
675 $ dscale, dif( 1 ), work( n1*n2*2+1 ),
676 $ lwork-2*n1*n2, iwork, ierr )
683 CALL dlassq( n1*n2, work, 1, rdscal, dsum )
684 pl = rdscal*sqrt( dsum )
685 IF( pl.EQ.zero )
THEN
688 pl = dscale / ( sqrt( dscale*dscale / pl+pl )*sqrt( pl ) )
692 CALL dlassq( n1*n2, work( n1*n2+1 ), 1, rdscal, dsum )
693 pr = rdscal*sqrt( dsum )
694 IF( pr.EQ.zero )
THEN
697 pr = dscale / ( sqrt( dscale*dscale / pr+pr )*sqrt( pr ) )
713 CALL dtgsyl(
'N', ijb, n1, n2, a, lda, a( i, i ), lda, work,
714 $ n1, b, ldb, b( i, i ), ldb, work( n1*n2
716 $ lwork-2*n1*n2, iwork, ierr )
720 CALL dtgsyl(
'N', ijb, n2, n1, a( i, i ), lda, a, lda, work,
721 $ n2, b( i, i ), ldb, b, ldb, work( n1*n2+1 ),
722 $ n2, dscale, dif( 2 ), work( 2*n1*n2+1 ),
723 $ lwork-2*n1*n2, iwork, ierr )
742 CALL dlacn2( mn2, work( mn2+1 ), work, iwork, dif( 1 ),
749 CALL dtgsyl( 'n
', IJB, N1, N2, A, LDA, A( I, I ), LDA,
750 $ WORK, N1, B, LDB, B( I, I ), LDB,
751 $ WORK( N1*N2+1 ), N1, DSCALE, DIF( 1 ),
752 $ WORK( 2*N1*N2+1 ), LWORK-2*N1*N2, IWORK,
758 CALL DTGSYL( 't
', IJB, N1, N2, A, LDA, A( I, I ), LDA,
759 $ WORK, N1, B, LDB, B( I, I ), LDB,
760 $ WORK( N1*N2+1 ), N1, DSCALE, DIF( 1 ),
761 $ WORK( 2*N1*N2+1 ), LWORK-2*N1*N2, IWORK,
766 DIF( 1 ) = DSCALE / DIF( 1 )
771 CALL DLACN2( MN2, WORK( MN2+1 ), WORK, IWORK, DIF( 2 ),
778 CALL DTGSYL( 'n
', IJB, N2, N1, A( I, I ), LDA, A, LDA,
779 $ WORK, N2, B( I, I ), LDB, B, LDB,
780 $ WORK( N1*N2+1 ), N2, DSCALE, DIF( 2 ),
781 $ WORK( 2*N1*N2+1 ), LWORK-2*N1*N2, IWORK,
787 CALL DTGSYL( 't
', IJB, N2, N1, A( I, I ), LDA, A, LDA,
788 $ WORK, N2, B( I, I ), LDB, B, LDB,
789 $ WORK( N1*N2+1 ), N2, DSCALE, DIF( 2 ),
790 $ WORK( 2*N1*N2+1 ), LWORK-2*N1*N2, IWORK,
795 DIF( 2 ) = DSCALE / DIF( 2 )
812.NE.
IF( A( K+1, K )ZERO ) THEN
821 WORK( 1 ) = A( K, K )
822 WORK( 2 ) = A( K+1, K )
823 WORK( 3 ) = A( K, K+1 )
824 WORK( 4 ) = A( K+1, K+1 )
825 WORK( 5 ) = B( K, K )
826 WORK( 6 ) = B( K+1, K )
827 WORK( 7 ) = B( K, K+1 )
828 WORK( 8 ) = B( K+1, K+1 )
829 CALL DLAG2( WORK, 2, WORK( 5 ), 2, SMLNUM*EPS, BETA( K ),
830 $ BETA( K+1 ), ALPHAR( K ), ALPHAR( K+1 ),
832 ALPHAI( K+1 ) = -ALPHAI( K )
836.LT.
IF( SIGN( ONE, B( K, K ) )ZERO ) THEN
841 A( K, I ) = -A( K, I )
842 B( K, I ) = -B( K, I )
843 IF( WANTQ ) Q( I, K ) = -Q( I, K )
847 ALPHAR( K ) = A( K, K )
849 BETA( K ) = B( K, K )