430 SUBROUTINE ctgsen( IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B, LDB,
431 $ ALPHA, BETA, Q, LDQ, Z, LDZ, M, PL, PR, DIF,
432 $ WORK, LWORK, IWORK, LIWORK, INFO )
440 INTEGER IJOB, , LDA, LDB, LDQ, LDZ, LIWORK, LWORK,
448 COMPLEX A( LDA, * ), ALPHA( * ), B( LDB, * ),
449 $ beta( * ), q( ldq, * ), work( * ), z( ldz, * )
456 PARAMETER ( IDIFJB = 3 )
458 parameter( zero = 0.0e+0, one = 1.0e+0 )
461 LOGICAL LQUERY, SWAP, WANTD, WANTD1, WANTD2, WANTP
462 INTEGER I, IERR, IJB, K, KASE, KS, LIWMIN, LWMIN, MN2,
464 REAL DSCALE, DSUM, RDSCAL, SAFMIN
472 EXTERNAL CLACN2, CLACPY, CLASSQ, CSCAL, CTGEXC, CTGSYL,
476 INTRINSIC abs,
cmplx, conjg,
max, sqrt
483 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
485 IF( ijob.LT.0 .OR. ijob.GT.5 )
THEN
487 ELSE IF( n.LT.0 )
THEN
489 ELSE IF( lda.LT.
max( 1, n ) )
THEN
491 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
493 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
495 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
506.EQ..OR..GE.
WANTP = IJOB1 IJOB4
507.EQ..OR..EQ.
WANTD1 = IJOB2 IJOB4
508.EQ..OR..EQ.
WANTD2 = IJOB3 IJOB5
509.OR.
WANTD = WANTD1 WANTD2
515.NOT..OR..NE.
IF( LQUERY IJOB0 ) THEN
517 ALPHA( K ) = A( K, K )
518 BETA( K ) = B( K, K )
529.EQ..OR..EQ..OR..EQ.
IF( IJOB1 IJOB2 IJOB4 ) THEN
530 LWMIN = MAX( 1, 2*M*(N-M) )
531 LIWMIN = MAX( 1, N+2 )
532.EQ..OR..EQ.
ELSE IF( IJOB3 IJOB5 ) THEN
533 LWMIN = MAX( 1, 4*M*(N-M) )
534 LIWMIN = MAX( 1, 2*M*(N-M), N+2 )
543.LT..AND..NOT.
IF( LWORKLWMIN LQUERY ) THEN
545.LT..AND..NOT.
ELSE IF( LIWORKLIWMIN LQUERY ) THEN
550 CALL XERBLA( 'ctgsen', -INFO )
552 ELSE IF( LQUERY ) THEN
558.EQ..OR..EQ.
IF( MN M0 ) THEN
567 CALL CLASSQ( N, A( 1, I ), 1, DSCALE, DSUM )
568 CALL CLASSQ( N, B( 1, I ), 1, DSCALE, DSUM )
570 DIF( 1 ) = DSCALE*SQRT( DSUM )
578 SAFMIN = SLAMCH( 's
' )
592 $ CALL CTGEXC( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z,
621 CALL CLACPY( 'full
', N1, N2, A( 1, I ), LDA, WORK, N1 )
622 CALL CLACPY( 'full
', N1, N2, B( 1, I ), LDB, WORK( N1*N2+1 ),
625 CALL CTGSYL( 'n
', IJB, N1, N2, A, LDA, A( I, I ), LDA, WORK,
626 $ N1, B, LDB, B( I, I ), LDB, WORK( N1*N2+1 ), N1,
627 $ DSCALE, DIF( 1 ), WORK( N1*N2*2+1 ),
628 $ LWORK-2*N1*N2, IWORK, IERR )
635 CALL CLASSQ( N1*N2, WORK, 1, RDSCAL, DSUM )
636 PL = RDSCAL*SQRT( DSUM )
637.EQ.
IF( PLZERO ) THEN
640 PL = DSCALE / ( SQRT( DSCALE*DSCALE / PL+PL )*SQRT( PL ) )
644 CALL CLASSQ( N1*N2, WORK( N1*N2+1 ), 1, RDSCAL, DSUM )
645 PR = RDSCAL*SQRT( DSUM )
646.EQ.
IF( PRZERO ) THEN
649 PR = DSCALE / ( SQRT( DSCALE*DSCALE / PR+PR )*SQRT( PR ) )
664 CALL CTGSYL( 'n', ijb, n1, n2, a, lda, a( i, i ), lda, work,
665 $ n1, b, ldb, b( i, i ), ldb, work( n1*n2+1 ),
666 $ n1, dscale, dif( 1 ), work( n1*n2*2+1 ),
667 $ lwork-2*n1*n2, iwork, ierr )
671 CALL ctgsyl(
'N', ijb, n2, n1, a( i, i ), lda, a, lda, work,
672 $ n2, b( i, i ), ldb, b, ldb, work( n1*n2+1 ),
673 $ n2, dscale, dif( 2 ), work( n1*n2*2+1 ),
674 $ lwork-2*n1*n2, iwork, ierr )
692 CALL clacn2( mn2, work( mn2+1 ), work, dif( 1 ), kase,
699 CALL ctgsyl(
'N', ijb, n1, n2, a, lda, a( i, i ), lda,
700 $ work, n1, b, ldb, b( i, i ), ldb,
701 $ work( n1*n2+1 ), n1, dscale, dif( 1 ),
702 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
708 CALL ctgsyl(
'C', ijb, n1, n2, a, lda, a( i, i ), lda,
709 $ work, n1, b, ldb, b( i, i ), ldb,
710 $ work( n1*n2+1 ), n1, dscale, dif( 1 ),
711 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
716 dif( 1 ) = dscale / dif( 1 )
721 CALL clacn2( mn2, work( mn2+1 ), work, dif( 2 ), kase,
728 CALL ctgsyl(
'N', ijb, n2, n1, a( i, i ), lda, a, lda,
729 $ work, n2, b( i, i ), ldb, b, ldb,
730 $ work( n1*n2+1 ), n2, dscale, dif( 2 ),
731 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
737 CALL ctgsyl(
'C', ijb, n2, n1, a( i, i ), lda, a, lda,
738 $ work, n2, b, ldb, b( i, i ), ldb,
739 $ work( n1*n2+1 ), n2, dscale, dif( 2 ),
740 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
745 dif( 2 ) = dscale / dif( 2 )
754 dscale = abs( b( k, k ) )
755 IF( dscale.GT.safmin )
THEN
756 temp1 = conjg( b( k, k ) / dscale )
757 temp2 = b( k, k ) / dscale
759 CALL cscal( n-k, temp1, b( k, k+1 ), ldb )
760 CALL cscal( n-k+1, temp1, a( k, k ), lda )
762 $
CALL cscal( n, temp2, q( 1, k ), 1 )
764 b( k, k ) =
cmplx( zero, zero )
767 alpha( k ) = a( k, k )
768 beta( k ) = b( k, k )