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, eps,
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 347 smlnum = n*safmin / eps
348 bignum = one / smlnum
352 anrm =
clange(
'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 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 IF( iinfo.NE.0 )
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 IF( iinfo.NE.0 )
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 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 cggbak(
'P',
'L', n, ilo, ihi, rwork( ileft ),
478 $ rwork( iright ), n, vsl, ldvsl, iinfo )
479 IF( iinfo.NE.0 )
THEN 485 CALL cggbak(
'P',
'R', n, ilo, ihi, rwork( ileft ),
486 $ rwork( iright ), n, vsr, ldvsr, iinfo )
487 IF( iinfo.NE.0 )
THEN 496 CALL clascl(
'U', -1, -1, anrmto, anrm, n, n, a, lda, iinfo )
497 IF( iinfo.NE.0 )
THEN 501 CALL clascl(
'G', -1, -1, anrmto, anrm, n, 1, alpha, n, iinfo )
502 IF( iinfo.NE.0 )
THEN 509 CALL clascl(
'U', -1, -1, bnrmto, bnrm, n, n, b, ldb, iinfo )
510 IF( iinfo.NE.0 )
THEN 514 CALL clascl(
'G', -1, -1, bnrmto, bnrm, n, 1, beta, n, iinfo )
515 IF( iinfo.NE.0 )
THEN subroutine cggbal(JOB, N, A, LDA, B, LDB, ILO, IHI, LSCALE, RSCALE, WORK, INFO)
CGGBAL
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
logical function lsame(CA, CB)
LSAME
subroutine chgeqz(JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, RWORK, INFO)
CHGEQZ
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine cgghrd(COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q, LDQ, Z, LDZ, INFO)
CGGHRD
subroutine clascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
CLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine cggbak(JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V, LDV, INFO)
CGGBAK
subroutine cungqr(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
CUNGQR
subroutine cunmqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
CUNMQR
real function slamch(CMACH)
SLAMCH
subroutine cgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
CGEQRF
real function clange(NORM, M, N, A, LDA, WORK)
CLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...