223 SUBROUTINE sggev3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
224 $ ALPHAI, BETA, VL, LDVL, VR, LDVR, WORK, LWORK,
232 CHARACTER JOBVL, JOBVR
233 INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK, N
236 REAL A( LDA, * ), 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, IJOBVR, ILEFT, ILO,
251 $ in, iright, irows, itau, iwrk, jc, jr, lwkopt,
253 REAL ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
267 REAL SLAMCH, SLANGE, SROUNDUP_LWORK
268 EXTERNAL lsame, slamch, slange,
272 INTRINSIC abs, max, sqrt
278 IF( lsame( jobvl,
'N' ) )
THEN
281 ELSE IF( lsame( jobvl,
'V' ) )
THEN
289 IF( lsame( jobvr,
'N' ) )
THEN
292 ELSE IF( lsame( jobvr,
'V' ) )
THEN
304 lquery = ( lwork.EQ.-1 )
305 lwkmin = max( 1, 8*n )
306 IF( ijobvl.LE.0 )
THEN
308 ELSE IF( ijobvr.LE.0 )
THEN
310 ELSE IF( n.LT.0 )
THEN
312 ELSE IF( lda.LT.max( 1, n ) )
THEN
314 ELSE IF( ldb.LT.max( 1, n ) )
THEN
316 ELSE IF( ldvl.LT.1 .OR. ( ilvl .AND. ldvl.LT.n ) )
THEN
318 ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) )
THEN
320 ELSE IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
327 CALL sgeqrf( n, n, b, ldb, work, work, -1, ierr )
328 lwkopt = max( lwkmin, 3*n+int( work( 1 ) ) )
329 CALL sormqr(
'L',
'T', n, n, n, b, ldb, work, a, lda, work,
331 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
332 CALL sgghd3( jobvl, jobvr, n, 1, n, a, lda,
334 $ vr, ldvr, work, -1, ierr )
335 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
337 CALL sorgqr( n, n, n, vl, ldvl, work, work, -1, ierr )
338 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
339 CALL slaqz0(
'S', jobvl, jobvr, n, 1, n, a, lda, b, ldb,
340 $ alphar, alphai, beta, vl, ldvl, vr, ldvr,
341 $ work, -1, 0, ierr )
342 lwkopt = max( lwkopt, 2*n+int( work( 1 ) ) )
344 CALL slaqz0(
'E', jobvl, jobvr, n, 1, n, a, lda, b, ldb,
345 $ alphar, alphai, beta, vl, ldvl, vr, ldvr,
346 $ work, -1, 0, ierr )
347 lwkopt = max( lwkopt, 2*n+int( work( 1 ) ) )
352 work( 1 ) = sroundup_lwork( lwkopt )
357 CALL xerbla(
'SGGEV3 ', -info )
359 ELSE IF( lquery )
THEN
371 smlnum = slamch(
'S' )
372 bignum = one / smlnum
373 smlnum = sqrt( smlnum ) / eps
374 bignum = one / smlnum
378 anrm = slange(
'M', n, n, a, lda, work )
380 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
383 ELSE IF( anrm.GT.bignum )
THEN
388 $
CALL slascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
392 bnrm = slange(
'M', n, n, b, ldb, work )
394 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
397 ELSE IF( bnrm.GT.bignum )
THEN
402 $
CALL slascl(
'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
409 CALL sggbal(
'P', n, a, lda, b, ldb, ilo, ihi, work( ileft ),
410 $ work( iright ), work( iwrk ), ierr )
414 irows = ihi + 1 - ilo
422 CALL sgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
423 $ work( iwrk ), lwork+1-iwrk, ierr )
427 CALL sormqr(
'L',
'T', irows, icols, irows, b( ilo, ilo ), ldb,
428 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
429 $ lwork+1-iwrk, ierr )
434 CALL slaset(
'Full', n, n, zero, one, vl, ldvl )
435 IF( irows.GT.1 )
THEN
436 CALL slacpy(
'L', irows-1, irows-1,
437 $ b( ilo+1, ilo ), ldb,
438 $ vl( ilo+1, ilo ), ldvl )
440 CALL sorgqr( irows, irows, irows, vl( ilo, ilo ), ldvl,
441 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
447 $
CALL slaset(
'Full', n, n, zero, one, vr, ldvr )
455 CALL sgghd3( jobvl, jobvr, n, ilo, ihi,
459 $ work( iwrk ), lwork+1-iwrk, ierr )
461 CALL sgghd3(
'N',
'N', irows, 1, irows,
462 $ a( ilo, ilo ), lda,
463 $ b( ilo, ilo ), ldb, vl,
465 $ work( iwrk ), lwork+1-iwrk, ierr )
477 CALL slaqz0( chtemp, jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb,
478 $ alphar, alphai, beta, vl, ldvl, vr, ldvr,
479 $ work( iwrk ), lwork+1-iwrk, 0, ierr )
481 IF( ierr.GT.0 .AND. ierr.LE.n )
THEN
483 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n )
THEN
503 CALL stgevc( chtemp,
'B', ldumma, n, a, lda, b, ldb, vl,
505 $ vr, ldvr, n, in, work( iwrk ), ierr )
514 CALL sggbak(
'P',
'L', n, ilo, ihi, work( ileft ),
515 $ work( iright ), n, vl, ldvl, ierr )
517 IF( alphai( jc ).LT.zero )
520 IF( alphai( jc ).EQ.zero )
THEN
522 temp = max( temp, abs( vl( jr, jc ) ) )
526 temp = max( temp, abs( vl( jr, jc ) )+
527 $ abs( vl( jr, jc+1 ) ) )
533 IF( alphai( jc ).EQ.zero )
THEN
535 vl( jr, jc ) = vl( jr, jc )*temp
539 vl( jr, jc ) = vl( jr, jc )*temp
540 vl( jr, jc+1 ) = vl( jr, jc+1 )*temp
546 CALL sggbak(
'P',
'R', n, ilo, ihi, work( ileft ),
547 $ work( iright ), n, vr, ldvr, ierr )
549 IF( alphai( jc ).LT.zero )
552 IF( alphai( jc ).EQ.zero )
THEN
554 temp = max( temp, abs( vr( jr, jc ) ) )
558 temp = max( temp, abs( vr( jr, jc ) )+
559 $ abs( vr( jr, jc+1 ) ) )
565 IF( alphai( jc ).EQ.zero )
THEN
567 vr( jr, jc ) = vr( jr, jc )*temp
571 vr( jr, jc ) = vr( jr, jc )*temp
572 vr( jr, jc+1 ) = vr( jr, jc+1 )*temp
587 CALL slascl(
'G', 0, 0, anrmto, anrm, n, 1, alphar, n,
589 CALL slascl(
'G', 0, 0, anrmto, anrm, n, 1, alphai, n,
594 CALL slascl(
'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )
597 work( 1 ) = sroundup_lwork( lwkopt )