266 SUBROUTINE zgges3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
267 $ LDB, SDIM, ALPHA, BETA, VSL, LDVSL, VSR, LDVSR,
268 $ WORK, LWORK, RWORK, BWORK, INFO )
275 CHARACTER JOBVSL, JOBVSR, SORT
276 INTEGER INFO, LDA, LDB, LDVSL, LDVSR, LWORK, N, SDIM
280 DOUBLE PRECISION RWORK( * )
281 COMPLEX*16 A( lda, * ), ALPHA( * ), B( ldb, * ),
282 $ beta( * ), vsl( ldvsl, * ), vsr( ldvsr, * ),
293 DOUBLE PRECISION ZERO, ONE
294 parameter( zero = 0.0d0, one = 1.0d0 )
295 COMPLEX*16 CZERO, CONE
296 parameter( czero = ( 0.0d0, 0.0d0 ),
297 $ cone = ( 1.0d0, 0.0d0 ) )
300 LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
302 INTEGER I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT,
303 $ ilo, iright, irows, irwrk, itau, iwrk, lwkopt
304 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL,
309 DOUBLE PRECISION DIF( 2 )
318 DOUBLE PRECISION DLAMCH, ZLANGE
319 EXTERNAL lsame, dlamch, zlange
328 IF( lsame( jobvsl,
'N' ) )
THEN 331 ELSE IF( lsame( jobvsl,
'V' ) )
THEN 339 IF( lsame( jobvsr,
'N' ) )
THEN 342 ELSE IF( lsame( jobvsr,
'V' ) )
THEN 350 wantst = lsame( sort,
'S' )
355 lquery = ( lwork.EQ.-1 )
356 IF( ijobvl.LE.0 )
THEN 358 ELSE IF( ijobvr.LE.0 )
THEN 360 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort,
'N' ) ) )
THEN 362 ELSE IF( n.LT.0 )
THEN 364 ELSE IF( lda.LT.max( 1, n ) )
THEN 366 ELSE IF( ldb.LT.max( 1, n ) )
THEN 368 ELSE IF( ldvsl.LT.1 .OR. ( ilvsl .AND. ldvsl.LT.n ) )
THEN 370 ELSE IF( ldvsr.LT.1 .OR. ( ilvsr .AND. ldvsr.LT.n ) )
THEN 372 ELSE IF( lwork.LT.max( 1, 2*n ) .AND. .NOT.lquery )
THEN 379 CALL zgeqrf( n, n, b, ldb, work, work, -1, ierr )
380 lwkopt = max( 1, n + int( work( 1 ) ) )
381 CALL zunmqr(
'L',
'C', n, n, n, b, ldb, work, a, lda, work,
383 lwkopt = max( lwkopt, n + int( work( 1 ) ) )
385 CALL zungqr( n, n, n, vsl, ldvsl, work, work, -1, ierr )
386 lwkopt = max( lwkopt, n + int( work( 1 ) ) )
388 CALL zgghd3( jobvsl, jobvsr, n, 1, n, a, lda, b, ldb, vsl,
389 $ ldvsl, vsr, ldvsr, work, -1, ierr )
390 lwkopt = max( lwkopt, n + int( work( 1 ) ) )
391 CALL zlaqz0(
'S', jobvsl, jobvsr, n, 1, n, a, lda, b, ldb,
392 $ alpha, beta, vsl, ldvsl, vsr, ldvsr, work, -1,
394 lwkopt = max( lwkopt, int( work( 1 ) ) )
396 CALL ztgsen( 0, ilvsl, ilvsr, bwork, n, a, lda, b, ldb,
397 $ alpha, beta, vsl, ldvsl, vsr, ldvsr, sdim,
398 $ pvsl, pvsr, dif, work, -1, idum, 1, ierr )
399 lwkopt = max( lwkopt, int( work( 1 ) ) )
401 work( 1 ) = dcmplx( lwkopt )
405 CALL xerbla(
'ZGGES3 ', -info )
407 ELSE IF( lquery )
THEN 421 smlnum = dlamch(
'S' )
422 bignum = one / smlnum
423 CALL dlabad( smlnum, bignum )
424 smlnum = sqrt( smlnum ) / eps
425 bignum = one / smlnum
429 anrm = zlange(
'M', n, n, a, lda, rwork )
431 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN 434 ELSE IF( anrm.GT.bignum )
THEN 440 $
CALL zlascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
444 bnrm = zlange(
'M', n, n, b, ldb, rwork )
446 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN 449 ELSE IF( bnrm.GT.bignum )
THEN 455 $
CALL zlascl(
'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
462 CALL zggbal(
'P', n, a, lda, b, ldb, ilo, ihi, rwork( ileft ),
463 $ rwork( iright ), rwork( irwrk ), ierr )
467 irows = ihi + 1 - ilo
471 CALL zgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
472 $ work( iwrk ), lwork+1-iwrk, ierr )
476 CALL zunmqr(
'L',
'C', irows, icols, irows, b( ilo, ilo ), ldb,
477 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
478 $ lwork+1-iwrk, ierr )
483 CALL zlaset(
'Full', n, n, czero, cone, vsl, ldvsl )
484 IF( irows.GT.1 )
THEN 485 CALL zlacpy(
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
486 $ vsl( ilo+1, ilo ), ldvsl )
488 CALL zungqr( irows, irows, irows, vsl( ilo, ilo ), ldvsl,
489 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
495 $
CALL zlaset(
'Full', n, n, czero, cone, vsr, ldvsr )
499 CALL zgghd3( jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb, vsl,
500 $ ldvsl, vsr, ldvsr, work( iwrk ), lwork+1-iwrk, ierr )
507 CALL zlaqz0(
'S', jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb,
508 $ alpha, beta, vsl, ldvsl, vsr, ldvsr, work( iwrk ),
509 $ lwork+1-iwrk, rwork( irwrk ), 0, ierr )
511 IF( ierr.GT.0 .AND. ierr.LE.n )
THEN 513 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n )
THEN 528 $
CALL zlascl(
'G', 0, 0, anrm, anrmto, n, 1, alpha, n, ierr )
530 $
CALL zlascl(
'G', 0, 0, bnrm, bnrmto, n, 1, beta, n, ierr )
535 bwork( i ) = selctg( alpha( i ), beta( i ) )
538 CALL ztgsen( 0, ilvsl, ilvsr, bwork, n, a, lda, b, ldb, alpha,
539 $ beta, vsl, ldvsl, vsr, ldvsr, sdim, pvsl, pvsr,
540 $ dif, work( iwrk ), lwork-iwrk+1, idum, 1, ierr )
549 $
CALL zggbak(
'P',
'L', n, ilo, ihi, rwork( ileft ),
550 $ rwork( iright ), n, vsl, ldvsl, ierr )
552 $
CALL zggbak(
'P',
'R', n, ilo, ihi, rwork( ileft ),
553 $ rwork( iright ), n, vsr, ldvsr, ierr )
558 CALL zlascl(
'U', 0, 0, anrmto, anrm, n, n, a, lda, ierr )
559 CALL zlascl(
'G', 0, 0, anrmto, anrm, n, 1, alpha, n, ierr )
563 CALL zlascl(
'U', 0, 0, bnrmto, bnrm, n, n, b, ldb, ierr )
564 CALL zlascl(
'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )
574 cursl = selctg( alpha( i ), beta( i ) )
577 IF( cursl .AND. .NOT.lastsl )
586 work( 1 ) = dcmplx( lwkopt )
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 xerbla(SRNAME, INFO)
XERBLA
subroutine zgghd3(COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q, LDQ, Z, LDZ, WORK, LWORK, INFO)
ZGGHD3
subroutine zgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
ZGEQRF
subroutine zggbak(JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V, LDV, INFO)
ZGGBAK
subroutine zlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine zunmqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
ZUNMQR
recursive subroutine zlaqz0(WANTS, WANTQ, WANTZ, N, ILO, IHI, A, LDA, B, LDB, ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, RWORK, REC, INFO)
ZLAQZ0
subroutine zgges3(JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB, SDIM, ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK, LWORK, RWORK, BWORK, INFO)
ZGGES3 computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE...
subroutine zungqr(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGQR
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine zggbal(JOB, N, A, LDA, B, LDB, ILO, IHI, LSCALE, RSCALE, WORK, INFO)
ZGGBAL