gpt4 book ai didi

python - f2py:预分配数组作为 Fortran 子例程的输入

转载 作者:行者123 更新时间:2023-11-28 16:34:37 25 4
gpt4 key购买 nike

这是我想在 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 中调用此函数没有问题:

program main
implicit none
integer :: i, ndp, nip
integer, allocatable :: iwk(:)

ndp = 10
nip = 10

allocate(iwk(31*ndp+nip))

call test (1, iwk, ndp, nip)
call test (2, iwk, ndp, nip)

end program main

2 个调用的输出:

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)

2 个调用的输出:

10
1686728152

第二个数字是随机的。

我尝试以不同的方式在 Python 中进行分配,np.empty_like、np.zeros。没有帮助。我认为问题在于如何分配 iwk 数组(因此问题标题),但不确定。我必须改变什么才能让它发挥作用?最好,我只想更改 python 脚本并保留 Fortran 代码。

最佳答案

你告诉 python 这个数组是 intent(in):

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

您无权更改它并期望更改将被保留。可能您需要 intent(inout)

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

  integer, intent(inout) :: iwk(31*ndp + nip)

如果您尝试修改 intent(in) 变量,编译器会告诉您您错了。

注意在Python中使用正确的dtype,它必须对应于Fortran类型。大多数情况下,Fortran integer 等同于 int32,但有时可能是 int64。您也可以在 Fortran 中控制它(integer*4integer(int32)、...)。

关于python - f2py:预分配数组作为 Fortran 子例程的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28194358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com