281 SUBROUTINE dgges( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB,
282 $ SDIM, ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR,
283 $ LDVSR, WORK, LWORK, BWORK, INFO )
290 CHARACTER JOBVSL, JOBVSR, SORT
291 INTEGER INFO, LDA, LDB, LDVSL, LDVSR, LWORK, N,
295 DOUBLE PRECISION A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
296 $ b( ldb, * ), beta( * ), vsl( ldvsl, * ),
297 $ vsr( ldvsr, * ), work( * )
307 DOUBLE PRECISION ZERO, ONE
308 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
311 LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
312 $ LQUERY, LST2SL, WANTST
313 INTEGER I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT,
314 $ ILO, IP, IRIGHT, IROWS, ITAU, IWRK, MAXWRK,
316 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL,
317 $ PVSR, SAFMAX, SAFMIN, SMLNUM
321 DOUBLE PRECISION DIF( 2 )
331 DOUBLE PRECISION DLAMCH, DLANGE
332 EXTERNAL lsame, ilaenv, dlamch, dlange
335 INTRINSIC abs,
max, sqrt
341 IF( lsame( jobvsl,
'N' ) )
THEN
344 ELSE IF( lsame( jobvsl,
'V' ) )
THEN
352 IF( lsame( jobvsr,
'N' ) )
THEN
355 ELSE IF( lsame( jobvsr,
'V' ) )
THEN
363 wantst = lsame( sort,
'S' )
368 lquery = ( lwork.EQ.-1 )
369 IF( ijobvl.LE.0 )
THEN
371 ELSE IF( ijobvr.LE.0 )
THEN
373 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort,
'N' ) ) )
THEN
375 ELSE IF( n.LT.0 )
THEN
377 ELSE IF( lda.LT.
max( 1, n ) )
THEN
379 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
381 ELSE IF( ldvsl.LT.1 .OR. ( ilvsl .AND. ldvsl.LT.n ) )
THEN
383 ELSE IF( ldvsr.LT.1 .OR. ( ilvsr .AND. ldvsr.LT.n ) )
THEN
397 maxwrk = minwrk - n +
398 $ n
'DGEQRF',
' ', n, 1, n, 0 )
399 maxwrk =
max( maxwrk, minwrk - n +
400 $ n*ilaenv( 1,
'DORMQR',
' ', n, 1, n, -1 ) )
402 maxwrk =
max( maxwrk, minwrk - n +
403 $ n*ilaenv( 1,
'DORGQR',
' ', n, 1, n, -1 ) )
411 IF( lwork.LT.minwrk .AND. .NOT.lquery )
416 CALL xerbla(
'DGGES ', -info )
418 ELSE IF( lquery )
THEN
432 safmin = dlamch(
'S' )
433 safmax = one / safmin
434 CALL dlabad( safmin, safmax )
435 smlnum = sqrt( safmin ) / eps
436 bignum = one / smlnum
440 anrm = dlange(
'M', n, n, a, lda, work )
442 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
445 ELSE IF( anrm.GT.bignum )
THEN
450 $
CALL dlascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
454 bnrm = dlange(
'M', n, n, b, ldb, work )
456 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
459 ELSE IF( bnrm.GT.bignum )
THEN
464 $
CALL dlascl(
'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
472 CALL dggbal( 'p
', N, A, LDA, B, LDB, ILO, IHI, WORK( ILEFT ),
473 $ WORK( IRIGHT ), WORK( IWRK ), IERR )
478 IROWS = IHI + 1 - ILO
482 CALL DGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
483 $ WORK( IWRK ), LWORK+1-IWRK, IERR )
488 CALL DORMQR( 'l
', 't
', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
489 $ WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
490 $ LWORK+1-IWRK, IERR )
496 CALL DLASET( 'full
', N, N, ZERO, ONE, VSL, LDVSL )
497.GT.
IF( IROWS1 ) THEN
498 CALL DLACPY( 'l
', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
499 $ VSL( ILO+1, ILO ), LDVSL )
501 CALL DORGQR( IROWS, IROWS, IROWS, VSL( ILO, ILO ), LDVSL,
502 $ WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
508 $ CALL DLASET( 'full', n, n, zero, one, vsr, ldvsr )
513 CALL dgghrd( jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb, vsl,
514 $ ldvsl, vsr, ldvsr, ierr )
520 CALL dhgeqz(
'S', jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb,
521 $ alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr,
522 $ work( iwrk ), lwork+1-iwrk, ierr )
524 IF( ierr.GT.0 .AND. ierr.LE.n )
THEN
526 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n )
THEN
543 CALL dlascl( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N,
545 CALL DLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N,
549 $ CALL DLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
554 BWORK( I ) = SELCTG( ALPHAR( I ), ALPHAI( I ), BETA( I ) )
557 CALL DTGSEN( 0, ILVSL, ILVSR, BWORK, N, A, LDA, B, LDB, ALPHAR,
558 $ ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR, SDIM, PVSL,
559 $ PVSR, DIF, WORK( IWRK ), LWORK-IWRK+1, IDUM, 1,
570 $ CALL DGGBAK( 'p
', 'l
', N, ILO, IHI, WORK( ILEFT ),
571 $ WORK( IRIGHT ), N, VSL, LDVSL, IERR )
574 $ CALL DGGBAK( 'p
', 'r
', N, ILO, IHI, WORK( ILEFT ),
575 $ WORK( IRIGHT ), N, VSR, LDVSR, IERR )
583.NE.
IF( ALPHAI( I )ZERO ) THEN
584.GT..OR.
IF( ( ALPHAR( I ) / SAFMAX )( ANRMTO / ANRM )
585.GT.
$ ( SAFMIN / ALPHAR( I ) )( ANRM / ANRMTO ) ) THEN
586 WORK( 1 ) = ABS( A( I, I ) / ALPHAR( I ) )
587 BETA( I ) = BETA( I )*WORK( 1 )
588 ALPHAR( I ) = ALPHAR( I )*WORK( 1 )
589 ALPHAI( I ) = ALPHAI( I )*WORK( 1 )
590.GT.
ELSE IF( ( ALPHAI( I ) / SAFMAX )
591.OR.
$ ( ANRMTO / ANRM )
592.GT.
$ ( SAFMIN / ALPHAI( I ) )( ANRM / ANRMTO ) )
594 WORK( 1 ) = ABS( A( I, I+1 ) / ALPHAI( I ) )
595 BETA( I ) = BETA( I )*WORK( 1 )
596 ALPHAR( I ) = ALPHAR( I )*WORK( 1 )
597 ALPHAI( I ) = ALPHAI( I )*WORK( 1 )
605.NE.
IF( ALPHAI( I )ZERO ) THEN
606.GT..OR.
IF( ( BETA( I ) / SAFMAX )( BNRMTO / BNRM )
607.GT.
$ ( SAFMIN / BETA( I ) )( BNRM / BNRMTO ) ) THEN
608 WORK( 1 ) = ABS( B( I, I ) / BETA( I ) )
609 BETA( I ) = BETA( I )*WORK( 1 )
610 ALPHAR( I ) = ALPHAR( I )*WORK( 1 )
611 ALPHAI( I ) = ALPHAI( I )*WORK( 1 )
620 CALL DLASCL( 'h
', 0, 0, ANRMTO, ANRM, N, N, A, LDA, IERR )
621 CALL DLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
622 CALL DLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N, IERR )
626 CALL DLASCL( 'u
', 0, 0, BNRMTO, BNRM, N, N, B, LDB, IERR )
627 CALL DLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
639 CURSL = SELCTG( ALPHAR( I ), ALPHAI( I ), BETA( I ) )
640.EQ.
IF( ALPHAI( I )ZERO ) THEN
644.AND..NOT.
IF( CURSL LASTSL )
651.OR.
CURSL = CURSL LASTSL
656.AND..NOT.
IF( CURSL LST2SL )
subroutine dhgeqz(job, compq, compz, n, ilo, ihi, h, ldh, t, ldt, alphar, alphai, beta, q, ldq, z, ldz, work, lwork, info)
DHGEQZ
subroutine dgges(jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, bwork, info)
DGGES computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE m...
subroutine dtgsen(ijob, wantq, wantz, select, n, a, lda, b, ldb, alphar, alphai, beta, q, ldq, z, ldz, m, pl, pr, dif, work, lwork, iwork, liwork, info)
DTGSEN