⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ztgevc.f

📁 计算矩阵的经典开源库.全世界都在用它.相信你也不能例外.
💻 F
📖 第 1 页 / 共 2 页
字号:
     $                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 + -