224 SUBROUTINE dgegs( JOBVSL, JOBVSR, N, A, LDA, B, LDB, ALPHAR,
225 $ ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR, WORK,
233 CHARACTER jobvsl, jobvsr
234 INTEGER info, lda, ldb, ldvsl, ldvsr, lwork, n
237 DOUBLE PRECISION a( lda, * ), alphai( * ), 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,
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 345 smlnum = n*safmin / eps
346 bignum = one / smlnum
350 anrm =
dlange(
'M', n, n, a, lda, work )
352 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
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 IF( iinfo.NE.0 )
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 IF( iinfo.NE.0 )
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 IF( iinfo.NE.0 )
THEN 467 IF( iinfo.GT.0 .AND. iinfo.LE.n )
THEN 469 ELSE IF( iinfo.GT.n .AND. iinfo.LE.2*n )
THEN 480 CALL dggbak(
'P',
'L', n, ilo, ihi, work( ileft ),
481 $ work( iright ), n, vsl, ldvsl, iinfo )
482 IF( iinfo.NE.0 )
THEN 488 CALL dggbak(
'P',
'R', n, ilo, ihi, work( ileft ),
489 $ work( iright ), n, vsr, ldvsr, iinfo )
490 IF( iinfo.NE.0 )
THEN 499 CALL dlascl(
'H', -1, -1, anrmto, anrm, n, n, a, lda, iinfo )
500 IF( iinfo.NE.0 )
THEN 504 CALL dlascl(
'G', -1, -1, anrmto, anrm, n, 1, alphar, n,
506 IF( iinfo.NE.0 )
THEN 510 CALL dlascl(
'G', -1, -1, anrmto, anrm, n, 1, alphai, n,
512 IF( iinfo.NE.0 )
THEN 519 CALL dlascl(
'U', -1, -1, bnrmto, bnrm, n, n, b, ldb, iinfo )
520 IF( iinfo.NE.0 )
THEN 524 CALL dlascl(
'G', -1, -1, bnrmto, bnrm, n, 1, beta, n, iinfo )
525 IF( iinfo.NE.0 )
THEN integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV
logical function lsame(CA, CB)
LSAME
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dormqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMQR
subroutine dggbal(JOB, N, A, LDA, B, LDB, ILO, IHI, LSCALE, RSCALE, WORK, INFO)
DGGBAL
subroutine dggbak(JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V, LDV, INFO)
DGGBAK
subroutine dorgqr(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
DORGQR
double precision function dlamch(CMACH)
DLAMCH
subroutine dgghrd(COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q, LDQ, Z, LDZ, INFO)
DGGHRD
double precision function dlange(NORM, M, N, A, LDA, WORK)
DLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine dhgeqz(JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, INFO)
DHGEQZ
subroutine dlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine dgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
DGEQRF