📄 ztgevc.f
字号:
$ ABS( DBLE( B( JE, JE ) ) )*BSCALE, SAFMIN ) SALPHA = ( TEMP*A( JE, JE ) )*ASCALE SBETA = ( TEMP*DBLE( B( JE, JE ) ) )*BSCALE ACOEFF = SBETA*ASCALE BCOEFF = SALPHA*BSCALE** Scale to avoid underflow* LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEFF ).LT.SMALL LSB = ABS1( SALPHA ).GE.SAFMIN .AND. ABS1( BCOEFF ).LT. $ SMALL* SCALE = ONE IF( LSA ) $ SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG ) IF( LSB ) $ SCALE = MAX( SCALE, ( SMALL / ABS1( SALPHA ) )* $ MIN( BNORM, BIG ) ) IF( LSA .OR. LSB ) THEN SCALE = MIN( SCALE, ONE / $ ( SAFMIN*MAX( ONE, ABS( ACOEFF ), $ ABS1( BCOEFF ) ) ) ) IF( LSA ) THEN ACOEFF = ASCALE*( SCALE*SBETA ) ELSE ACOEFF = SCALE*ACOEFF END IF IF( LSB ) THEN BCOEFF = BSCALE*( SCALE*SALPHA ) ELSE BCOEFF = SCALE*BCOEFF END IF* ----------------- Begin Timing Code ------------------* Calculation of SALPHA through DMIN IOPST = 34 ELSE IOPST = 20* ------------------ End Timing Code ------------------- END IF* ACOEFA = ABS( ACOEFF ) BCOEFA = ABS1( BCOEFF ) XMAX = ONE DO 60 JR = 1, N WORK( JR ) = CZERO 60 CONTINUE WORK( JE ) = CONE DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )** H* Triangular solve of (a A - b B) y = 0** H* (rowwise in (a A - b B) , or columnwise in a A - b B)* DO 100 J = JE + 1, N** Compute* j-1* SUM = sum conjg( a*A(k,j) - b*B(k,j) )*x(k)* k=je* (Scale if necessary)* TEMP = ONE / XMAX IF( ACOEFA*RWORK( J )+BCOEFA*RWORK( N+J ).GT.BIGNUM* $ TEMP ) THEN DO 70 JR = JE, J - 1 WORK( JR ) = TEMP*WORK( JR ) 70 CONTINUE XMAX = ONE* ---------------- Begin Timing Code ---------------- IOPST = IOPST + 2*( J-JE )* ----------------- End Timing Code ----------------- END IF SUMA = CZERO SUMB = CZERO* DO 80 JR = JE, J - 1 SUMA = SUMA + DCONJG( A( JR, J ) )*WORK( JR ) SUMB = SUMB + DCONJG( B( JR, J ) )*WORK( JR ) 80 CONTINUE SUM = ACOEFF*SUMA - DCONJG( BCOEFF )*SUMB** Form x(j) = - SUM / conjg( a*A(j,j) - b*B(j,j) )** with scaling and perturbation of the denominator* D = DCONJG( ACOEFF*A( J, J )-BCOEFF*B( J, J ) ) IF( ABS1( D ).LE.DMIN ) $ D = DCMPLX( DMIN )* IF( ABS1( D ).LT.ONE ) THEN IF( ABS1( SUM ).GE.BIGNUM*ABS1( D ) ) THEN TEMP = ONE / ABS1( SUM ) DO 90 JR = JE, J - 1 WORK( JR ) = TEMP*WORK( JR ) 90 CONTINUE XMAX = TEMP*XMAX SUM = TEMP*SUM* -------------- Begin Timing Code --------------- IOPST = IOPST + 2*( J-JE ) + 5* --------------- End Timing Code ---------------- END IF END IF WORK( J ) = ZLADIV( -SUM, D ) XMAX = MAX( XMAX, ABS1( WORK( J ) ) ) 100 CONTINUE** Back transform eigenvector if HOWMNY='B'.* IF( ILBACK ) THEN CALL ZGEMV( 'N', N, N+1-JE, CONE, VL( 1, JE ), LDVL, $ WORK( JE ), 1, CZERO, WORK( N+1 ), 1 ) ISRC = 2 IBEG = 1* ----------------- Begin Timing Code ------------------ IOPST = IOPST + 8*N*( N+1-JE )* ------------------ End Timing Code ------------------- ELSE ISRC = 1 IBEG = JE END IF** Copy and scale eigenvector into column of VL* XMAX = ZERO DO 110 JR = IBEG, N XMAX = MAX( XMAX, ABS1( WORK( ( ISRC-1 )*N+JR ) ) ) 110 CONTINUE* IF( XMAX.GT.SAFMIN ) THEN TEMP = ONE / XMAX DO 120 JR = IBEG, N VL( JR, IEIG ) = TEMP*WORK( ( ISRC-1 )*N+JR ) 120 CONTINUE ELSE IBEG = N + 1 END IF* DO 130 JR = 1, IBEG - 1 VL( JR, IEIG ) = CZERO 130 CONTINUE** ------------------- Begin Timing Code ------------------- OPS = OPS + ( DBLE( 36*( N-JE )+8*( N-JE )*( N+1-JE )+3* $ ( N+1-IBEG )+1 )+DBLE( IOPST ) )* -------------------- End Timing Code -------------------- END IF 140 CONTINUE END IF** Right eigenvectors* IF( COMPR ) THEN IEIG = IM + 1** Main loop over eigenvalues* DO 250 JE = N, 1, -1 IF( ILALL ) THEN ILCOMP = .TRUE. ELSE ILCOMP = SELECT( JE ) END IF IF( ILCOMP ) THEN IEIG = IEIG - 1* IF( ABS1( A( JE, JE ) ).LE.SAFMIN .AND. $ ABS( DBLE( B( JE, JE ) ) ).LE.SAFMIN ) THEN** Singular matrix pencil -- return unit eigenvector* DO 150 JR = 1, N VR( JR, IEIG ) = CZERO 150 CONTINUE VR( IEIG, IEIG ) = CONE GO TO 250 END IF** Non-singular eigenvalue:* Compute coefficients a and b in** ( a A - b B ) x = 0* TEMP = ONE / MAX( ABS1( A( JE, JE ) )*ASCALE, $ ABS( DBLE( B( JE, JE ) ) )*BSCALE, SAFMIN ) SALPHA = ( TEMP*A( JE, JE ) )*ASCALE SBETA = ( TEMP*DBLE( B( JE, JE ) ) )*BSCALE ACOEFF = SBETA*ASCALE BCOEFF = SALPHA*BSCALE** Scale to avoid underflow* LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEFF ).LT.SMALL LSB = ABS1( SALPHA ).GE.SAFMIN .AND. ABS1( BCOEFF ).LT. $ SMALL* SCALE = ONE IF( LSA ) $ SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG ) IF( LSB ) $ SCALE = MAX( SCALE, ( SMALL / ABS1( SALPHA ) )* $ MIN( BNORM, BIG ) ) IF( LSA .OR. LSB ) THEN SCALE = MIN( SCALE, ONE / $ ( SAFMIN*MAX( ONE, ABS( ACOEFF ), $ ABS1( BCOEFF ) ) ) ) IF( LSA ) THEN ACOEFF = ASCALE*( SCALE*SBETA ) ELSE ACOEFF = SCALE*ACOEFF END IF IF( LSB ) THEN BCOEFF = BSCALE*( SCALE*SALPHA ) ELSE BCOEFF = SCALE*BCOEFF END IF* ----------------- Begin Timing Code ------------------* Calculation of SALPHA through DMIN IOPST = 34 ELSE IOPST = 20* ------------------ End Timing Code ------------------- END IF* ACOEFA = ABS( ACOEFF ) BCOEFA = ABS1( BCOEFF ) XMAX = ONE DO 160 JR = 1, N WORK( JR ) = CZERO 160 CONTINUE WORK( JE ) = CONE DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )** Triangular solve of (a A - b B) x = 0 (columnwise)** WORK(1:j-1) contains sums w,* WORK(j+1:JE) contains x* DO 170 JR = 1, JE - 1 WORK( JR ) = ACOEFF*A( JR, JE ) - BCOEFF*B( JR, JE ) 170 CONTINUE WORK( JE ) = CONE* DO 210 J = JE - 1, 1, -1** Form x(j) := - w(j) / d* with scaling and perturbation of the denominator* D = ACOEFF*A( J, J ) - BCOEFF*B( J, J ) IF( ABS1( D ).LE.DMIN ) $ D = DCMPLX( DMIN )* IF( ABS1( D ).LT.ONE ) THEN IF( ABS1( WORK( J ) ).GE.BIGNUM*ABS1( D ) ) THEN TEMP = ONE / ABS1( WORK( J ) ) DO 180 JR = 1, JE WORK( JR ) = TEMP*WORK( JR ) 180 CONTINUE* -------------- Begin Timing Code --------------- IOPST = IOPST + 2*JE + 5 ELSE IOPST = IOPST + 3* --------------- End Timing Code ---------------- END IF END IF* WORK( J ) = ZLADIV( -WORK( J ), D )* IF( J.GT.1 ) THEN** w = w + x(j)*(a A(*,j) - b B(*,j) ) with scaling* IF( ABS1( WORK( J ) ).GT.ONE ) THEN TEMP = ONE / ABS1( WORK( J ) ) IF( ACOEFA*RWORK( J )+BCOEFA*RWORK( N+J ).GE. $ BIGNUM*TEMP ) THEN DO 190 JR = 1, JE WORK( JR ) = TEMP*WORK( JR ) 190 CONTINUE* ------------- Begin Timing Code ------------- IOPST = IOPST + 2*JE + 6 ELSE IOPST = IOPST + 6* -------------- End Timing Code -------------- END IF END IF* CA = ACOEFF*WORK( J ) CB = BCOEFF*WORK( J ) DO 200 JR = 1, J - 1 WORK( JR ) = WORK( JR ) + CA*A( JR, J ) - $ CB*B( JR, J ) 200 CONTINUE END IF 210 CONTINUE** Back transform eigenvector if HOWMNY='B'.* IF( ILBACK ) THEN CALL ZGEMV( 'N', N, JE, CONE, VR, LDVR, WORK, 1, $ CZERO, WORK( N+1 ), 1 ) ISRC = 2 IEND = N* ----------------- Begin Timing Code ------------------ IOPST = IOPST + 8*N*JE* ------------------ End Timing Code ------------------- ELSE ISRC = 1 IEND = JE END IF** Copy and scale eigenvector into column of VR* XMAX = ZERO DO 220 JR = 1, IEND XMAX = MAX( XMAX, ABS1( WORK( ( ISRC-1 )*N+JR ) ) ) 220 CONTINUE* IF( XMAX.GT.SAFMIN ) THEN TEMP = ONE / XMAX DO 230 JR = 1, IEND VR( JR, IEIG ) = TEMP*WORK( ( ISRC-1 )*N+JR ) 230 CONTINUE ELSE IEND = 0 END IF* DO 240 JR = IEND + 1, N VR( JR, IEIG ) = CZERO 240 CONTINUE** ------------------- Begin Timing Code ------------------- OPS = OPS + ( DBLE( 30*( JE-2 )+8*( JE-1 )*( JE-2 )+3* $ IEND+22 )+DBLE( IOPST ) )* -------------------- End Timing Code -------------------- END IF 250 CONTINUE END IF* RETURN** End of ZTGEVC* END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -