编译使用f2py返回数组的f90函数

时间:2016-10-16 22:00:47

标签: python arrays fortran f2py

我有一个子程序,它计算一个大型数组并将其写入文件。我正在尝试将其转换为返回该数组的函数。但是,我得到一个非常奇怪的错误,这似乎与我返回一个数组的事实有关。当我尝试返回一个浮动(作为测试)时,它完全正常。

这是MWE,我用py [HttpPost] public void Post([FromBody]String test) { } 调用它:

mwe('dir', 'postpfile', 150, 90.)

这很好用,并按预期打印:

FUNCTION mwe(dir, postpfile, nz, z_scale)
IMPLICIT NONE

INTEGER         :: nz
REAL(KIND=8)    :: z_scale
CHARACTER(len=100)      :: postpfile
CHARACTER(len=100)         :: dir
REAL(kind=8)  :: mwe

print*,'dir ', dir
print*,'postpfile ', postpfile
print*,'nz ', nz
print*,'Lz ', z_scale

mwe = 4.5d0
END FUNCTION mwe

但是,如果我将函数定义为数组:

 dir dir                                                                                                 
 postpfile postpfile                                                                                           
 nz          150
 Lz    90.000000000000000     

然后打印出来:

FUNCTION mwe(dir, postpfile, nz, z_scale)
IMPLICIT NONE

INTEGER         :: nz
REAL(KIND=8)    :: z_scale
CHARACTER(len=100)      :: postpfile
CHARACTER(len=100)         :: dir
REAL(KIND=8),DIMENSION (2,23)   :: mwe

print*,'dir ', dir
print*,'postpfile ', postpfile
print*,'nz ', nz
print*,'Lz ', z_scale

mwe = 4.5d0
END FUNCTION mwe

我正在运行f2py版本2,NumPy 1.11.1和Python 3.5.1。

修改

我正在使用 dir postpfile postpfile ��:����������k�� 2����V@(����H���;�!��v nz 0 Segmentation fault (core dumped) 进行编译,并使用f2py -c -m fmwe fmwe.f90调用该函数。

1 个答案:

答案 0 :(得分:1)

我认为问题来自缺乏显式接口的某个地方。 (不确定可能是其他人可以更准确地指出问题是什么。)

尽管我不确定我的解释,但我有2个工作案例。 将您的功能更改为子程序将您的功能放入模块(它自己生成显式接口)解决了您提到的问题。

下面的脚本仍然可以像python中的my_sub('dir', 'postpfile', 150, 90.)一样调用。

subroutine my_sub(mwe, dir, postpfile, nz, z_scale)
implicit none

integer,intent(in)             :: nz
real(KIND=8),intent(in)        :: z_scale
chracter(len=100),intent(in)   :: postpfile
character(len=100), intent(in) :: dir
real(KIND=8), intent(out)      :: mwe(2,23)

print*,'dir ', dir
print*,'postpfile ', postpfile
print*,'nz ', nz
print*,'Lz ', z_scale

mwe = 4.5d0
end subroutine my_sub

如果在模块中使用该函数,则需要以不同的方式从python进行调用; test('dir', 'postpfile', 150, 90.)

module test

contains 
function mwe(dir, postpfile, nz, z_scale)
implicit none

integer            :: nz
real(KIND=8)       :: z_scale
chracter           :: postpfile
character(len=100) :: dir
real(KIND=8)       :: mwe(2,23)

print*,'dir ', dir
print*,'postpfile ', postpfile
print*,'nz ', nz
print*,'Lz ', z_scale

mwe = 4.5d0
end function mwe

end module test

我没有尝试,但它可能适用于适当的Fortran interface,包括你的函数。(假设存在显式接口是关键)

我希望有人能完成/纠正我的答案。