2016-03-19 13 views
-1

私は関数(f(x、y = 5))の積分を計算する関数(Simpson)を持っています。私はこの同じ関数(Simpson)を使って、関数f(x、y)を二重積分したいと思っています:Fortran、プロシージャを複数コピーする方法

F(x)= \ int dy f(x、y) I = \ int dx F (x)

私はFortranで同じ関数を2回(Simpson)呼び出すことができますか? 私が下に置いた例でこれをどうやってしますか? 私の質問の主なアイデアはすでにここに書かれていると思いますが、私は答えを見つけませんでした。 fortran, how to make several copies of a program using module or interface?

Simpson:Simpson1 Simpson2の機能のコピーを外部パッケージを使用することには興味がありません。

ベスト

これは私が使用しているコードの概要である:

MODULE INTEG 
IMPLICIT NONE 
CONTAINS 
REAL FUNCTION SIMPSON(FUNC,A,B,TOL) 
    REAL, INTENT(IN) :: A, B, TOL 
    INTERFACE 
     FUNCTION FUNC (X) RESULT(OUT) 
      IMPLICIT NONE 
      REAL, INTEN(IN) :: X 
      REAL :: OUT 
     END FUNCTION 
    END INTERFACE 
........ 
END FUNCTION SIMPSON 
END MODULE INTEG 

MODULE DOING 
USE INTEG 
REAL :: TEMP 
IMPLICIT NONE 
CONTAINS 
REAL FUNCTION FUNC (X,Y) 
    IMPLICIT NONE 
    REAL, INTENT(IN) :: X, Y 
    REAL :: OUT 
    FUNC = X*Y 
END FUNCTION FUNC 

FUNCTION F(Y) RESULT(OUT2) 
    REAL, INTENT(IN) :: Y 
    REAL :: A, B, TOL,OUT2 
    TEMP = Y 
    OUT2 = SIMPSON(I1, A, B, TOL) 
    CONTAINS 
    REAL FUNCTION I1(X) RESULT(OUT) 
     REAL, INTENT(IN) :: X 
     OUT = FUNC (X,TEMP) 
    END FUNCTION I1 
END FUNCTION F 

    REAL FUNCTION I2(A2, B2, TOL2) 
     REAL, INTENT(IN) :: A2, B2, TOL2 
     I2 = SIMPSON(F, A2, B2,TOL) 
    END FUNCTION I2 
END MODULE DOING 

PROGRAM EXAMPLE 
USE DOING 
IMIPLICIT NONE 
REAL :: A2, B2, TOL2, OUT3 
OUT3 = I2(A2, B2, TOL2) 
END PROGRAM EXAMPLE 
+0

特定のバージョンのFortran Standardに固有の質問がない限り、generic [tag:fortran]タグを使用してください。 –

+1

あなたが何を求めているのか分かりません。関数を何度も呼び出すことができます。問題を明確にしてください。何か試しましたか?何かエラーがありましたか? –

答えて

0

アレキサンダーをあなたはright.Iは、いくつかの点でミスを犯しています。次のコードが動作しています

MODULE INTEG 
    IMPLICIT NONE 
    CONTAINS 
    REAL FUNCTION Simpson(FUN, A, B, N) 
     IMPLICIT NONE 
     INTERFACE 
      FUNCTION FUN (X) RESULT(RESUL) 
       IMPLICIT NONE 
       REAL, INTENT(IN) :: X 
       REAL :: RESUL 
      END FUNCTION FUN 
     END INTERFACE 
     INTEGER, INTENT(IN) :: N 
     REAL, INTENT(IN) :: A, B 

     INTEGER :: N1, N2, I 
     REAL :: STEP, H, SUMA1, SUMA2 

     H = (B-A)/REAL(N) 

     N1 = N/2 - 1 
     N2 = N/2 

     SUMA1 = 0.0 
     DO I = 1, N1 
      STEP = A + 2*I*H 
      SUMA1 = SUMA1 + FUN(STEP) 
     END DO 
     SUMA2 = 0.0 
     DO I = 1, N2 
      STEP = A + (2*I-1)*H 
      SUMA2 = SUMA2 + FUN(STEP) 
     END DO 
     Simpson = H*(FUN(A) + 2*SUMA1 + 4*SUMA2 + FUN(B))/3.0 
    END FUNCTION Simpson 
END MODULE INTEG 

MODULE DOING 
    USE INTEG 
    IMPLICIT NONE 
    REAL :: TEMP 
    CONTAINS 
    REAL FUNCTION FUNC (X,Y) 
     IMPLICIT NONE 
     REAL, INTENT(IN) :: X, Y 
     REAL :: OUT 
     FUNC = X*Y 
    END FUNCTION FUNC 

    FUNCTION F(Y) RESULT(OUT2) 
     REAL, INTENT(IN) :: Y 
     REAL :: A, B, TOL,OUT2 
     TEMP = Y 
     A = 1 
     B = 3 
     OUT2 = Simpson(I1, A, B, 100) 
     CONTAINS 
     REAL FUNCTION I1(X) RESULT(OUT) 
     REAL, INTENT(IN) :: X 
     OUT = FUNC (X,TEMP) 
     END FUNCTION I1 
    END FUNCTION F 

    REAL FUNCTION I2(A2, B2, NN) 
    REAL, INTENT(IN) :: A2, B2 
    INTEGER, INTENT(IN) :: NN 
    I2 = Simpson(F, A2, B2,100) 
    END FUNCTION I2 
END MODULE DOING 

PROGRAM EXAMPLE 
    USE DOING 
    IMPLICIT NONE 
    REAL :: A2, B2, OUT3 
    A2 = 1 
    B2 = 3 
    OUT3 = I2(A2, B2, 100) 
    WRITE(*,*)OUT3 
END PROGRAM EXAMPLE 
関連する問題