224 SUBROUTINE dgegs( JOBVSL, JOBVSR, N, A, LDA, B, LDB, ALPHAR,
225 $ ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR, WORK,
234 INTEGER INFO, LDA, LDB, LWORK, N
237 DOUBLE PRECISION A( LDA, * ), ( * ), ALPHAR( * ),
238 $ B( LDB, * ), BETA( * ), VSL( LDVSL, * ),
239 $ vsr( ldvsr, * ), work( * )
245 DOUBLE PRECISION ZERO, ONE
246 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
249 LOGICAL ILASCL, ILBSCL, ILVSL, ILVSR, LQUERY
250 INTEGER ICOLS, IHI, IINFO, IJOBVL, IJOBVR, ILEFT, ILO,
251 $ iright, irows, itau, iwork, lopt, lwkmin,
252 $ lwkopt, nb, nb1, nb2, nb3
253 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
263 DOUBLE PRECISION DLAMCH, DLANGE
264 EXTERNAL lsame, ilaenv, dlamch, dlange
273 IF( lsame( jobvsl,
'N' ) )
THEN
276 ELSE IF( lsame( jobvsl,
'V' ) )
THEN
284 IF( lsame( jobvsr,
'N' ) )
THEN
287 ELSE IF( lsame( jobvsr,
'V' ) )
THEN
297 lwkmin =
max( 4*n, 1 )
300 lquery = ( lwork.EQ.-1 )
302 IF( ijobvl.LE.0 )
THEN
304 ELSE IF( ijobvr.LE.0 )
THEN
306 ELSE IF( n.LT.0 )
THEN
308 ELSE IF( lda.LT.
max( 1, n ) )
THEN
310 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
312 ELSE IF( ldvsl.LT.1 .OR. ( ilvsl .AND. ldvsl.LT.n ) )
THEN
314 ELSE IF( ldvsr.LT.1 .OR. ( ilvsr .AND. ldvsr.LT.n ) )
THEN
316 ELSE IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
321 nb1 = ilaenv( 1,
'DGEQRF',
' ', n, n, -1, -1 )
322 nb2 = ilaenv( 1,
'DORMQR',
' ', n, n, n, -1 )
323 nb3 = ilaenv( 1,
'DORGQR',
' ', n, n, n, -1 )
324 nb =
max( nb1, nb2, nb3 )
325 lopt = 2*n + n*( nb+1 )
330 CALL xerbla(
'DGEGS ', -info )
332 ELSE IF( lquery )
THEN
343 eps = dlamch(
'E' )*dlamch(
'B' )
344 safmin = dlamch(
'S' )
345 smlnum = n*safmin / eps
346 bignum = one / smlnum
350 anrm = dlange(
'M', n, n, a, lda, work )
352 IF( anrm.GT.zero .AND.
THEN
355 ELSE IF( anrm.GT.bignum )
THEN
361 CALL dlascl(
'G', -1, -1, anrm, anrmto, n, n, a, lda, iinfo )
362 IF( iinfo.NE.0 )
THEN
370 bnrm = dlange(
'M', n, n, b, ldb, work )
372 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
375 ELSE IF( bnrm.GT.bignum )
THEN
381 CALL dlascl(
'G', -1, -1, bnrm, bnrmto, n, n, b, ldb, iinfo )
382 IF( iinfo.NE.0 )
THEN
395 CALL dggbal(
'P', n, a, lda, b, ldb, ilo, ihi, work( ileft ),
396 $ work( iright ), work( iwork ), iinfo )
397 IF( iinfo.NE.0 )
THEN
406 irows = ihi + 1 - ilo
410 CALL dgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
411 $ work( iwork ), lwork+1-iwork, iinfo )
413 $ lwkopt =
max( lwkopt, int( work( iwork ) )+iwork-1 )
414 IF( iinfo.NE.0 )
THEN
419 CALL dormqr(
'L',
'T', irows, icols, irows, b( ilo, ilo ), ldb,
420 $ work( itau ), a( ilo, ilo ), lda, work( iwork ),
421 $ lwork+1-iwork, iinfo )
423 $ lwkopt =
max( lwkopt, int( work( iwork ) )+iwork-1 )
424 IF( iinfo.NE.0 )
THEN
430 CALL dlaset(
'Full', n, n, zero, one, vsl, ldvsl )
431 CALL dlacpy( 'l
', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
432 $ VSL( ILO+1, ILO ), LDVSL )
433 CALL DORGQR( IROWS, IROWS, IROWS, VSL( ILO, ILO ), LDVSL,
434 $ WORK( ITAU ), WORK( IWORK ), LWORK+1-IWORK,
437 $ LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
438.NE.
IF( IINFO0 ) THEN
445 $ CALL DLASET( 'full
', N, N, ZERO, ONE, VSR, LDVSR )
449 CALL DGGHRD( JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB, VSL,
450 $ LDVSL, VSR, LDVSR, IINFO )
451.NE.
IF( IINFO0 ) THEN
461 CALL DHGEQZ( 's
', JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB,
462 $ ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR,
463 $ WORK( IWORK ), LWORK+1-IWORK, IINFO )
465 $ LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
466.NE.
IF( IINFO0 ) THEN
467.GT..AND..LE.
IF( IINFO0 IINFON ) THEN
469.GT..AND..LE.
ELSE IF( IINFON IINFO2*N ) THEN
480 CALL DGGBAK( 'p
', 'l
', N, ILO, IHI, WORK( ILEFT ),
481 $ WORK( IRIGHT ), N, VSL, LDVSL, IINFO )
482.NE.
IF( IINFO0 ) THEN
488 CALL DGGBAK( 'p
', 'r
', N, ILO, IHI, WORK( ILEFT ),
489 $ WORK( IRIGHT ), N, VSR, LDVSR, IINFO )
490.NE.
IF( IINFO0 ) THEN
499 CALL DLASCL( 'h
', -1, -1, ANRMTO, ANRM, N, N, A, LDA, IINFO )
500.NE.
IF( IINFO0 ) THEN
504 CALL DLASCL( 'g
', -1, -1, ANRMTO, ANRM, N, 1, ALPHAR, N,
506.NE.
IF( IINFO0 ) THEN
510 CALL DLASCL( 'g
', -1, -1, ANRMTO, ANRM, N, 1, ALPHAI, N,
512.NE.
IF( IINFO0 ) THEN
519 CALL DLASCL( 'u
', -1, -1, BNRMTO, BNRM, N, N, B, LDB, IINFO )
520.NE.
IF( IINFO0 ) THEN
524 CALL DLASCL( 'g
', -1, -1, BNRMTO, BNRM, N, 1, BETA, N, IINFO )
525.NE.
IF( IINFO0 ) THEN
subroutine dhgeqz(job, compq, compz, n, ilo, ihi, h, ldh, t, ldt, alphar, alphai, beta, q, ldq, z, ldz, work, lwork, info)
DHGEQZ
subroutine dgegs(jobvsl, jobvsr, n, a, lda, b, ldb, alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, info)
DGEEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices