222 SUBROUTINE cgegs( 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
236 COMPLEX A( LDA, * ), ALPHA( * ), B( LDB, * ),
237 $ beta( * ), vsl( ldvsl, * ), vsr( ldvsr, * ),
245 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
247 parameter( czero = ( 0.0e0, 0.0e0 ),
248 $ cone = ( 1.0e0, 0.0e0 ) )
251 LOGICAL ILASCL, ILBSCL, ILVSL, ILVSR, LQUERY
252 INTEGER ICOLS, IHI, IINFO, IJOBVL, IJOBVR, ILEFT,
253 $ ilo, iright, irows, irwork, itau, iwork,
254 $ lopt, lwkmin, lwkopt, nb, nb1, nb2, nb3
255 REAL ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, ,
266 EXTERNAL ilaenv, lsame, clange, slamch
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,
'CGEQRF',
' ', n, n, -1, -1 )
324 nb2 = ilaenv( 1,
'CUNMQR',
' ', n, n, n, -1 )
325 nb3 = ilaenv( 1,
'CUNGQR',
' ', n, n, n, -1 )
326 nb =
max( nb1, nb2, nb3 )
332 CALL xerbla(
'CGEGS ', -info )
334 ELSE IF( lquery )
THEN
345 eps = slamch(
'E' )*slamch(
'B' )
346 safmin = slamch(
'S' )
347 smlnum = n*safmin / eps
348 bignum = one / smlnum
352 anrm = clange(
'M', n, n, a, lda, rwork )
357 ELSE IF( anrm.GT.bignum )
THEN
363 CALL clascl(
'G', -1, -1, anrm, anrmto, n, n, a, lda, iinfo )
364 IF( iinfo.NE.0 )
THEN
372 bnrm = clange(
'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 clascl(
'G', -1, -1, bnrm, bnrmto, n, n, b, ldb, iinfo )
384 IF( iinfo.NE.0 )
THEN
396 CALL cggbal(
'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 cgeqrf( 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 cunmqr(
'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 claset( 'full
', N, N, CZERO, CONE, VSL, LDVSL )
430 CALL CLACPY( 'l
', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
431 $ VSL( ILO+1, ILO ), LDVSL )
432 CALL CUNGQR( 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 CLASET( 'full
', N, N, CZERO, CONE, VSR, LDVSR )
448 CALL CGGHRD( JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB, VSL,
449 $ LDVSL, VSR, LDVSR, IINFO )
450.NE.
IF( IINFO0 ) THEN
458 CALL CHGEQZ( '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 CGGBAK( 'p
', 'l
', N, ILO, IHI, RWORK( ILEFT ),
478 $ RWORK( IRIGHT ), N, VSL, LDVSL, IINFO )
479.NE.
IF( IINFO0 ) THEN
485 CALL CGGBAK( 'p
', 'r
', N, ILO, IHI, RWORK( ILEFT ),
486 $ RWORK( IRIGHT ), N, VSR, LDVSR, IINFO )
487.NE.
IF( IINFO0 ) THEN
496 CALL CLASCL( 'u
', -1, -1, ANRMTO, ANRM, N, N, A, LDA, IINFO )
497.NE.
IF( IINFO0 ) THEN
501 CALL CLASCL( 'g
', -1, -1, ANRMTO, ANRM, N, 1, ALPHA, N, IINFO )
502.NE.
IF( IINFO0 ) THEN
509 CALL CLASCL( 'u
', -1, -1, BNRMTO, BNRM, N, N, B, LDB, IINFO )
510.NE.
IF( IINFO0 ) THEN
514 CALL CLASCL( 'g
', -1, -1, BNRMTO, BNRM, N, 1, BETA, N, IINFO )
515.NE.
IF( IINFO0 ) THEN
subroutine chgeqz(job, compq, compz, n, ilo, ihi, h, ldh, t, ldt, alpha, beta, q, ldq, z, ldz, work, lwork, rwork, info)
CHGEQZ
subroutine cgegs(jobvsl, jobvsr, n, a, lda, b, ldb, alpha, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, rwork, info)
CGEEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices