2017-06-22 6 views
1

f2pyを使用してFortranモジュールをコンパイルしようとしています。それは私が次のコマンドインターフェイスでf2pyを使用してモジュールをコンパイルする

f2py.py -c -m my_log_mod_comp my_log_mod.f90 

でコンパイルする次のコード

module my_log_mod 

    implicit none 

    interface my_log 
     module procedure my_log_array 
     module procedure my_log_vector 
    end interface my_log 

    private ! hides items not listed on public statement 
    public :: my_log 


contains 

    subroutine my_log_array(a,res) 
     double precision, dimension (:,:), intent (in) :: a 
     double precision, dimension (:,:), intent (out) :: res 

     where (a>1.0) 
      res = log(a) 
     else where 
      res = 0.D0 
     end where 
    end subroutine 

    subroutine my_log_vector(a,res) 
     double precision, dimension (:), intent (in) :: a 
     double precision, dimension (:), intent (out) :: res 

     where (a>1.0) 
      res = log(a) 
     else where 
      res = 0.D0 
     end where 
    end subroutine 

end module my_log_mod 

であり、それは私が本当にFORTRANについて多くを知らない

C:\Users\weisshau\AppData\Local\Temp\tmpf0apqa7s\src.win32-3.6\my_log_mod_comp-f2pywrappers2.f90:7:28: 

     use my_log_mod, only : my_log_array 
          1 
Error: Symbol 'my_log_array' referenced at (1) not found in module 'my_log_mod' 
C:\Users\weisshau\AppData\Local\Temp\tmpf0apqa7s\src.win32-3.6\my_log_mod_comp-f2pywrappers2.f90:18:28: 

     use my_log_mod, only : my_log_vector 
          1 
Error: Symbol 'my_log_vector' referenced at (1) not found in module 'my_log_mod' 

次のエラーをもたらし、 f2pyなので、何が起こっているのか分かりません。私が純粋なfortranでモジュールを使用するとうまく動作します

答えて

2

F2pyはモジュール内のサブルーチンを使用する別のラッパーコードを作成しているようです。

しかし、それはサブルーチンmy_log_vectormy_log_arrayを直接呼び出します。 f2pyはprivateをサポートしていないようです。私はprivateを削除します。

また、汎用のmy_logをPythonで使用することはできません。このジェネリックの概念はPythonにはありません。 privateを削除してもコンパイルできない場合は、汎用インターフェースを削除する必要があります。 public :: my_logは間違いなく削除する必要があります。

残念ながら、f2pyは現代のFortranのすべての機能をサポートしていません。

私がテストコード:

module my_log_mod 

    implicit none 

    interface my_log 
     module procedure my_log_array 
     module procedure my_log_vector 
    end interface my_log 

contains 

    subroutine my_log_array(a,res) 
     double precision, dimension (:,:), intent (in) :: a 
     double precision, dimension (:,:), intent (out) :: res 

     where (a>1.0) 
      res = log(a) 
     else where 
      res = 0.D0 
     end where 
    end subroutine 

    subroutine my_log_vector(a,res) 
     double precision, dimension (:), intent (in) :: a 
     double precision, dimension (:), intent (out) :: res 

     where (a>1.0) 
      res = log(a) 
     else where 
      res = 0.D0 
     end where 
    end subroutine 

end module my_log_mod 

コンパイル:あなたの答えのための

f2py -c -m my_log_mod_comp my_log_mod.f90 

... 

Post-processing... 
     Block: my_log_mod_comp 
         Block: my_log_mod 
           Block: my_log 
           Block: my_log_array 
           Block: my_log_vector 
Post-processing (stage 2)... 
     Block: my_log_mod_comp 
       Block: unknown_interface 
         Block: my_log_mod 
           Block: my_log_array 
           Block: my_log_vector 
Building modules... 
     Building module "my_log_mod_comp"... 
       Constructing F90 module support for "my_log_mod"... 
       Creating wrapper for Fortran subroutine "my_log_array" 
         res = my_log_array(a) 
          res = my_log_array(a) 
       Creating wrapper for Fortran subroutine "my_log_vector"("my_log_vector")... 
         Constructing wrapper function "my_log_mod.my_log_vector"... 
          res = my_log_vector(a) 
     Wrote C/API module "my_log_mod_comp" to file "/tmp/tmp7e5v0u/src.linux-x86_64-2.7/my_log_mod_compmodule.c" 
     Fortran 90 wrappers are saved to "/tmp/tmp7e5v0u/src.linux-x86_64-2.7/my_log_mod_comp-f2pywrappers2.f90" 

... 

gfortran:f90: /tmp/tmp7e5v0u/src.linux-x86_64-2.7/my_log_mod_comp-f2pywrappers2.f90 
/usr/bin/gfortran -Wall -g -Wall -g -shared /tmp/tmp7e5v0u/tmp/tmp7e5v0u/src.linux-x86_64-2.7/my_log_mod_compmodule.o /tmp/tmp7e5v0u/tmp/tmp7e5v0u/src.linux-x86_64-2.7/fortranobject.o /tmp/tmp7e5v0u/my_log_mod.o /tmp/tmp7e5v0u/tmp/tmp7e5v0u/src.linux-x86_64-2.7/my_log_mod_comp-f2pywrappers2.o -L/usr/lib64 -lpython2.7 -lgfortran -o ./my_log_mod_comp.so 
Removing build directory /tmp/tmp7e5v0u 
+0

おかげで多くのことを。私は両方のあなたの提案を試みたが、それはまだ動作しません。たぶん私は私の質問を拡大する必要があります: "入力と出力として任意の配列を取り、f2pyで使用するfortranサブルーチンを書くにはどうすればいいですか" – Jannick

+0

私のコンピュータで動作します。あなたが提供したコードで少なくとも。説明してください*動作しません。この句は何も言わない。どういう意味ですか? –

+0

* "入力と出力として任意の配列をとり、f2pyで使用するFortranサブルーチンを書くにはどうすればいいですか?"それが私の答えにしていたポイントです。 –

関連する問題