在Fortran中将多个variables的外部函数作为一个variables的函数传递
我正在尝试使用QUADPACK
例程来执行数值积分。 例程期望函数作为REAL,EXTERNAL
传递,所以我没有使用指针或其他任何东西的自由。
是否有可能将函数f(x,a,b,...)
作为f(x)
的函数来用于仅期望函数x的函数? 就像使用@(x)f(x,a,b,...)
在MATLAB
完成的一样。
您无法直接在Fortran中使用类似的function。 您也不能在Fortran中返回闭包。 只要写一个包装。
function wrap_f(x) result(res) ... res = f(a,b,...) end function
它可以是内部函数或模块函数,并通过主机关联获取a
和b
,也可以使用包含a
和b
的模块。
如果要将该函数作为实际parameter passing,则不能是Fortran 2003中的内部过程,而只能在Fortran 2008中使用。但它适用于最新版本的gfortran和ifort。 为了更好的便携性使用一个模块。
我可以为这个问题展示一个很好的解决scheme。 我也是一个以前的MATLAB用户,当切换到FORTRAN你想念function处理哈哈。 我以这种方式解决了你的问题:
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