我的最终目标是获取我编写的许多不同的Fortran脚本并通过Python进行连接。脚本本身相对简单:基本上,只是大量的数学,没有任何编程结构比数组更复杂。但是,我对此很陌生,所以我有一个小测试脚本,我正在尝试它。
主要脚本如下(缩写形式):
subroutine addwake
use geometry
implicit none
integer::i,j,k,m
real(kind=8),allocatable::xn2(:,:),yn2(:,:),zn2(:,:)
real(kind=8)::avg,m1,m2,m0
character(50)::namefile
!f2py intent(out) i,j,k,m
!f2py intent(out),allocatable xn2,yn2,zn2
!f2py intent(out) avg,m1,m2,m0
!f2py intout(out) namefile
! Check if surface node arrays are allocated
if(allocated(xn))then
deallocate(xn,yn,zn)
end if
! Read in sectional point distribution
...
end subroutine addwake
这利用了一个模块(geometry.f95),这是我悲伤的源头。
module geometry
implicit none
! panel coordinates and connectivity
integer::jmax,kmax
integer::npts_wake
real(kind=8)::dspan
real(kind=8),allocatable::xn(:,:),yn(:,:),zn(:,:)
!f2py intent(out) jmax,kmax,npts_wake
!f2py intent(out) dspan
!f2py intent(out),allocatable xn,yn,zn
end module geometry
我直接通过f2py -c -m wake geometry.f95 addwake.f95
编译代码,然后进入Python解释器运行它。它运行正常,给我预期的输出(带有有序的数字列表的文本文件),但后来我尝试提取变量值,这是我在集成框架中需要做的事情。当我尝试时,我得到以下结果:
>>> print wake.geometry.xn
[[ 2.01331785 2.01331785 2.01331785 2.01331785 2.01331785]
[ 2.00308232 2.00308232 2.00308232 2.00308232 2.00308232]
[ 1.99284679 1.99284679 1.99284679 1.99284679 1.99284679]
...,
[ 0.979798 0.979798 0.979798 0.979798 0.979798 ]
[ 0.989899 0.989899 0.989899 0.989899 0.989899 ]
[ 1. 1. 1. 1. 1. ]]
>>> print wake.geometry.yn
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: yn
>>> print wake.geometry.zn
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: zn
如果我更改geometry.f95中的f2py声明,使得每个变量都在其自己的行上定义,则会得到所有三个变量的属性错误。我在这里很难过,所以有什么想法吗?
答案 0 :(得分:0)
好吧,这并没有为为什么发布的内容提供任何解释,但它确实提供了一个临时解决方案。如果我只是省略geometry.f95(模块)中可分配变量的f2py声明,那么一切都是hunky dory。换句话说:
module geometry
implicit none
! panel coordinates and connectivity
integer::jmax,kmax
integer::npts_wake
real(kind=8)::dspan
real(kind=8),allocatable::xn(:,:),yn(:,:),zn(:,:)
!f2py intent(out) jmax,kmax,npts_wake
!f2py intent(out) dspan
end module geometry
...使我能够使用解释器来提取所有三个矩阵的值。在试图拉取其他变量(jmax,kmax等)的值时,我却没有成功。关于这些变量声明的东西显然混淆了作品,我不知道为什么。