我试图在QUADPACK
中使用例程来执行数值积分。例程期望函数作为REAL,EXTERNAL
传递,因此我没有使用指针或其他任何东西的自由。
对于只需要x函数的例程,是否可以将函数f(x,a,b,...)
别名为函数f(x)
?非常类似于MATLAB
@(x)f(x,a,b,...)
中将会完成的任务。
答案 0 :(得分:4)
你不能直接在Fortran中使用函数制作类似的技巧。你也无法在Fortran中返回一个闭包。只需写一个包装器。
function wrap_f(x) result(res)
...
res = f(a,b,...)
end function
它可以是内部或模块函数,由主机关联获取a
和b
,也可以使用包含a
和b
的模块。
如果要将该函数作为实际参数传递,它不能是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