3

这是我的第一个问题,所以对我好一点。

我正在使用 numpy 1.6.1 中的 f2py。我有一个包含几个子例程的 fortran 模块,这些子例程可以很好地编译(和工作)。但是,其中之一使用 erf(x) 函数,它是 GNU 扩展。对于我的目的来说它不够准确,所以我正在尝试使用外部 erf 实现。

我正在尝试使用 fortran 77 中的 Numerical Recipes 中的一个 - 我已将所有相关函数复制到一个名为“erf.f”的文件中,该文件与我的模块位于同一文件夹中。我include 'erf.f'在模块文件的顶部使用。我将 erf 函数的实际名称更改为“derf”,因此它不会与 gfortran erf 扩展名发生冲突。

但是,当我尝试通过 f2py 编译时,foo'erf.f' 中的每个函数都会出现错误

错误:“foo”的重新定义错误:“foo”的先前定义在这里

当我查看提到包含重新定义和先前定义的 c 文件时,似乎该函数确实存在两次。我只是不知道为什么?

有人知道如何解决这个问题吗?干杯。

编辑:我没有提到(因为我认为这是不必要的额外信息)numpy distutils 正在使用 f2py 来创建扩展。我现在提到它的原因是我发现我可以使用 很好地创建扩展f2py -c my_module.f90 -m mod,但是在运行时python setup.py install我得到了上面详述的错误。那么 f2py 在通过 distutils 运行时有什么不同呢?

编辑#2:如果我将外部 erf 函数文件的所有内容放入与我的模块相同的文件中,那么一切正常。我真的不想这样做,因为展望未来,我将拥有一个巨大的文件,但它现在可以工作,直到我得到这个问题的答案。

4

1 回答 1

0

一种解决方案是创建一个模块并使用(或任何名称)erf.f90将其导入您的主代码中。use erf

我在f2py导入以.f扩展名命名的模块时遇到了一些奇怪的问题,您可以通过重命名erf.ferf.f90指定-ffixed-form何时使用gfortran.

编辑:

如果使用 导入模块use,则不需要同时使用include. include基本上是在你的主代码的源代码中包含实际的代码(尽管你注意到,它的行为与直接输入主文件erf.f的行为并不完全相同),同时告诉编译器寻找一个预编译的模块。erf.fuse

我发现use在使用模块和f2py. (我的代码基本上是固定形式的 Fortran 90)。假设有一个 main 文件main.f和一个模块subs.f90(确保有module...end modulein subs.f90,我将使用以下序列进行编译:

gfortran -ffixed-form -c subs.f90
f2py.py -c -m main -I/path/to/subs /path/to/subs/subs.f90 main.f

请注意,您可能需要f2py根据您的系统指定其他选项。对我来说,在 Windows 上使用 MinGW,我需要--compiler=mingw32,因为f2py否则似乎无法找到 C 编译器。

于 2012-06-25T17:48:42.520 回答