f2py:一元'*'的无效类型参数

时间:2016-02-02 14:56:28

标签: python fortran fortran90 f2py

我正在尝试使用此代码中的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

2 个答案:

答案 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

报告了这个问题