在f2py中使用回调函数时出错

问题描述

我正在尝试将python函数传递给f2py生成函数。当python函数的输入和输出是数组时,我不知道如何执行此操作。 (我是f2py的新手!)

这是我的fortran代码(num_Dg.f):

var source = 'file:///Users/alexx/Library/Developer/CoreSimulator/Devices/44F0FA92-4898-4CFB-862E-4E5EC4C8AB28/data/Containers/Bundle/Application/34BCE695-4B4F-472F-AB5C-F2336AC45273/DoorLock.app/123.jpg';

我使用f2py进行编译:{{1​​}}。它编译没有错误。但是,当将函数导入python时,我得到了:

const form = new FormData();
      form.append('file',{
        uri: source,name: '123.jpg',fileName: 'file',//optional
      });

fetch(uri,{
             method: 'post',body: form,})
        .then(response => {
         console.log("image uploaded")
         console.log(response)
       })
        .catch(console.log);

回调函数 subroutine num_Dg(func,U,jacob,n) double precision,intent(in) :: U(n) double precision,intent(out) :: jacob(n,n) double precision Up(n),Um(n) double precision g_valp(n),g_valm(n) double precision :: rel_eps = 2.e-5 double precision eps integer i,j external func eps = minval(U)*rel_eps do j=1,n do i=1,n if (i .eq. j) then Up(i) = U(i)+(eps) Um(i) = U(i)-(eps) else Up(i) = 0 Um(i) = 0 endif enddo call func(Up,g_valp,n) call func(Um,g_valm,n) do i=1,n jacob(i,j) = 0.0 jacob(i,j) = (g_valp(i)-g_valm(i))/(2*eps) enddo enddo end subroutine 有问题。输入应为数组f2py -c num_Dg.f -m num_Dg输出应为>>> from num_Dg import num_dg >>> print(num_dg.__doc__) jacob = num_dg(func,u,[n,func_extra_args]) Wrapper for ``num_dg``. Parameters ---------- func : call-back function u : input rank-1 array('d') with bounds (n) Other Parameters ---------------- func_extra_args : input tuple,optional Default: () n : input int,optional Default: len(u) Returns ------- jacob : rank-2 array('d') with bounds (n,n) Notes ----- Call-back functions:: def func(up,gvalp,[n]): return required arguments: up : input rank-1 array('d') with bounds (n) gvalp : input rank-1 array('d') with bounds (n) Optional arguments: n : input int,optional Default: len(up) 。相反,funcU都是输入,没有输出

我假设这就是以下python脚本返回垃圾的原因:

gval

如何更改我的fortran子例程,以便回调函数正常工作?任何建议表示赞赏!谢谢!

解决方法

我最终弄清楚了。我认为它不起作用的原因是因为我错过了cf2py intent(out),depend(n) :: g_valp行。可以使用f2py以常规方式编译脚本:f2py -c num_Dg.f -m num_Dg

      subroutine num_Dg(U,jacob,n)
cf2py   intent(callback) func
        external func
        integer n
        double precision :: U(n)
        double precision :: jacob(n,n)
        double precision Up(n),Um(n)
        double precision g_valp(n),g_valm(n)
        double precision :: rel_eps = 2.e-5
        double precision eps
        integer i,j

cf2py   intent(in,copy),depend(n) :: U
cf2py   intent(hide) :: n
cf2py   intent(out),depend(n) :: jacob
cf2py   intent(out),depend(n) :: g_valp

        eps = minval(U)*rel_eps
        do j=1,n
          do i=1,n
            if (i .eq. j) then
            Up(i) = U(i)+(eps)
            Um(i) = U(i)-(eps)
            else
            Up(i) = 0
            Um(i) = 0
            endif
          enddo

          call func(n,Up,g_valp)
          call func(n,Um,g_valm)

          do i=1,n
            jacob(i,j) = (g_valp(i)-g_valm(i))/(2*eps)

          enddo

        enddo
      end subroutine