281 SUBROUTINE sgges( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB,
282 $ SDIM, ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR,
283 $ LDVSR, WORK, LWORK, BWORK, INFO )
290 CHARACTER JOBVSL, JOBVSR, SORT
291 INTEGER INFO, LDA, LDB, LDVSL, LDVSR, LWORK, N, SDIM
295 REAL A( lda, * ), ALPHAI( * ), ALPHAR( * ),
296 $ b( ldb, * ), beta( * ), vsl( ldvsl, * ),
297 $ vsr( ldvsr, * ), work( * )
308 parameter( zero = 0.0e+0, one = 1.0e+0 )
311 LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
312 $ lquery, lst2sl, wantst
313 INTEGER I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT,
314 $ ilo, ip, iright, irows, itau, iwrk, maxwrk,
316 REAL ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL,
317 $ pvsr, safmax, safmin, smlnum
332 EXTERNAL lsame, ilaenv, slamch, slange
335 INTRINSIC abs, max, sqrt
341 IF( lsame( jobvsl,
'N' ) )
THEN 344 ELSE IF( lsame( jobvsl,
'V' ) )
THEN 352 IF( lsame( jobvsr,
'N' ) )
THEN 355 ELSE IF( lsame( jobvsr,
'V' ) )
THEN 363 wantst = lsame( sort,
'S' )
368 lquery = ( lwork.EQ.-1 )
369 IF( ijobvl.LE.0 )
THEN 371 ELSE IF( ijobvr.LE.0 )
THEN 373 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort,
'N' ) ) )
THEN 375 ELSE IF( n.LT.0 )
THEN 377 ELSE IF( lda.LT.max( 1, n ) )
THEN 379 ELSE IF( ldb.LT.max( 1, n ) )
THEN 381 ELSE IF( ldvsl.LT.1 .OR. ( ilvsl .AND. ldvsl.LT.n ) )
THEN 383 ELSE IF( ldvsr.LT.1 .OR. ( ilvsr .AND. ldvsr.LT.n ) )
THEN 396 minwrk = max( 8*n, 6*n + 16 )
397 maxwrk = minwrk - n +
398 $ n*ilaenv( 1,
'SGEQRF',
' ', n, 1, n, 0 )
399 maxwrk = max( maxwrk, minwrk - n +
400 $ n*ilaenv( 1,
'SORMQR',
' ', n, 1, n, -1 ) )
402 maxwrk = max( maxwrk, minwrk - n +
403 $ n*ilaenv( 1,
'SORGQR',
' ', n, 1, n, -1 ) )
411 IF( lwork.LT.minwrk .AND. .NOT.lquery )
416 CALL xerbla(
'SGGES ', -info )
418 ELSE IF( lquery )
THEN 432 safmin = slamch(
'S' )
433 safmax = one / safmin
434 CALL slabad( safmin, safmax )
435 smlnum = sqrt( safmin ) / eps
436 bignum = one / smlnum
440 anrm = slange(
'M', n, n, a, lda, work )
442 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN 445 ELSE IF( anrm.GT.bignum )
THEN 450 $
CALL slascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
454 bnrm = slange(
'M', n, n, b, ldb, work )
456 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN 459 ELSE IF( bnrm.GT.bignum )
THEN 464 $
CALL slascl(
'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
472 CALL sggbal(
'P', n, a, lda, b, ldb, ilo, ihi, work( ileft ),
473 $ work( iright ), work( iwrk ), ierr )
478 irows = ihi + 1 - ilo
482 CALL sgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
483 $ work( iwrk ), lwork+1-iwrk, ierr )
488 CALL sormqr(
'L',
'T', irows, icols, irows, b( ilo, ilo ), ldb,
489 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
490 $ lwork+1-iwrk, ierr )
496 CALL slaset(
'Full', n, n, zero, one, vsl, ldvsl )
497 IF( irows.GT.1 )
THEN 498 CALL slacpy(
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
499 $ vsl( ilo+1, ilo ), ldvsl )
501 CALL sorgqr( irows, irows, irows, vsl( ilo, ilo ), ldvsl,
502 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
508 $
CALL slaset(
'Full', n, n, zero, one, vsr, ldvsr )
513 CALL sgghrd( jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb, vsl,
514 $ ldvsl, vsr, ldvsr, ierr )
520 CALL shgeqz(
'S', jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb,
521 $ alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr,
522 $ work( iwrk ), lwork+1-iwrk, ierr )
524 IF( ierr.GT.0 .AND. ierr.LE.n )
THEN 526 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n )
THEN 543 CALL slascl(
'G', 0, 0, anrmto, anrm, n, 1, alphar, n,
545 CALL slascl(
'G', 0, 0, anrmto, anrm, n, 1, alphai, n,
549 $
CALL slascl(
'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )
554 bwork( i ) = selctg( alphar( i ), alphai( i ), beta( i ) )
557 CALL stgsen( 0, ilvsl, ilvsr, bwork, n, a, lda, b, ldb, alphar,
558 $ alphai, beta, vsl, ldvsl, vsr, ldvsr, sdim, pvsl,
559 $ pvsr, dif, work( iwrk ), lwork-iwrk+1, idum, 1,
570 $
CALL sggbak(
'P',
'L', n, ilo, ihi, work( ileft ),
571 $ work( iright ), n, vsl, ldvsl, ierr )
574 $
CALL sggbak(
'P',
'R', n, ilo, ihi, work( ileft ),
575 $ work( iright ), n, vsr, ldvsr, ierr )
583 IF( alphai( i ).NE.zero )
THEN 584 IF( ( alphar( i )/safmax ).GT.( anrmto/anrm ) .OR.
585 $ ( safmin/alphar( i ) ).GT.( anrm/anrmto ) )
THEN 586 work( 1 ) = abs( a( i, i )/alphar( i ) )
587 beta( i ) = beta( i )*work( 1 )
588 alphar( i ) = alphar( i )*work( 1 )
589 alphai( i ) = alphai( i )*work( 1 )
590 ELSE IF( ( alphai( i )/safmax ).GT.( anrmto/anrm ) .OR.
591 $ ( safmin/alphai( i ) ).GT.( anrm/anrmto ) )
THEN 592 work( 1 ) = abs( a( i, i+1 )/alphai( i ) )
593 beta( i ) = beta( i )*work( 1 )
594 alphar( i ) = alphar( i )*work( 1 )
595 alphai( i ) = alphai( i )*work( 1 )
603 IF( alphai( i ).NE.zero )
THEN 604 IF( ( beta( i )/safmax ).GT.( bnrmto/bnrm ) .OR.
605 $ ( safmin/beta( i ) ).GT.( bnrm/bnrmto ) )
THEN 606 work( 1 ) = abs(b( i, i )/beta( i ))
607 beta( i ) = beta( i )*work( 1 )
608 alphar( i ) = alphar( i )*work( 1 )
609 alphai( i ) = alphai( i )*work( 1 )
618 CALL slascl(
'H', 0, 0, anrmto, anrm, n, n, a, lda, ierr )
619 CALL slascl(
'G', 0, 0, anrmto, anrm, n, 1, alphar, n, ierr )
620 CALL slascl(
'G', 0, 0, anrmto, anrm, n, 1, alphai, n, ierr )
624 CALL slascl(
'U', 0, 0, bnrmto, bnrm, n, n, b, ldb, ierr )
625 CALL slascl(
'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )
637 cursl = selctg( alphar( i ), alphai( i ), beta( i ) )
638 IF( alphai( i ).EQ.zero )
THEN 642 IF( cursl .AND. .NOT.lastsl )
649 cursl = cursl .OR. lastsl
654 IF( cursl .AND. .NOT.lst2sl )
subroutine shgeqz(JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, INFO)
SHGEQZ
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sorgqr(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
SORGQR
subroutine sggbak(JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V, LDV, INFO)
SGGBAK
subroutine stgsen(IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B, LDB, ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, M, PL, PR, DIF, WORK, LWORK, IWORK, LIWORK, INFO)
STGSEN
subroutine slascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine sormqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMQR
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine sgges(JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB, SDIM, ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR, WORK, LWORK, BWORK, INFO)
SGGES computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...
subroutine sggbal(JOB, N, A, LDA, B, LDB, ILO, IHI, LSCALE, RSCALE, WORK, INFO)
SGGBAL
subroutine sgghrd(COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q, LDQ, Z, LDZ, INFO)
SGGHRD
subroutine sgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
SGEQRF
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.