2014-06-09 2 views
2

QUADPACK에있는 루틴을 사용하여 수치 적분을 수행하려고합니다. 루틴은 함수가 REAL,EXTERNAL으로 전달되기를 기대하므로 포인터 나 다른 것을 사용하는 자유가 없습니다.Fortran에서 하나의 변수의 함수로 여러 변수의 외부 함수 전달

함수 f(x,a,b,...)을 x의 함수 만 예상하는 루틴에 대해 f(x) 함수로 별명 지정할 수 있습니까? 사람이 MATLAB에서 수행하는 것과 비슷하고 @(x)f(x,a,b,...).

답변

4

Fortran에서 함수를 사용하여 비슷한 트릭을 직접 만들 수는 없습니다. 또한 Fortran에서 클로저를 반환 할 수도 없습니다. 래퍼를 작성하십시오.

function wrap_f(x) result(res) 
    ... 
    res = f(a,b,...) 
end function 

그것은 내부 또는 모듈 기능하고 호스트와 연관하여 ab 얻을 있거나 ab를 포함하는 모듈을 사용할 수있다.

실제 인수로 함수를 전달하려는 경우 Fortran 2003까지는 내부 프로 시저가 될 수 없지만 Fortran 2008에서만 사용됩니다. 그러나 gfortran 및 ifort의 최신 버전에서 작동합니다. 더 나은 휴대 성을 위해 모듈을 사용하십시오.

+1

나는 이름 변경의 복잡성을 마지막에 따르지 않습니다. 분명히 구적 서브 루틴에'f'가 아닌'wrap_f'를 전달할 수 있을까요? – francescalus

+0

음, OP가 그 기능으로 무엇을하기를 원하는지 분명하지 않았습니다. 원래 f가 그 라이브러리에 있다고 생각했습니다. –

+0

아, 그건 의미가 있습니다. 첫 번째 부분은 +1의 가치가있었습니다. – francescalus

2

이 문제에 대한 좋은 해결책을 보여줄 수 있습니다. 나는 또한 이전 MATLAB 사용자이고 FORTRAN으로 전환 할 때 함수가 없어서 haha를 처리하지 못합니다. 이 문제로 귀하의 문제를 해결했습니다 :

module 

    private 
    public :: f , g 

    real(kind=RP) :: a0,b0,c0,... 

    contains 
     function f(x,a,b,c,d,...) 
       implicit none 
       real(kind=RP) :: x,a,b,c,d,... 
       real(kind=RP) :: f 
!    Here you define your function 
       f = ... 

     end function f 

     function g(x) 
       implicit none 
       real(kind=RP) :: x , g 

!    Here you call "f" function with the frozen variables *0 
       g = f(x,a0,b0,c0,...) 
     end function g 

!  We said that parameters were private 
!  (to avoid to be modified from the outside, which can be dangerous, 
!  so we define functions to set their values 

     subroutine setValues(a,b,c,...) 
       implicit none 
       real(kind=RP) :: a,b,c,... 

       a0 = a 
       b0 = b 
       c0 = c 

      end subroutine setValues 



end module 
관련 문제