3

これは私の最初の質問です。

numpy 1.6.1 から f2py を使用しています。私は、問題なくコンパイル (および動作) するいくつかのサブルーチンを含む fortran モジュールを持っています。ただし、そのうちの 1 つは GNU 拡張である erf(x) 関数を使用します。私の目的には十分な精度ではないため、外部の erf 実装を使用しようとしています。

Fortran 77 の Numerical Recipes の 1 つを使用しようとしています。関連するすべての関数を、モジュールと同じフォルダーにある 'erf.f' という 1 つのファイルにコピーしました。include 'erf.f'モジュールファイルの先頭で使用します。erf 関数の実際の名前を「derf」に変更したので、gfortran erf 拡張機能と競合しません。

ただし、f2py 経由でコンパイルしようとするとfoo、「erf.f」内のすべての関数にエラーが表示されます。

エラー: 'foo' の再定義 エラー: 'foo' の以前の定義がここにありました

再定義と以前の定義を含むと言及されているcファイルを見ると、関数が2回あるようです。理由がわからないだけですか?

これを修正する方法を知っている人はいますか?乾杯。

編集: f2py が拡張機能を作成するために numpy distutils によって使用されていることについて言及しませんでした (不要な追加情報だと思ったので)。ここで言及する理由は、拡張機能を で問題なく作成できることがわかったからですf2py -c my_module.f90 -m modが、実行するpython setup.py installと上記で詳述したエラーが発生します。では、f2py は distutils を介して実行すると何が違うのでしょうか?

編集 #2: 外部 erf 関数ファイルのすべての内容をモジュールと同じファイルに入れると、すべてが機能します。私は本当にこれをしたくありません。将来的にはファイルの怪物が現れるからです。しかし、この質問に対する答えが得られるまでは、今のところうまくいきます。

4

1 に答える 1

0

1 つの解決策は、モジュールを作成し、(またはその名前が何であれ)erf.f90を使用してメイン コードにインポートすることです。use erf

拡張子を付けて名前を付けたモジュールをf2pyインポートする際に奇妙な問題が発生しました。.ferf.ferf.f90-ffixed-formgfortran

編集:

を使用してモジュールをインポートする場合use、 も使用する必要はありませんincludeinclude基本的には、メイン コードのソースに の実際のコードを含めます (ただし、お気づきのように、メイン ファイルに直接erf.f入力するのとまったく同じように動作するわけではありません) 一方で、コンパイル済みのモジュールを探すようにコンパイラに指示します。erf.fuse

useモジュールとf2py. (私のコードは基本的に固定形式の Fortran 90 です)。メイン ファイルmain.fとモジュールsubs.f90( にあることを確認してください)module...end moduleを想定すると、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 では、C コンパイラを見つけることができないように見える--compiler=mingw32ので、必要です。f2py

于 2012-06-25T17:48:42.520 に答える