我正在使用f2py而且我很困难。我在fortran中有一个函数:
!f90
subroutine f( !args
implicit none;
double precision, dimension(N, 3):: fMatrix;
!f2py double precision, dimension(N,3), intent(out, c) :: fMatrix
!Stuff happens here
end subroutine force
我已经
了f2py -c -m moduleName file.f90
将其转换为python模块。它编译没有错误,python可以调用它。但是......可悲的是,它什么也没有回报。我认为使用
!f2py intent(out,c) fMatrix
应该将内存保存更改为python使用的类型并将fMatrix返回到python。但..
...
myf = fortranModule.f(args);
print myf
返回"无"。
我猜我做错了什么;我确实发现了一些关于fMatrix是N.3的事实,因此它确定返回类型有困难吗?
我尝试将意图(in)/ intent(out)添加到fortran变量声明中,但这在开始时提供了更多错误。但是,我刚刚再试一次; intent(in)声明正在工作,但intent(out)抛出:
double precision, dimension(N, 3), intent(out):: fMatrix;
Error: Symbol at (1) is not a DUMMY variable
我希望有人能给我答案, 提前谢谢!
答案 0 :(得分:0)
此刻有点希望;我想我修好了。你需要有类似的东西:
subroutine f(inputA, inputB, output)
并将输出声明为intent(out)。至少,当我这样做时,它突然开始打印矩阵; - )
所以我检查了docstring:
Return objects:
fmatrix : rank-2 array('d') with bounds (n,3)
右键!
谢谢,我与之交谈的看不见的人。
答案 1 :(得分:0)
我使用的是如下内容,我试图避免意图inout变量 因为我觉得它有时会被引用的东西混淆 相反,我在子程序本身中定义一个输出变量,它会自动返回
subroutine f(fMatrix,oMatrix,N)
implicit none;
integer,intent(in)::N
double precision,intent(in),dimension(N, 3):: fMatrix
double precision,intent(out),dimension(N, 3):: oMatrix
!do stuff here with fMatrix
!copy stuff to oMatrix using
oMatrix = fMatrix
end subroutine f
另存为“test.f90”,用
编译f2py --f90exec=gfortran -DF2PY_REPORT_ON_ARRAY_COPY=1 --noarch
--f90flags='-march=native' -m test -c test.f90
用
测试In [6]: import test
In [7]: fmatrix = np.random.random((2,3))
In [8]: fmatrix Out[8]: array([[ 0.19881303, 0.68857701,
0.90133757],
[ 0.92579141, 0.03823548, 0.98172467]])
In [9]: test.f(fmatrix) copied an array: size=6, elsize=8 Out[9]: array([[ 0.19881303, 0.68857701, 0.90133757],
[ 0.92579141, 0.03823548, 0.98172467]])