Julia Jump:在目标函数中调用Fortran,ccall中的变量类型?
我有一个关于在使用Julia Jump设置的优化问题的目标函数内调用Fortran例程的问题。我在多个论坛上找到了关于如何从Julia调用Fortran的有用信息,并设法编写了一个Julia程序,在任何优化过程之外成功调用我的Fortran代码:Julia Jump:在目标函数中调用Fortran,ccall中的变量类型?,fortran,julia,Fortran,Julia,我有一个关于在使用Julia Jump设置的优化问题的目标函数内调用Fortran例程的问题。我在多个论坛上找到了关于如何从Julia调用Fortran的有用信息,并设法编写了一个Julia程序,在任何优化过程之外成功调用我的Fortran代码: ffreturn = zeros(Float64,1) xx = 2.0 yy = 4.2 ccall((:FCN, "C:/Users/.../Subroutine.dll"),Cvoid, (Ref{Float64},Ref{Float64},Pt
ffreturn = zeros(Float64,1)
xx = 2.0
yy = 4.2
ccall((:FCN, "C:/Users/.../Subroutine.dll"),Cvoid, (Ref{Float64},Ref{Float64},Ptr{Array{Float64,1}}),xx,yy,ffreturn)
其中Fortran代码计算Rosenbrock函数
module objective
implicit none
private
public :: FCN
contains
subroutine FCN(x,y,fvalue) bind(C,name="FCN")
use, intrinsic :: iso_c_binding, only: c_double
implicit none
real(c_double), intent(in) :: x
real(c_double), intent(in) :: y
real(c_double), intent(inout) :: fvalue(1)
fvalue(1) = 100.*(y-x**2)**2 + (x - 1.)**2
end subroutine FCN
end module objective
如果在Julia Jump目标函数中调用此Fortran例程,现在的变化是“Julia端”上两个输入变量(上例中的xx和yy)的类型。它们不再是Float64类型,而是Variable类型。到目前为止,我还无法找到用什么替换ccall中输入变量的规范Ref{Float64}以获得工作代码。(使用Ref{Variable}生成运行代码,但是Fortran例程始终接收a和y的输入值0)
非常感谢您的帮助 朱莉娅叫什么来着?通过引用还是通过值传递?您可能需要Fortran的
VALUE
属性。使用过滤器(x->uppercase(string(x)[1])=='V',names(JuMP])在名称(JuMP)中进行搜索时,找不到任何类型变量(尽管存在VariableRef,并且有些宏具有类似的名称)。变量的typedef来自哪里?谢谢你们的反馈@evets:Julia的调用约定是通过引用调用。我用“VALUE”属性尝试了它,但是没有做到这一点,结果保持不变,在跳转目标函数外部调用Fortran例程,对x和y使用Ref{Float64},在目标函数内部调用Fortran例程,对x和y使用Ref{Variable},Fortran例程只接收0作为输入。@Bill:当我试图使用Ref{Float64}从跳转目标函数中调用Fortran代码时,从错误消息中得到了类型定义对于x和y:MethodError:无法将类型为Variable的对象转换为类型为Float64的对象。您可能需要在跳转优化器中打印x和y的类型,然后在跳转优化器中调用Fortran,以确保它们确实是Float64而不是跳转优化器结构。