gpt4 book ai didi

python - 从 python 将变量传递给 Fortran 会导致错误的值

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:58 32 4
gpt4 key购买 nike

基于此minimal example ,我想用 Python 和 Fortran 子例程操作 Fortran 模块的变量。请看下面的例子:

vars.f90

module vars
implicit none
real(kind=selected_real_kind(p=15)) :: fk(10)
end module vars

sub.f90

subroutine sub
use vars
print *, "sub: fk(1) = ", fk(1)
print *, "adding 1 to fk(1)"
fk(1) = fk(1) + 1
print *, "fk(1) = ", fk(1)
end

mytest.f90

include "vars.f90"
include "sub.f90"

编译是通过以下命令和 gfortran 完成的:

f2py -c -m mytest mytest.f90

最后,这是在 Python 3.6.5 控制台中重现问题的测试用例:

>>> import mytest
>>> mytest.vars.fk[1]
0.0
>>> mytest.vars.fk[1]=1.5000
>>> mytest.vars.fk[1]
1.5
>>> mytest.sub()
sub: fk(1) = 0.12500000000000000
adding 1 to fk(1)
fk(1) = 1.1250000000000000
>>> mytest.vars.fk[1]
1.890625
>>>

在我看来,fk(1)最终应该是2.5。但不幸的是,尽管通过 python 控制台直接访问变量显示了正确的值,但 Fortran 错误地读取了子例程中的变量。修改变量后,python 控制台也显示错误的数字。

有任何建议或提议来解决/解释这种行为吗?感谢您的帮助!谢谢你!

P.S.:起初我认为这取决于 Python 和 Fortran 处理数组的方式不同(Python 从索引 0 开始,而 Fortran 从索引 1 开始),但这不是错误。 mytest.vars.fk[0] 在调用子程序后没有被修改(初始值 0.0)。

最佳答案

代码有两个问题:

  1. 索引问题,您已注意到。您仍然需要在 Python 中访问 fk[0] 以获得所需的行为。

  2. 使用 selected_real_kind(p=15) 进行种类规范。查看FAQ of F2PY和这个相关的SO answer .

目前,f2py 将您的 varibale 视为默认实数变量(此处为 32 位)而不是 double 。您可以通过创建一个包含以下内容的文件 .f2py_f2cmap(在当前工作目录中)来修复它:

{'real':{'selected_real_kind(p=15)': 'double'}}

这将为您的参数选择“double”作为相应的 C 类型。不幸的是,F2PY 无法检测现代 Fortran 类型。

我将此标记为 f2py: Specifying real precision in fortran when interfacing with python? 的副本但这里也有索引问题。让我们看看其他人的想法。

关于python - 从 python 将变量传递给 Fortran 会导致错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53151686/

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