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

📄 dopla.f

📁 计算矩阵的经典开源库.全世界都在用它.相信你也不能例外.
💻 F
📖 第 1 页 / 共 2 页
字号:
         IF( LSAMEN( 3, C3, 'TRF' ) ) THEN            DO 10 I = MIN( M, N ), 1, -1               WL = MAX( 0, MIN( KL, M-I ) )               WU = MAX( 0, MIN( KL+KU, N-I ) )               MULTS = MULTS + WL*( 1.D0+WU )               ADDS = ADDS + WL*WU   10       CONTINUE**        xGBTRS:  N, NRHS, KL, KU  =>  M, N, KL, KU*         ELSE IF( LSAMEN( 3, C3, 'TRS' ) ) THEN            WL = MAX( 0, MIN( KL, M-1 ) )            WU = MAX( 0, MIN( KL+KU, M-1 ) )            MULTS = EN*( EM*( WL+1.D0+WU )-0.5D0*     $              ( WL*( WL+1.D0 )+WU*( WU+1.D0 ) ) )            ADDS = EN*( EM*( WL+WU )-0.5D0*     $             ( WL*( WL+1.D0 )+WU*( WU+1.D0 ) ) )*         END IF**     --------------------------------------*     PO:  POsitive definite matrices*     PP:  Positive definite Packed matrices*     --------------------------------------*      ELSE IF( LSAMEN( 2, C2, 'PO' ) .OR. LSAMEN( 2, C2, 'PP' ) ) THEN**        xPOTRF:  N  =>  M*         IF( LSAMEN( 3, C3, 'TRF' ) ) THEN            MULTS = EM*( 1.D0 / 3.D0+EM*( 1.D0 / 2.D0+EM*( 1.D0 /     $              6.D0 ) ) )            ADDS = ( 1.D0 / 6.D0 )*EM*( -1.D0+EM*EM )**        xPOTRS:  N, NRHS  =>  M, N*         ELSE IF( LSAMEN( 3, C3, 'TRS' ) ) THEN            MULTS = EN*( EM*( EM+1.D0 ) )            ADDS = EN*( EM*( EM-1.D0 ) )**        xPOTRI:  N  =>  M*         ELSE IF( LSAMEN( 3, C3, 'TRI' ) ) THEN            MULTS = EM*( 2.D0 / 3.D0+EM*( 1.D0+EM*( 1.D0 / 3.D0 ) ) )            ADDS = EM*( 1.D0 / 6.D0+EM*( -1.D0 / 2.D0+EM*( 1.D0 /     $             3.D0 ) ) )*         END IF**     ------------------------------------*     PB:  Positive definite Band matrices*     ------------------------------------*      ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN**        xPBTRF:  N, K  =>  M, KL*         IF( LSAMEN( 3, C3, 'TRF' ) ) THEN            MULTS = EK*( -2.D0 / 3.D0+EK*( -1.D0+EK*( -1.D0 / 3.D0 ) ) )     $               + EM*( 1.D0+EK*( 3.D0 / 2.D0+EK*( 1.D0 / 2.D0 ) ) )            ADDS = EK*( -1.D0 / 6.D0+EK*( -1.D0 / 2.D0+EK*( -1.D0 /     $             3.D0 ) ) ) + EM*( EK / 2.D0*( 1.D0+EK ) )**        xPBTRS:  N, NRHS, K  =>  M, N, KL*         ELSE IF( LSAMEN( 3, C3, 'TRS' ) ) THEN            MULTS = EN*( ( 2*EM-EK )*( EK+1.D0 ) )            ADDS = EN*( EK*( 2*EM-( EK+1.D0 ) ) )*         END IF**     ----------------------------------*     PT:  Positive definite Tridiagonal*     ----------------------------------*      ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN**        xPTTRF:  N  =>  M*         IF( LSAMEN( 3, C3, 'TRF' ) ) THEN            MULTS = 2*( EM-1 )            ADDS = EM - 1**        xPTTRS:  N, NRHS  =>  M, N*         ELSE IF( LSAMEN( 3, C3, 'TRS' ) ) THEN            MULTS = EN*( 3*EM-2 )            ADDS = EN*( 2*( EM-1 ) )**        xPTSV:  N, NRHS  =>  M, N*         ELSE IF( LSAMEN( 3, C3, 'SV ' ) ) THEN            MULTS = 2*( EM-1 ) + EN*( 3*EM-2 )            ADDS = EM - 1 + EN*( 2*( EM-1 ) )         END IF**     --------------------------------------------------------*     SY:  SYmmetric indefinite matrices*     SP:  Symmetric indefinite Packed matrices*     HE:  HErmitian indefinite matrices (complex only)*     HP:  Hermitian indefinite Packed matrices (complex only)*     --------------------------------------------------------*      ELSE IF( LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) .OR.     $         LSAMEN( 3, SUBNAM, 'CHE' ) .OR.     $         LSAMEN( 3, SUBNAM, 'ZHE' ) .OR.     $         LSAMEN( 3, SUBNAM, 'CHP' ) .OR.     $         LSAMEN( 3, SUBNAM, 'ZHP' ) ) THEN**        xSYTRF:  N  =>  M*         IF( LSAMEN( 3, C3, 'TRF' ) ) THEN            MULTS = EM*( 10.D0 / 3.D0+EM*     $              ( 1.D0 / 2.D0+EM*( 1.D0 / 6.D0 ) ) )            ADDS = EM / 6.D0*( -1.D0+EM*EM )**        xSYTRS:  N, NRHS  =>  M, N*         ELSE IF( LSAMEN( 3, C3, 'TRS' ) ) THEN            MULTS = EN*EM*EM            ADDS = EN*( EM*( EM-1.D0 ) )**        xSYTRI:  N  =>  M*         ELSE IF( LSAMEN( 3, C3, 'TRI' ) ) THEN            MULTS = EM*( 2.D0 / 3.D0+EM*EM*( 1.D0 / 3.D0 ) )            ADDS = EM*( -1.D0 / 3.D0+EM*EM*( 1.D0 / 3.D0 ) )**        xSYTRD, xSYTD2:  N  =>  M*         ELSE IF( LSAMEN( 3, C3, 'TRD' ) .OR. LSAMEN( 3, C3, 'TD2' ) )     $             THEN            IF( M.EQ.1 ) THEN               MULTS = 0.D0               ADDS = 0.D0            ELSE               MULTS = -15.D0 + EM*( -1.D0 / 6.D0+EM*     $                 ( 5.D0 / 2.D0+EM*( 2.D0 / 3.D0 ) ) )               ADDS = -4.D0 + EM*( -8.D0 / 3.D0+EM*     $                ( 1.D0+EM*( 2.D0 / 3.D0 ) ) )            END IF         END IF**     -------------------*     Triangular matrices*     -------------------*      ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN**        xTRTRS:  N, NRHS  =>  M, N*         IF( LSAMEN( 3, C3, 'TRS' ) ) THEN            MULTS = EN*EM*( EM+1.D0 ) / 2.D0            ADDS = EN*EM*( EM-1.D0 ) / 2.D0**        xTRTRI:  N  =>  M*         ELSE IF( LSAMEN( 3, C3, 'TRI' ) ) THEN            MULTS = EM*( 1.D0 / 3.D0+EM*( 1.D0 / 2.D0+EM*( 1.D0 /     $              6.D0 ) ) )            ADDS = EM*( 1.D0 / 3.D0+EM*( -1.D0 / 2.D0+EM*( 1.D0 /     $             6.D0 ) ) )*         END IF*      ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN**        xTBTRS:  N, NRHS, K  =>  M, N, KL*         IF( LSAMEN( 3, C3, 'TRS' ) ) THEN            MULTS = EN*( EM*( EM+1.D0 ) / 2.D0-( EM-EK-1.D0 )*     $              ( EM-EK ) / 2.D0 )            ADDS = EN*( EM*( EM-1.D0 ) / 2.D0-( EM-EK-1.D0 )*( EM-EK ) /     $             2.D0 )         END IF**     --------------------*     Trapezoidal matrices*     --------------------*      ELSE IF( LSAMEN( 2, C2, 'TZ' ) ) THEN**        xTZRQF:  M, N => M, N*         IF( LSAMEN( 3, C3, 'RQF' ) ) THEN            EMN = MIN( M, N )            MULTS = 3*EM*( EN-EM+1 ) + ( 2*EN-2*EM+3 )*     $              ( EM*EM-EMN*( EMN+1 ) / 2 )            ADDS = ( EN-EM+1 )*( EM+2*EM*EM-EMN*( EMN+1 ) )         END IF**     -------------------*     Orthogonal matrices*     -------------------*      ELSE IF( ( SORD .AND. LSAMEN( 2, C2, 'OR' ) ) .OR.     $         ( CORZ .AND. LSAMEN( 2, C2, 'UN' ) ) ) THEN**        -MQR, -MLQ, -MQL, or -MRQ:  M, N, K, SIDE  =>  M, N, KL, KU*           where KU<= 0 indicates SIDE = 'L'*           and   KU> 0  indicates SIDE = 'R'*         IF( LSAMEN( 3, C3, 'MQR' ) .OR. LSAMEN( 3, C3, 'MLQ' ) .OR.     $       LSAMEN( 3, C3, 'MQL' ) .OR. LSAMEN( 3, C3, 'MRQ' ) ) THEN            IF( KU.LE.0 ) THEN               MULTS = EK*EN*( 2.D0*EM+2.D0-EK )               ADDS = EK*EN*( 2.D0*EM+1.D0-EK )            ELSE               MULTS = EK*( EM*( 2.D0*EN-EK )+     $                 ( EM+EN+( 1.D0-EK ) / 2.D0 ) )               ADDS = EK*EM*( 2.D0*EN+1.D0-EK )            END IF**        -GQR or -GQL:  M, N, K  =>  M, N, KL*         ELSE IF( LSAMEN( 3, C3, 'GQR' ) .OR. LSAMEN( 3, C3, 'GQL' ) )     $             THEN            MULTS = EK*( -5.D0 / 3.D0+( 2.D0*EN-EK )+     $              ( 2.D0*EM*EN+EK*( ( 2.D0 / 3.D0 )*EK-EM-EN ) ) )            ADDS = EK*( 1.D0 / 3.D0+( EN-EM )+     $             ( 2.D0*EM*EN+EK*( ( 2.D0 / 3.D0 )*EK-EM-EN ) ) )**        -GLQ or -GRQ:  M, N, K  =>  M, N, KL*         ELSE IF( LSAMEN( 3, C3, 'GLQ' ) .OR. LSAMEN( 3, C3, 'GRQ' ) )     $             THEN            MULTS = EK*( -2.D0 / 3.D0+( EM+EN-EK )+     $              ( 2.D0*EM*EN+EK*( ( 2.D0 / 3.D0 )*EK-EM-EN ) ) )            ADDS = EK*( 1.D0 / 3.D0+( EM-EN )+     $             ( 2.D0*EM*EN+EK*( ( 2.D0 / 3.D0 )*EK-EM-EN ) ) )*         END IF*      END IF*      DOPLA = MULFAC*MULTS + ADDFAC*ADDS*      RETURN**     End of DOPLA*      END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -