将多个变量的外部函数作为Fortran中一个变量的函数传递

时间:2014-06-09 19:15:25

标签: function fortran

我试图在QUADPACK中使用例程来执行数值积分。例程期望函数作为REAL,EXTERNAL传递,因此我没有使用指针或其他任何东西的自由。

对于只需要x函数的例程,是否可以将函数f(x,a,b,...)别名为函数f(x)?非常类似于MATLAB @(x)f(x,a,b,...)中将会完成的任务。

2 个答案:

答案 0 :(得分:4)

你不能直接在Fortran中使用函数制作类似的技巧。你也无法在Fortran中返回一个闭包。只需写一个包装器。

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

它可以是内部或模块函数,由主机关联获取ab,也可以使用包含ab的模块。

如果要将该函数作为实际参数传递,它不能是Fortran 2003中的内部过程,而只能在Fortran 2008中。但它适用于最新版本的gfortran和ifort。为了更好的可移植性,请使用模块。

答案 1 :(得分:2)

我可以为这个问题找到一个很好的解决方案。我也是以前的MATLAB用户,当切换到FORTRAN时,你错过了函数句柄哈哈。我用这种方式解决了你的问题:

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