dggesx.f.html
来自「famous linear algebra library (LAPACK) p」· HTML 代码 · 共 701 行 · 第 1/4 页
HTML
701 行
</span><span class="comment">*</span><span class="comment"> (Workspace: If IJOB >= 1, need MAX( 8*(N+1), 2*SDIM*(N-SDIM) )
</span><span class="comment">*</span><span class="comment"> otherwise, need 8*(N+1) )
</span><span class="comment">*</span><span class="comment">
</span> IF( WANTST ) THEN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Undo scaling on eigenvalues before SELCTGing
</span><span class="comment">*</span><span class="comment">
</span> IF( ILASCL ) THEN
CALL <a name="DLASCL.518"></a><a href="dlascl.f.html#DLASCL.1">DLASCL</a>( <span class="string">'G'</span>, 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N,
$ IERR )
CALL <a name="DLASCL.520"></a><a href="dlascl.f.html#DLASCL.1">DLASCL</a>( <span class="string">'G'</span>, 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N,
$ IERR )
END IF
IF( ILBSCL )
$ CALL <a name="DLASCL.524"></a><a href="dlascl.f.html#DLASCL.1">DLASCL</a>( <span class="string">'G'</span>, 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Select eigenvalues
</span><span class="comment">*</span><span class="comment">
</span> DO 10 I = 1, N
BWORK( I ) = SELCTG( ALPHAR( I ), ALPHAI( I ), BETA( I ) )
10 CONTINUE
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Reorder eigenvalues, transform Generalized Schur vectors, and
</span><span class="comment">*</span><span class="comment"> compute reciprocal condition numbers
</span><span class="comment">*</span><span class="comment">
</span> CALL <a name="DTGSEN.535"></a><a href="dtgsen.f.html#DTGSEN.1">DTGSEN</a>( IJOB, ILVSL, ILVSR, BWORK, N, A, LDA, B, LDB,
$ ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR,
$ SDIM, PL, PR, DIF, WORK( IWRK ), LWORK-IWRK+1,
$ IWORK, LIWORK, IERR )
<span class="comment">*</span><span class="comment">
</span> IF( IJOB.GE.1 )
$ MAXWRK = MAX( MAXWRK, 2*SDIM*( N-SDIM ) )
IF( IERR.EQ.-22 ) THEN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> not enough real workspace
</span><span class="comment">*</span><span class="comment">
</span> INFO = -22
ELSE
IF( IJOB.EQ.1 .OR. IJOB.EQ.4 ) THEN
RCONDE( 1 ) = PL
RCONDE( 2 ) = PR
END IF
IF( IJOB.EQ.2 .OR. IJOB.EQ.4 ) THEN
RCONDV( 1 ) = DIF( 1 )
RCONDV( 2 ) = DIF( 2 )
END IF
IF( IERR.EQ.1 )
$ INFO = N + 3
END IF
<span class="comment">*</span><span class="comment">
</span> END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Apply permutation to VSL and VSR
</span><span class="comment">*</span><span class="comment"> (Workspace: none needed)
</span><span class="comment">*</span><span class="comment">
</span> IF( ILVSL )
$ CALL <a name="DGGBAK.566"></a><a href="dggbak.f.html#DGGBAK.1">DGGBAK</a>( <span class="string">'P'</span>, <span class="string">'L'</span>, N, ILO, IHI, WORK( ILEFT ),
$ WORK( IRIGHT ), N, VSL, LDVSL, IERR )
<span class="comment">*</span><span class="comment">
</span> IF( ILVSR )
$ CALL <a name="DGGBAK.570"></a><a href="dggbak.f.html#DGGBAK.1">DGGBAK</a>( <span class="string">'P'</span>, <span class="string">'R'</span>, N, ILO, IHI, WORK( ILEFT ),
$ WORK( IRIGHT ), N, VSR, LDVSR, IERR )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Check if unscaling would cause over/underflow, if so, rescale
</span><span class="comment">*</span><span class="comment"> (ALPHAR(I),ALPHAI(I),BETA(I)) so BETA(I) is on the order of
</span><span class="comment">*</span><span class="comment"> B(I,I) and ALPHAR(I) and ALPHAI(I) are on the order of A(I,I)
</span><span class="comment">*</span><span class="comment">
</span> IF( ILASCL ) THEN
DO 20 I = 1, N
IF( ALPHAI( I ).NE.ZERO ) THEN
IF( ( ALPHAR( I ) / SAFMAX ).GT.( ANRMTO / ANRM ) .OR.
$ ( SAFMIN / ALPHAR( I ) ).GT.( ANRM / ANRMTO ) ) THEN
WORK( 1 ) = ABS( A( I, I ) / ALPHAR( I ) )
BETA( I ) = BETA( I )*WORK( 1 )
ALPHAR( I ) = ALPHAR( I )*WORK( 1 )
ALPHAI( I ) = ALPHAI( I )*WORK( 1 )
ELSE IF( ( ALPHAI( I ) / SAFMAX ).GT.
$ ( ANRMTO / ANRM ) .OR.
$ ( SAFMIN / ALPHAI( I ) ).GT.( ANRM / ANRMTO ) )
$ THEN
WORK( 1 ) = ABS( A( I, I+1 ) / ALPHAI( I ) )
BETA( I ) = BETA( I )*WORK( 1 )
ALPHAR( I ) = ALPHAR( I )*WORK( 1 )
ALPHAI( I ) = ALPHAI( I )*WORK( 1 )
END IF
END IF
20 CONTINUE
END IF
<span class="comment">*</span><span class="comment">
</span> IF( ILBSCL ) THEN
DO 30 I = 1, N
IF( ALPHAI( I ).NE.ZERO ) THEN
IF( ( BETA( I ) / SAFMAX ).GT.( BNRMTO / BNRM ) .OR.
$ ( SAFMIN / BETA( I ) ).GT.( BNRM / BNRMTO ) ) THEN
WORK( 1 ) = ABS( B( I, I ) / BETA( I ) )
BETA( I ) = BETA( I )*WORK( 1 )
ALPHAR( I ) = ALPHAR( I )*WORK( 1 )
ALPHAI( I ) = ALPHAI( I )*WORK( 1 )
END IF
END IF
30 CONTINUE
END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Undo scaling
</span><span class="comment">*</span><span class="comment">
</span> IF( ILASCL ) THEN
CALL <a name="DLASCL.616"></a><a href="dlascl.f.html#DLASCL.1">DLASCL</a>( <span class="string">'H'</span>, 0, 0, ANRMTO, ANRM, N, N, A, LDA, IERR )
CALL <a name="DLASCL.617"></a><a href="dlascl.f.html#DLASCL.1">DLASCL</a>( <span class="string">'G'</span>, 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
CALL <a name="DLASCL.618"></a><a href="dlascl.f.html#DLASCL.1">DLASCL</a>( <span class="string">'G'</span>, 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N, IERR )
END IF
<span class="comment">*</span><span class="comment">
</span> IF( ILBSCL ) THEN
CALL <a name="DLASCL.622"></a><a href="dlascl.f.html#DLASCL.1">DLASCL</a>( <span class="string">'U'</span>, 0, 0, BNRMTO, BNRM, N, N, B, LDB, IERR )
CALL <a name="DLASCL.623"></a><a href="dlascl.f.html#DLASCL.1">DLASCL</a>( <span class="string">'G'</span>, 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
END IF
<span class="comment">*</span><span class="comment">
</span> IF( WANTST ) THEN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Check if reordering is correct
</span><span class="comment">*</span><span class="comment">
</span> LASTSL = .TRUE.
LST2SL = .TRUE.
SDIM = 0
IP = 0
DO 50 I = 1, N
CURSL = SELCTG( ALPHAR( I ), ALPHAI( I ), BETA( I ) )
IF( ALPHAI( I ).EQ.ZERO ) THEN
IF( CURSL )
$ SDIM = SDIM + 1
IP = 0
IF( CURSL .AND. .NOT.LASTSL )
$ INFO = N + 2
ELSE
IF( IP.EQ.1 ) THEN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Last eigenvalue of conjugate pair
</span><span class="comment">*</span><span class="comment">
</span> CURSL = CURSL .OR. LASTSL
LASTSL = CURSL
IF( CURSL )
$ SDIM = SDIM + 2
IP = -1
IF( CURSL .AND. .NOT.LST2SL )
$ INFO = N + 2
ELSE
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> First eigenvalue of conjugate pair
</span><span class="comment">*</span><span class="comment">
</span> IP = 1
END IF
END IF
LST2SL = LASTSL
LASTSL = CURSL
50 CONTINUE
<span class="comment">*</span><span class="comment">
</span> END IF
<span class="comment">*</span><span class="comment">
</span> 60 CONTINUE
<span class="comment">*</span><span class="comment">
</span> WORK( 1 ) = MAXWRK
IWORK( 1 ) = LIWMIN
<span class="comment">*</span><span class="comment">
</span> RETURN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> End of <a name="DGGESX.674"></a><a href="dggesx.f.html#DGGESX.1">DGGESX</a>
</span><span class="comment">*</span><span class="comment">
</span> END
</pre>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?