我正在尝试使用此代码中的f2py为Fortran函数创建一个包装器:http://arxiv.org/e-print/1601.07458v1。 它来自一篇关于降低密度矩阵的论文,(http://arxiv.org/abs/1601.07458v1,并且在fortran中运行它时代码工作正常。
现在尝试在Fortran文件上创建一个包含f2py的包装器" partial_trace.f90",结果
/tmp/tmpBwIuHh/src.linux-x86_64-2.7/partial_tracemodule.c:325:15: error: invalid type argument of unary ‘*’ (have ‘int’)
w_Dims[0]=2**nqb;
^
我对Fortran和C都不熟悉,并且无法在谷歌上找到解决方案。可能是错误的原因是什么?我怀疑它是使用Fortran派生类型的,但我对它不太确定。
任何提示都将不胜感激!
编辑: - fortran代码(tar档案):arxiv.org/e-print/1601.07458v1 - 我运行的命令:f2py -c partial_trace.f90 -m partial_trace - 其输出:pastebin.com/g7QNnaCR
答案 0 :(得分:1)
f2py
似乎有一个错误。它没有翻译
权力正确。
您可以先创建c文件来解决此问题(不要使用-c
标志
f2py)和改变
W_Dims[0]=2**nqb;
到
W_Dims[0]=1<<nqb;
手动编译源代码。
您还可以使用The most efficient way to implement an integer based power function pow(int, int)中的ipow
函数
并使用
W_Dims[0]=ipow(2,nqb);
答案 1 :(得分:0)
Numpy中的问题发生在数组维度声明中使用幂运算符时。这是Minimal, Complete, and Verifiable example
subroutine s(n, a)
integer :: n, a(1:2**n)
end
基本上,您删除(或注释)不需要的行,直到您停止收到错误。这就是为什么没有必要包括所有300行代码,但1个子程序就足够了。即使原始形式的子程序也可以,它很小。
作为一种解决方法,可以显式传递数组维度:
subroutine s(n, na, a)
integer :: n, na, a(1:na)
end
或使用假定的形状数组:
subroutine s(n, a)
integer :: n, a(1:)
end
但要小心,这需要一个明确的接口(模块)。
如果使用幂运算符进行正常计算,则可以。我在https://github.com/numpy/numpy/issues/7184
报告了这个问题