430 SUBROUTINE ztgsen( 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, INFO, LDA, LDB, LDQ, LDZ, LIWORK, LWORK,
442 DOUBLE PRECISION PL, PR
447 DOUBLE PRECISION DIF( * )
448 COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDB, * ),
449 $ beta( * ), q( ldq, * ), work( * ), z( ldz, * )
456 PARAMETER ( IDIFJB = 3 )
457 DOUBLE PRECISION ZERO, ONE
458 parameter( zero = 0.0d+0, one = 1.0d+0 )
461 LOGICAL LQUERY, SWAP, WANTD, WANTD1, WANTD2, WANTP
462 INTEGER I, IERR, IJB, K, KASE, KS, LIWMIN, LWMIN, MN2,
464 DOUBLE PRECISION DSCALE, DSUM, RDSCAL, SAFMIN
465 COMPLEX*16 TEMP1, TEMP2
475 INTRINSIC abs, dcmplx, dconjg,
max, sqrt
478 DOUBLE PRECISION DLAMCH
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
509.EQ..OR..GE.
WANTP = IJOB1 IJOB4
510.EQ..OR..EQ.
WANTD1 = IJOB2 IJOB4
511.EQ..OR..EQ.
WANTD2 = IJOB3 IJOB5
512.OR.
WANTD = WANTD1 WANTD2
518.NOT..OR..NE.
IF( LQUERY IJOB0 ) THEN
520 ALPHA( K ) = A( K, K )
521 BETA( K ) = B( K, K )
532.EQ..OR..EQ..OR..EQ.
IF( IJOB1 IJOB2 IJOB4 ) THEN
533 LWMIN = MAX( 1, 2*M*( N-M ) )
534 LIWMIN = MAX( 1, N+2 )
535.EQ..OR..EQ.
ELSE IF( IJOB3 IJOB5 ) THEN
536 LWMIN = MAX( 1, 4*M*( N-M ) )
537 LIWMIN = MAX( 1, 2*M*( N-M ), N+2 )
546.LT..AND..NOT.
IF( LWORKLWMIN LQUERY ) THEN
548.LT..AND..NOT.
ELSE IF( LIWORKLIWMIN LQUERY ) THEN
553 CALL XERBLA( 'ztgsen', -INFO )
555 ELSE IF( LQUERY ) THEN
561.EQ..OR..EQ.
IF( MN M0 ) THEN
570 CALL ZLASSQ( N, A( 1, I ), 1, DSCALE, DSUM )
571 CALL ZLASSQ( N, B( 1, I ), 1, DSCALE, DSUM )
573 DIF( 1 ) = DSCALE*SQRT( DSUM )
581 SAFMIN = DLAMCH( 's
' )
595 $ CALL ZTGEXC( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z,
624 CALL ZLACPY( 'full
', N1, N2, A( 1, I ), LDA, WORK, N1 )
625 CALL ZLACPY( 'full
', N1, N2, B( 1, I ), LDB, WORK( N1*N2+1 ),
628 CALL ZTGSYL( '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 ZLASSQ( N1*N2, WORK, 1, RDSCAL, DSUM )
639 PL = RDSCAL*SQRT( DSUM )
640.EQ.
IF( PLZERO ) THEN
643 PL = DSCALE / ( SQRT( DSCALE*DSCALE / PL+PL )*SQRT( PL ) )
647 CALL ZLASSQ( N1*N2, WORK( N1*N2+1 ), 1, RDSCAL, DSUM )
648 PR = RDSCAL*SQRT( DSUM )
649.EQ.
IF( PRZERO ) THEN
652 PR = DSCALE / ( SQRT( DSCALE*DSCALE / PR+PR )*SQRT( PR ) )
667 CALL ZTGSYL( '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 ZTGSYL( '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 ZLACN2( MN2, WORK( MN2+1 ), WORK, DIF( 1 ), KASE,
702 CALL ZTGSYL( '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 ZTGSYL( '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 ZLACN2( MN2, WORK( MN2+1 ), WORK, DIF( 2 ), KASE,
731 CALL ZTGSYL( '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 ZTGSYL( '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.GT.
IF( DSCALESAFMIN ) THEN
759 TEMP1 = DCONJG( B( K, K ) / DSCALE )
760 TEMP2 = B( K, K ) / DSCALE
762 CALL ZSCAL( N-K, TEMP1, B( K, K+1 ), LDB )
763 CALL ZSCAL( N-K+1, TEMP1, A( K, K ), LDA )
765 $ CALL ZSCAL( N, TEMP2, Q( 1, K ), 1 )
767 B( K, K ) = DCMPLX( ZERO, ZERO )
770 ALPHA( K ) = A( K, K )
771 BETA( K ) = B( K, K )
subroutine zlassq(n, x, incx, scl, sumsq)
ZLASSQ updates a sum of squares represented in scaled form.
subroutine xerbla(srname, info)
XERBLA
subroutine ztgexc(wantq, wantz, n, a, lda, b, ldb, q, ldq, z, ldz, ifst, ilst, info)
ZTGEXC
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlacn2(n, v, x, est, kase, isave)
ZLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matrix-vec...
subroutine ztgsen(ijob, wantq, wantz, select, n, a, lda, b, ldb, alpha, beta, q, ldq, z, ldz, m, pl, pr, dif, work, lwork, iwork, liwork, info)
ZTGSEN
subroutine ztgsyl(trans, ijob, m, n, a, lda, b, ldb, c, ldc, d, ldd, e, lde, f, ldf, scale, dif, work, lwork, iwork, info)
ZTGSYL
subroutine zscal(n, za, zx, incx)
ZSCAL