【发布时间】:2019-09-17 06:03:18
【问题描述】:
我正在使用f2py 为用fortran 编写的基于MPI 的库生成包装器。由于我使用的数组分区方案,在给定足够多的 MPI 进程的情况下,进程可能有一个长度为 0 的本地数组。这会在我有权访问的 Cray 系统上触发以下错误:
ValueError: failed to create intent(cache|hide)|optional array--
must have defined dimensions but got (0,)
我的桌面上没有收到相同的错误。这可能与我安装的 python 和 numpy 的版本有关。在我的桌面上它们是 numpy 版本 1.16.4 和 python 2.7.15+,在集群上它们是 numpy 1.13.3 和 python 2.7.14。由于我无法升级集群上的软件包,我想知道是否存在简单的解决方法。以下代码重现了错误:
文件'fortran_sub.f90':
subroutine sub(a_size, a)
integer, intent(in) :: a_size
real, dimension(a_size), intent(out) :: a
if (size(a) > 0) then
a = size(a)
endif
end subroutine sub
使用 f2py 封装编译如下:
python2 -m numpy.f2py -h --overwrite-signature fortran_sub.pyf -m
fortran_sub fortran_sub.f90
python2 -m numpy.f2py --f90exec="ftn" -c fortran_sub.pyf -m
fortran_sub fortran_sub.f90
生成的.pyf是:
! -*- f90 -*-
! Note: the context of this file is case sensitive.
python module fortran_sub ! in
interface ! in :fortran_sub
subroutine sub(a_size,a) ! in :fortran_sub:fortran_sub.f90
integer intent(in) :: a_size
real dimension(a_size),intent(out),depend(a_size) :: a
end subroutine sub
end interface
end python module fortran_sub
! This file was auto-generated with f2py (version:2).
! See http://cens.ioc.ee/projects/f2py2e/
使用 python2 pytest.py 运行以下 python 程序“pytest.py”:
import fortran_sub
a = fortran_sub.sub(2)
print(a)
a = fortran_sub.sub(1)
print(a)
a = fortran_sub.sub(0)
print(a)
我得到以下输出:
[ 2. 2.]
[ 1.]
Traceback (most recent call last):
File "pytest.py", line 11, in <module>
a = fortran_sub.sub(0)
ValueError: failed to create intent(cache|hide)|optional array-- must have defined dimensions but got (0,)
【问题讨论】: