f2py:预先分配数组作为Fortran子程序的输入

2024-06-28 10:58:29 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我想在python中调用的Fortran子例程中的一个最小化的片段。任务很简单。第一次调用代码时,值被分配给数组的第一个条目iwk。然后第二次调用子例程,预期的行为是指定的条目不变。在

subroutine testf2py (md,iwk,ndp,nip)

  implicit none

  integer ndp
!f2py intent(in) :: ndp
  integer nip
!f2py intent(in) :: nip
  integer iwk(31*ndp + nip)
!f2py intent(in) :: iwk     
  integer md
!f2py intent(in) :: md

  if ( md == 1 ) then
    iwk(1) = ndp
  end if  

  print*, iwk(1)

end

(第一次呼叫:md=1,后续呼叫:md>;1)。数组iwk应该在python中分配,并且数组中的值应该在调用之间保持不变。在Fortran中调用此函数可以毫无问题地工作:

^{pr2}$

两个调用的输出:

10
10

在python中,用f2py编译子例程后,它不起作用。iwk中的值发生变化:

import testf2py
import numpy as np

ndp = 10
nip = 10

iwk = np.empty([31*ndp+nip,], dtype=int, order='F')

testf2py.test(1, iwk, ndp, nip)
testf2py.test(2, iwk, ndp, nip)

两个调用的输出:

10
1686728152   

第二个数字是随机的。在

我尝试在python中以不同的方式进行分配,np.空的, np.零. 没有帮助。我假设问题在于如何分配iwk数组(因此是问题标题),但不确定。我需要做些什么才能让它生效?最好只更改python脚本,并保留Fortran代码。在


Tags: 代码innp条目integer数组例程md
1条回答
网友
1楼 · 发布于 2024-06-28 10:58:29

告诉python数组是intent(in)

  integer iwk(31*ndp + nip)
!f2py intent(in) :: iwk  

不允许您更改它,并希望更改将被保留。可能你想要intent(inout)。在

更好的是,忘记!f2py intent直接使用:

^{pr2}$

如果你试图修改一个intent(in)变量,编译器会告诉你你错了。在

注意在Python中使用正确的dtype,它必须与Fortran类型相对应。通常Fortran integer等同于int32,但有时它可能是{}。你也可以在Fortran中控制它(integer*4integer(int32),…)。在

相关问题 更多 >