432 SUBROUTINE ctgsen( IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B, LDB,
433 $ ALPHA, BETA, Q, LDQ, Z, LDZ, M, PL, PR, DIF,
434 $ WORK, LWORK, IWORK, LIWORK, INFO )
443 INTEGER IJOB, INFO, LDA, LDB, LDQ, LDZ, LIWORK, LWORK,
451 COMPLEX A( lda, * ), ALPHA( * ), B( ldb, * ),
452 $ beta( * ), q( ldq, * ), work( * ), z( ldz, * )
459 parameter( idifjb = 3 )
461 parameter( zero = 0.0e+0, one = 1.0e+0 )
464 LOGICAL LQUERY, SWAP, WANTD, WANTD1, WANTD2, WANTP
465 INTEGER I, IERR, IJB, K, KASE, KS, LIWMIN, LWMIN, MN2,
467 REAL DSCALE, DSUM, RDSCAL, SAFMIN
479 INTRINSIC abs, cmplx, conjg, max, sqrt
486 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
488 IF( ijob.LT.0 .OR. ijob.GT.5 )
THEN 490 ELSE IF( n.LT.0 )
THEN 492 ELSE IF( lda.LT.max( 1, n ) )
THEN 494 ELSE IF( ldb.LT.max( 1, n ) )
THEN 496 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN 498 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 503 CALL xerbla(
'CTGSEN', -info )
509 wantp = ijob.EQ.1 .OR. ijob.GE.4
510 wantd1 = ijob.EQ.2 .OR. ijob.EQ.4
511 wantd2 = ijob.EQ.3 .OR. ijob.EQ.5
512 wantd = wantd1 .OR. wantd2
518 IF( .NOT.lquery .OR. ijob.NE.0 )
THEN 520 alpha( k ) = a( k, k )
521 beta( k ) = b( k, k )
532 IF( ijob.EQ.1 .OR. ijob.EQ.2 .OR. ijob.EQ.4 )
THEN 533 lwmin = max( 1, 2*m*(n-m) )
534 liwmin = max( 1, n+2 )
535 ELSE IF( ijob.EQ.3 .OR. ijob.EQ.5 )
THEN 536 lwmin = max( 1, 4*m*(n-m) )
537 liwmin = max( 1, 2*m*(n-m), n+2 )
546 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 548 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN 553 CALL xerbla(
'CTGSEN', -info )
555 ELSE IF( lquery )
THEN 561 IF( m.EQ.n .OR. m.EQ.0 )
THEN 570 CALL classq( n, a( 1, i ), 1, dscale, dsum )
571 CALL classq( n, b( 1, i ), 1, dscale, dsum )
573 dif( 1 ) = dscale*sqrt( dsum )
581 safmin = slamch(
'S' )
595 $
CALL ctgexc( wantq, wantz, n, a, lda, b, ldb, q, ldq, z,
624 CALL clacpy(
'Full', n1, n2, a( 1, i ), lda, work, n1 )
625 CALL clacpy(
'Full', n1, n2, b( 1, i ), ldb, work( n1*n2+1 ),
628 CALL ctgsyl(
'N', ijb, n1, n2, a, lda, a( i, i ), lda, work,
629 $ n1, b, ldb, b( i, i ), ldb, work( n1*n2+1 ), n1,
630 $ dscale, dif( 1 ), work( n1*n2*2+1 ),
631 $ lwork-2*n1*n2, iwork, ierr )
638 CALL classq( n1*n2, work, 1, rdscal, dsum )
639 pl = rdscal*sqrt( dsum )
640 IF( pl.EQ.zero )
THEN 643 pl = dscale / ( sqrt( dscale*dscale / pl+pl )*sqrt( pl ) )
647 CALL classq( n1*n2, work( n1*n2+1 ), 1, rdscal, dsum )
648 pr = rdscal*sqrt( dsum )
649 IF( pr.EQ.zero )
THEN 652 pr = dscale / ( sqrt( dscale*dscale / pr+pr )*sqrt( pr ) )
667 CALL ctgsyl(
'N', ijb, n1, n2, a, lda, a( i, i ), lda, work,
668 $ n1, b, ldb, b( i, i ), ldb, work( n1*n2+1 ),
669 $ n1, dscale, dif( 1 ), work( n1*n2*2+1 ),
670 $ lwork-2*n1*n2, iwork, ierr )
674 CALL ctgsyl(
'N', ijb, n2, n1, a( i, i ), lda, a, lda, work,
675 $ n2, b( i, i ), ldb, b, ldb, work( n1*n2+1 ),
676 $ n2, dscale, dif( 2 ), work( n1*n2*2+1 ),
677 $ lwork-2*n1*n2, iwork, ierr )
695 CALL clacn2( mn2, work( mn2+1 ), work, dif( 1 ), kase,
702 CALL ctgsyl(
'N', ijb, n1, n2, a, lda, a( i, i ), lda,
703 $ work, n1, b, ldb, b( i, i ), ldb,
704 $ work( n1*n2+1 ), n1, dscale, dif( 1 ),
705 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
711 CALL ctgsyl(
'C', ijb, n1, n2, a, lda, a( i, i ), lda,
712 $ work, n1, b, ldb, b( i, i ), ldb,
713 $ work( n1*n2+1 ), n1, dscale, dif( 1 ),
714 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
719 dif( 1 ) = dscale / dif( 1 )
724 CALL clacn2( mn2, work( mn2+1 ), work, dif( 2 ), kase,
731 CALL ctgsyl(
'N', ijb, n2, n1, a( i, i ), lda, a, lda,
732 $ work, n2, b( i, i ), ldb, b, ldb,
733 $ work( n1*n2+1 ), n2, dscale, dif( 2 ),
734 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
740 CALL ctgsyl(
'C', ijb, n2, n1, a( i, i ), lda, a, lda,
741 $ work, n2, b, ldb, b( i, i ), ldb,
742 $ work( n1*n2+1 ), n2, dscale, dif( 2 ),
743 $ work( n1*n2*2+1 ), lwork-2*n1*n2, iwork,
748 dif( 2 ) = dscale / dif( 2 )
757 dscale = abs( b( k, k ) )
758 IF( dscale.GT.safmin )
THEN 759 temp1 = conjg( b( k, k ) / dscale )
760 temp2 = b( k, k ) / dscale
762 CALL cscal( n-k, temp1, b( k, k+1 ), ldb )
763 CALL cscal( n-k+1, temp1, a( k, k ), lda )
765 $
CALL cscal( n, temp2, q( 1, k ), 1 )
767 b( k, k ) = cmplx( zero, zero )
770 alpha( k ) = a( k, k )
771 beta( k ) = b( k, k )
subroutine classq(N, X, INCX, SCALE, SUMSQ)
CLASSQ updates a sum of squares represented in scaled form.
subroutine cscal(N, CA, CX, INCX)
CSCAL
subroutine ctgsyl(TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC, D, LDD, E, LDE, F, LDF, SCALE, DIF, WORK, LWORK, IWORK, INFO)
CTGSYL
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ctgsen(IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B, LDB, ALPHA, BETA, Q, LDQ, Z, LDZ, M, PL, PR, DIF, WORK, LWORK, IWORK, LIWORK, INFO)
CTGSEN
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine clacn2(N, V, X, EST, KASE, ISAVE)
CLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matrix-vec...
subroutine ctgexc(WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, LDZ, IFST, ILST, INFO)
CTGEXC