2

Fortran モジュールでグローバル定数を操作しているときに、f2py の奇妙な動作を発見しました。

次のようなファイルtest.f90があるとしましょう

module test1
  real, parameter :: a = 12345.
end module test1

module test2
  real*8, parameter :: a = 6789.
end module test2

これを f2py でラップすると、

f2py -c -m mymod test.f90

そして走っている

python -c "import mymod as m; print m.test1.a; print m.test2.a"

私は得る

12345.0
6789.0

これはあなたが期待するものです。real ステートメントと real*8 ステートメントはどちらも同じように動作します。

私の実際のプロジェクトでは、倍精度の明示的な使用を指定して、コンパイラ フラグを使用して Fortran コードをコンパイルする必要があります。Fortran では、これで問題なく動作します。上記のコードを次のようにコンパイルすると

f2py --f90flags="-fdefault-double-8 -fdefault-integer-8 -fdefault-real-8" -c -m mymod test.f90

私は結果として得ます

python -c "import mymod as m; print m.test1.a; print m.test2.a"

0.0
6789.0

これは実際には奇妙です。最初のケースではグローバル変数は初期化されず、値はゼロです。これはバグですか、それとも f2py で倍精度の明示的な処理を指定する別の方法がありますか?

4

2 に答える 2

0

これまでの回避策を見つけました。問題は、適切な倍精度コンパイラ フラグが提供されている場合に、f2pyが Fortranrealを C 型にマップする必要があることを認識しないことです。double

解決策は、異なるデータ型のマッピングを行う方法を f2py に明示的に伝えることです。.f2py_f2cmapこれは、データ型マッピングを指定する python 辞書を含むファイルを作成することで実現できます。詳しくはこちらをご覧ください

私の場合、次のエントリで問題が解決しました

{'real':{'':'double'},'integer':{'':'long'},'real*8':{'':'double'}}

于 2013-06-14T05:59:47.423 に答える