222 SUBROUTINE zgegs( JOBVSL, JOBVSR, N, A, LDA, B, LDB, ALPHA, BETA,
223 $ VSL, LDVSL, VSR, LDVSR, WORK, LWORK, RWORK,
231 CHARACTER JOBVSL, JOBVSR
232 INTEGER INFO, LDA, LDB, LDVSL, LDVSR, LWORK, N
235 DOUBLE PRECISION RWORK( * )
236 COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDB, * ),
237 $ beta( * ), vsl( ldvsl, * ), vsr( ldvsr, * ),
244 DOUBLE PRECISION ZERO, ONE
245 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
246 COMPLEX*16 CZERO, CONE
247 parameter( czero = ( 0.0d0, 0.0d0 ),
248 $ cone = ( 1.0d0, 0.0d0 ) )
251 LOGICAL ILASCL, ILBSCL, ILVSL, ILVSR, LQUERY
252 INTEGER ICOLS, IHI, IINFO, IJOBVL, IJOBVR, ILEFT, ILO,
253 $ iright, irows, irwork, itau, iwork, lopt,
254 $ lwkmin, lwkopt, nb, nb1, nb2, nb3
255 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
265 DOUBLE PRECISION DLAMCH, ZLANGE
275 IF(
lsame( jobvsl,
'N' ) )
THEN
278 ELSE IF(
lsame( jobvsl,
'V' ) )
THEN
286 IF(
lsame( jobvsr,
'N' ) )
THEN
289 ELSE IF(
lsame( jobvsr,
'V' ) )
THEN
299 lwkmin =
max( 2*n, 1 )
302 lquery = ( lwork.EQ.-1 )
304 IF( ijobvl.LE.0 )
THEN
306 ELSE IF( ijobvr.LE.0 )
THEN
308 ELSE IF( n.LT.0 )
THEN
310 ELSE IF( lda.LT.
max( 1, n ) )
THEN
312 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
314 ELSE IF( ldvsl.LT.1 .OR. ( ilvsl .AND. ldvsl.LT.n ) )
THEN
316 ELSE IF( ldvsr.LT.1 .OR. ( ilvsr .AND. ldvsr.LT.n ) )
THEN
318 ELSE IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
323 nb1 =
ilaenv( 1,
'ZGEQRF',
' ', n, n, -1, -1 )
324 nb2 =
ilaenv( 1,
'ZUNMQR',
' ', n, n, n, -1 )
325 nb3 =
ilaenv( 1,
'ZUNGQR',
' ', n, n, n, -1 )
326 nb =
max( nb1, nb2, nb3 )
332 CALL xerbla(
'ZGEGS ', -info )
334 ELSE IF( lquery )
THEN
345 eps = dlamch(
'E' )*dlamch(
'B' )
346 safmin = dlamch(
'S' )
347 smlnum = n*safmin / eps
348 bignum = one / smlnum
352 anrm = zlange(
'M', n, n, a, lda, rwork )
354 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
357 ELSE IF( anrm.GT.bignum )
THEN
363 CALL zlascl(
'G', -1, -1, anrm, anrmto, n, n, a, lda, iinfo )
364 IF( iinfo.NE.0 )
THEN
372 bnrm = zlange(
'M', n, n, b, ldb, rwork )
374 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
377 ELSE IF( bnrm.GT.bignum )
THEN
383 CALL zlascl(
'G', -1, -1, bnrm, bnrmto, n, n, b, ldb, iinfo )
384 IF( iinfo.NE.0 )
THEN
396 CALL zggbal(
'P', n, a, lda, b, ldb, ilo, ihi, rwork( ileft ),
397 $ rwork( iright ), rwork( irwork ), iinfo )
398 IF( iinfo.NE.0 )
THEN
405 irows = ihi + 1 - ilo
409 CALL zgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
410 $ work( iwork ), lwork+1-iwork, iinfo )
412 $ lwkopt =
max( lwkopt, int( work( iwork ) )+iwork-1 )
413 IF( iinfo.NE.0 )
THEN
418 CALL zunmqr(
'L',
'C', irows, icols, irows, b( ilo, ilo ), ldb,
419 $ work( itau ), a( ilo, ilo ), lda, work( iwork ),
420 $ lwork+1-iwork, iinfo )
422 $ lwkopt =
max( lwkopt, int( work( iwork ) )+iwork-1 )
423 IF( iinfo.NE.0 )
THEN
429 CALL zlaset(
'Full', n, n, czero, cone, vsl, ldvsl )
430 CALL zlacpy( 'l
', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
431 $ VSL( ILO+1, ILO ), LDVSL )
432 CALL ZUNGQR( IROWS, IROWS, IROWS, VSL( ILO, ILO ), LDVSL,
433 $ WORK( ITAU ), WORK( IWORK ), LWORK+1-IWORK,
436 $ LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
437.NE.
IF( IINFO0 ) THEN
444 $ CALL ZLASET( 'full
', N, N, CZERO, CONE, VSR, LDVSR )
448 CALL ZGGHRD( JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB, VSL,
449 $ LDVSL, VSR, LDVSR, IINFO )
450.NE.
IF( IINFO0 ) THEN
458 CALL ZHGEQZ( 's
', JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB,
459 $ ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK( IWORK ),
460 $ LWORK+1-IWORK, RWORK( IRWORK ), IINFO )
462 $ LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
463.NE.
IF( IINFO0 ) THEN
464.GT..AND..LE.
IF( IINFO0 IINFON ) THEN
466.GT..AND..LE.
ELSE IF( IINFON IINFO2*N ) THEN
477 CALL ZGGBAK( 'p
', 'l
', N, ILO, IHI, RWORK( ILEFT ),
478 $ RWORK( IRIGHT ), N, VSL, LDVSL, IINFO )
479.NE.
IF( IINFO0 ) THEN
485 CALL ZGGBAK( 'p
', 'r
', N, ILO, IHI, RWORK( ILEFT ),
486 $ RWORK( IRIGHT ), N, VSR, LDVSR, IINFO )
487.NE.
IF( IINFO0 ) THEN
496 CALL ZLASCL( 'u
', -1, -1, ANRMTO, ANRM, N, N, A, LDA, IINFO )
497.NE.
IF( IINFO0 ) THEN
501 CALL ZLASCL( 'g
', -1, -1, ANRMTO, ANRM, N, 1, ALPHA, N, IINFO )
502.NE.
IF( IINFO0 ) THEN
509 CALL ZLASCL( 'u
', -1, -1, BNRMTO, BNRM, N, N, B, LDB, IINFO )
510.NE.
IF( IINFO0 ) THEN
514 CALL ZLASCL( 'g
', -1, -1, BNRMTO, BNRM, N, 1, BETA, N, IINFO )
515.NE.
IF( IINFO0 ) THEN
subroutine zhgeqz(job, compq, compz, n, ilo, ihi, h, ldh, t, ldt, alpha, beta, q, ldq, z, ldz, work, lwork, rwork, info)
ZHGEQZ
subroutine zgegs(jobvsl, jobvsr, n, a, lda, b, ldb, alpha, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, rwork, info)
ZGEEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices