223 SUBROUTINE dggev3( 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 DOUBLE PRECISION A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
237 $ B( LDB, * ), BETA( * ), VL( LDVL, * ),
238 $ vr( ldvr, * ), work( * )
244 DOUBLE PRECISION ZERO,
245 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
248 LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
250 INTEGER , IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
251 $ in, iright, irows, itau, iwrk
252 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
265 DOUBLE PRECISION DLAMCH, DLANGE
266 EXTERNAL lsame, dlamch, dlange
269 INTRINSIC abs,
max, sqrt
275 IF( lsame( jobvl,
'N' ) )
THEN
278 ELSE IF( lsame( jobvl,
'V' ) )
THEN
286 IF( lsame( jobvr,
'N' ) )
THEN
289 ELSE IF( lsame( jobvr,
'V' ) )
THEN
301 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( ldvl.LT.1 .OR. ( ilvl .AND. ldvl.LT.n ) )
THEN
314 ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) )
THEN
316 ELSE IF( lwork.LT.
max( 1, 8*n ) .AND. .NOT.lquery )
THEN
323 CALL dgeqrf( n, n, b, ldb, work, work, -1, ierr )
324 lwkopt =
max(1, 8*n, 3*n+int( work( 1 ) ) )
325 CALL dormqr( 'l
', 't
', N, N, N, B, LDB, WORK, A, LDA, WORK, -1,
327 LWKOPT = MAX( LWKOPT, 3*N+INT( WORK ( 1 ) ) )
329 CALL DORGQR( N, N, N, VL, LDVL, WORK, WORK, -1, IERR )
330 LWKOPT = MAX( LWKOPT, 3*N+INT( WORK ( 1 ) ) )
333 CALL DGGHD3( JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB, VL,
334 $ LDVL, VR, LDVR, WORK, -1, IERR )
335 LWKOPT = MAX( LWKOPT, 3*N+INT( WORK ( 1 ) ) )
336 CALL DLAQZ0( 's
', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB,
337 $ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR,
338 $ WORK, -1, 0, IERR )
339 LWKOPT = MAX( LWKOPT, 2*N+INT( WORK ( 1 ) ) )
341 CALL DGGHD3( 'n
', 'n
', N, 1, N, A, LDA, B, LDB, VL, LDVL,
342 $ VR, LDVR, WORK, -1, IERR )
343 LWKOPT = MAX( LWKOPT, 3*N+INT( WORK ( 1 ) ) )
344 CALL DLAQZ0( '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 ) ) )
354 CALL XERBLA( 'dggev3 ', -INFO )
356 ELSE IF( LQUERY ) THEN
368 SMLNUM = DLAMCH( 's
' )
369 BIGNUM = ONE / SMLNUM
370 CALL DLABAD( SMLNUM, BIGNUM )
371 SMLNUM = SQRT( SMLNUM ) / EPS
372 BIGNUM = ONE / SMLNUM
376 ANRM = DLANGE( 'm
', N, N, A, LDA, WORK )
378.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
381.GT.
ELSE IF( ANRMBIGNUM ) THEN
386 $ CALL DLASCL( 'g
', 0, 0, ANRM, ANRMTO, N, N, A, LDA, IERR )
390 BNRM = DLANGE( 'm
', N, N, B, LDB, WORK )
392.GT..AND..LT.
IF( BNRMZERO BNRMSMLNUM ) THEN
395.GT.
ELSE IF( BNRMBIGNUM ) THEN
400 $ CALL DLASCL( 'g
', 0, 0, BNRM, BNRMTO, N, N, B, LDB, IERR )
407 CALL DGGBAL( 'p
', N, A, LDA, B, LDB, ILO, IHI, WORK( ILEFT ),
408 $ WORK( IRIGHT ), WORK( IWRK ), IERR )
412 IROWS = IHI + 1 - ILO
420 CALL DGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
421 $ WORK( IWRK ), LWORK+1-IWRK, IERR )
425 CALL DORMQR( 'l
', 't
', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
426 $ WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
427 $ LWORK+1-IWRK, IERR )
432 CALL DLASET( 'full
', N, N, ZERO, ONE, VL, LDVL )
433.GT.
IF( IROWS1 ) THEN
434 CALL DLACPY( 'l
', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
435 $ VL( ILO+1, ILO ), LDVL )
437 CALL DORGQR( IROWS, IROWS, IROWS, VL( ILO, ILO ), LDVL,
438 $ WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
444 $ CALL DLASET( 'full
', N, N, ZERO, ONE, VR, LDVR )
452 CALL DGGHD3( JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB, VL,
453 $ LDVL, VR, LDVR, WORK( IWRK ), LWORK+1-IWRK, IERR )
455 CALL DGGHD3( 'n
', 'n
', IROWS, 1, IROWS, A( ILO, ILO ), LDA,
456 $ B( ILO, ILO ), LDB, VL, LDVL, VR, LDVR,
457 $ WORK( IWRK ), LWORK+1-IWRK, IERR )
469 CALL DLAQZ0( CHTEMP, JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB,
470 $ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR,
471 $ WORK( IWRK ), LWORK+1-IWRK, 0, IERR )
473.GT..AND..LE.
IF( IERR0 IERRN ) THEN
475.GT..AND..LE.
ELSE IF( IERRN IERR2*N ) THEN
495 CALL DTGEVC( CHTEMP, 'b
', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
496 $ VR, LDVR, N, IN, WORK( IWRK ), IERR )
505 CALL DGGBAK( 'p
', 'l
', N, ILO, IHI, WORK( ILEFT ),
506 $ WORK( IRIGHT ), N, VL, LDVL, IERR )
508.LT.
IF( ALPHAI( JC )ZERO )
511.EQ.
IF( ALPHAI( JC )ZERO ) THEN
513 TEMP = MAX( TEMP, ABS( VL( JR, JC ) ) )
517 TEMP = MAX( TEMP, ABS( VL( JR, JC ) )+
518 $ ABS( VL( JR, JC+1 ) ) )
524.EQ.
IF( ALPHAI( JC )ZERO ) THEN
526 VL( JR, JC ) = VL( JR, JC )*TEMP
530 VL( JR, JC ) = VL( JR, JC )*TEMP
531 VL( JR, JC+1 ) = VL( JR, JC+1 )*TEMP
537 CALL DGGBAK( 'p
', 'r
', N, ILO, IHI, WORK( ILEFT ),
538 $ WORK( IRIGHT ), N, VR, LDVR, IERR )
540.LT.
IF( ALPHAI( JC )ZERO )
543.EQ.
IF( ALPHAI( JC )ZERO ) THEN
545 TEMP = MAX( TEMP, ABS( VR( JR, JC ) ) )
549 TEMP = MAX( TEMP, ABS( VR( JR, JC ) )+
550 $ ABS( VR( JR, JC+1 ) ) )
556.EQ.
IF( ALPHAI( JC )ZERO ) THEN
558 VR( JR, JC ) = VR( JR, JC )*TEMP
562 VR( JR, JC ) = VR( JR, JC )*TEMP
563 VR( JR, JC+1 ) = VR( JR, JC+1 )*TEMP
578 CALL DLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
579 CALL DLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N, IERR )
583 CALL DLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
subroutine dlabad(small, large)
DLABAD
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
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 xerbla(srname, info)
XERBLA
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 dtgevc(side, howmny, select, n, s, lds, p, ldp, vl, ldvl, vr, ldvr, mm, m, work, info)
DTGEVC
recursive subroutine dlaqz0(wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb, alphar, alphai, beta, q, ldq, z, ldz, work, lwork, rec, info)
DLAQZ0
subroutine dgeqrf(m, n, a, lda, tau, work, lwork, info)
DGEQRF
subroutine dggev3(jobvl, jobvr, n, a, lda, b, ldb, alphar, alphai, beta, vl, ldvl, vr, ldvr, work, lwork, info)
DGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (...
subroutine dormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
DORMQR
subroutine dorgqr(m, n, k, a, lda, tau, work, lwork, info)
DORGQR
subroutine dgghd3(compq, compz, n, ilo, ihi, a, lda, b, ldb, q, ldq, z, ldz, work, lwork, info)
DGGHD3
subroutine jc(p, t, a, b, cm, cn, tref, tm, epsm, sigmam, jc_yield, tan_jc)