224 SUBROUTINE sggev( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR, ALPHAI,
225 $ BETA, VL, LDVL, VR, LDVR, WORK, LWORK, INFO )
232 CHARACTER JOBVL, JOBVR
233 INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK,
236 REAL A( , * ), ALPHAI( * ), ALPHAR( * ),
237 $ b( ldb, * ), beta( * ), vl( ldvl, * ),
238 $ vr( ldvr, * ), work( * )
245 parameter( zero = 0.0e+0, one = 1.0e+0 )
248 LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
250 INTEGER ICOLS, IERR, IHI, IJOBVL, , ILEFT, ILO,
251 $ in, iright, irows, itau, iwrk,
jc, jr, maxwrk,
253 REAL ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, ,
268 EXTERNAL lsame, ilaenv, slamch, slange
271 INTRINSIC abs,
max, sqrt
277 IF( lsame( jobvl,
'N' ) )
THEN
280 ELSE IF( lsame( jobvl
'V'THEN
288 IF( lsame( jobvr,
'N' ) )
THEN
291 ELSE IF( lsame( jobvr,
'V' ) )
THEN
303 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( ldvl.LT.1 .OR. ( ilvl .AND. ldvl.LT.n ) )
THEN
316 ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) )
THEN
329 minwrk =
max( 1, 8*n )
330 maxwrk =
max( 1, n*( 7 +
331 $ ilaenv( 1,
'SGEQRF',
' ', n, 1, n, 0 ) ) )
332 maxwrk =
max( maxwrk, n*( 7 +
333 $ ilaenv( 1,
'SORMQR',
' ', n, 1, n, 0 ) ) )
335 maxwrk =
max( maxwrk, n*( 7 +
336 $ ilaenv( 1,
'SORGQR',
' ', n, 1, n, -1 ) ) )
340 IF( lwork.LT.minwrk .AND. .NOT.lquery )
345 CALL xerbla(
'SGGEV ', -info )
347 ELSE IF( lquery )
THEN
359 smlnum = slamch(
'S' )
360 bignum = one / smlnum
361 CALL slabad( smlnum, bignum )
362 smlnum = sqrt( smlnum ) / eps
363 bignum = one / smlnum
367 anrm = slange(
'M', n, n, a, lda, work )
369 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
372 ELSE IF( anrm.GT.bignum )
THEN
377 $
CALL slascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
381 bnrm = slange(
'M', n, n, b, ldb, work )
383 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
386 ELSE IF( bnrm.GT.bignum )
THEN
391 $
CALL slascl(
'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
399 CALL sggbal(
'P', n, a, lda, b, ldb, ilo, ihi, work( ileft ),
400 $ work( iright ), work( iwrk ), ierr )
405 irows = ihi + 1 - ilo
413 CALL sgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
414 $ work( iwrk ), lwork+1-iwrk, ierr )
419 CALL sormqr(
'L',
'T', irows, icols, irows, b( ilo, ilo ), ldb,
420 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
421 $ lwork+1-iwrk, ierr )
427 CALL slaset(
'Full', n, n, zero, one, vl, ldvl )
428 IF( irows.GT.1 )
THEN
429 CALL slacpy(
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
430 $ vl( ilo+1, ilo ), ldvl )
432 CALL sorgqr( irows, irows, irows, vl( ilo, ilo ), ldvl,
433 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
439 $
CALL slaset(
'Full', n, n, zero, one, vr, ldvr )
448 CALL sgghrd( jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb, vl,
449 $ ldvl, vr, ldvr, ierr )
451 CALL sgghrd(
'N',
'N', irows, 1, irows, a( ilo, ilo ), lda,
452 $ b( ilo, ilo ), ldb, vl, ldvl, vr, ldvr, ierr )
465 CALL shgeqz( chtemp, jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb,
466 $ alphar, alphai, beta, vl, ldvl, vr, ldvr,
467 $ work( iwrk ), lwork+1-iwrk, ierr )
469 IF( ierr.GT.0 .AND. ierr.LE.n )
THEN
471 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n )
THEN
492 CALL STGEVC( CHTEMP, 'b
', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
493 $ VR, LDVR, N, IN, WORK( IWRK ), IERR )
503 CALL SGGBAK( 'p
', 'l
', N, ILO, IHI, WORK( ILEFT ),
504 $ WORK( IRIGHT ), N, VL, LDVL, IERR )
506.LT.
IF( ALPHAI( JC )ZERO )
509.EQ.
IF( ALPHAI( JC )ZERO ) THEN
511 TEMP = MAX( TEMP, ABS( VL( JR, JC ) ) )
515 TEMP = MAX( TEMP, ABS( VL( JR, JC ) )+
516 $ ABS( VL( JR, JC+1 ) ) )
522.EQ.
IF( ALPHAI( JC )ZERO ) THEN
524 VL( JR, JC ) = VL( JR, JC )*TEMP
528 VL( JR, JC ) = VL( JR, JC )*TEMP
529 VL( JR, JC+1 ) = VL( JR, JC+1 )*TEMP
535 CALL SGGBAK( 'p
', 'r
', N, ILO, IHI, WORK( ILEFT ),
536 $ WORK( IRIGHT ), N, VR, LDVR, IERR )
538.LT.
IF( ALPHAI( JC )ZERO )
541.EQ.
IF( ALPHAI( JC )ZERO ) THEN
543 TEMP = MAX( TEMP, ABS( VR( JR, JC ) ) )
547 TEMP = MAX( TEMP, ABS( VR( JR, JC ) )+
548 $ ABS( VR( JR, JC+1 ) ) )
554.EQ.
IF( ALPHAI( JC )ZERO ) THEN
556 VR( JR, JC ) = VR( JR, JC )*TEMP
560 VR( JR, JC ) = VR( JR, JC )*TEMP
561 VR( JR, JC+1 ) = VR( JR, JC+1 )*TEMP
576 CALL SLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
577 CALL SLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N, IERR )
581 CALL SLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )