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, * ), ( * ), B( , * ),
237 $ beta( * ), vsl( ldvsl, * ), vsr( ldvsr, * ),
244 DOUBLE PRECISION ZERO, ONE
245 PARAMETER ( = 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, , BIGNUM, BNRM, BNRMTO, EPS,
265 DOUBLE PRECISION DLAMCH, ZLANGE
266 EXTERNAL lsame, ilaenv, 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 )
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.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
357.GT.
ELSE IF( ANRMBIGNUM ) THEN
363 CALL ZLASCL( 'g
', -1, -1, ANRM, ANRMTO, N, N, A, LDA, IINFO )
364.NE.
IF( IINFO0 ) THEN
372 BNRM = ZLANGE( 'm
', N, N, B, LDB, RWORK )
374.GT..AND..LT.
IF( BNRMZERO BNRMSMLNUM ) THEN
377.GT.
ELSE IF( BNRMBIGNUM ) THEN
383 CALL ZLASCL( 'g
', -1, -1, BNRM, BNRMTO, N, N, B, LDB, IINFO )
384.NE.
IF( IINFO0 ) THEN
396 CALL ZGGBAL( 'p
', N, A, LDA, B, LDB, ILO, IHI, RWORK( ILEFT ),
397 $ RWORK( IRIGHT ), RWORK( IRWORK ), IINFO )
398.NE.
IF( IINFO0 ) 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.NE.
IF( IINFO0 ) 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.NE.
IF( IINFO0 ) 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 IF( iinfo.NE.0 )
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 IF( iinfo.NE.0 )
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 IF( iinfo.NE.0 )
THEN
464 IF( iinfo.GT.0 .AND. iinfo.LE.n )
THEN
466 ELSE IF( iinfo.GT.n .AND. iinfo.LE.2*n )
THEN
477 CALL zggbak(
'P',
'L', n, ilo, ihi, rwork( ileft ),
478 $ rwork( iright ), n, vsl, ldvsl, iinfo )
479 IF( iinfo.NE.0 )
THEN
485 CALL zggbak(
'P',
'R', n, ilo, ihi, rwork( ileft ),
486 $ rwork( iright ), n, vsr, ldvsr, iinfo )
487 IF( iinfo.NE.0 )
THEN
496 CALL zlascl(
'U', -1, -1, anrmto, anrm, n, n, a, lda, iinfo )
497 IF( iinfo.NE.0 )
THEN
501 CALL zlascl(
'G', -1, -1, anrmto, anrm, n, 1,
alpha, n, iinfo )
502 IF( iinfo.NE.0 )
THEN
509 CALL zlascl(
'U', -1, -1, bnrmto, bnrm, n, n, b, ldb, iinfo )
510 IF( iinfo.NE.0 )
THEN
514 CALL zlascl(
'G', -1, -1, bnrmto, bnrm, n, 1, beta, n, iinfo )
515 IF( iinfo.NE.0 )
THEN
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