Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia Jump:在目标函数中调用Fortran,ccall中的变量类型?_Fortran_Julia - Fatal编程技术网

Julia Jump:在目标函数中调用Fortran,ccall中的变量类型?

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

我有一个关于在使用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},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而不是跳转优化器结构。