簡體   English   中英

將回調函數與 f2py 一起使用時出錯

[英]Error when using callback function with f2py

我正在嘗試將 python 函數傳遞給 f2py 生成的函數。 當 python 函數的輸入和輸出是一個數組時,我無法弄清楚如何做到這一點。 (我是 f2py 的新手!)

這是我的 Fortran 代碼(num_Dg.f):

     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 編譯: f2py -c num_Dg.f -m num_Dg 它編譯沒有錯誤。 但是當將函數導入 python 時,我得到了這個:

>>> 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)

回調函數func有問題。 輸入應該是數組U ,輸出應該是gval 相反, Ugval都是輸入,沒有輸出。

我假設這就是以下 python 腳本返回垃圾的原因:

import num_Dg

def func(x):
    return [x[0]**2,x[1],x[2]]

val = [0.2,0.1,0.1]

num_Dg.num_dg(func,val)

我應該如何更改我的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM