Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 使用f2py和接口编译模块_Fortran_F2py - Fatal编程技术网

Fortran 使用f2py和接口编译模块

Fortran 使用f2py和接口编译模块,fortran,f2py,Fortran,F2py,我正在尝试用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 private ! hides items not listed on public statement

我正在尝试用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

   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   
我用下面的命令编译

f2py.py -c -m my_log_mod_comp my_log_mod.f90
它会导致以下错误

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'

我对fortran和f2py不太了解,所以我不知道发生了什么。如果我在纯fortran中使用该模块,它工作得很好

F2py似乎正在创建另一个使用模块中的子例程的包装器代码

但是它直接调用子例程
my\u log\u vector
my\u log\u array
。f2py似乎不支持
private
。我会删除
私有

还要准备好,您将无法在Python中使用通用的
my_log
。泛型的这一概念与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

非常感谢你的回答。我尝试了你的两个建议,但仍然不起作用。也许我应该把我的问题扩大到:“我如何编写一个fortran子程序,将任意数组作为输入和输出,并与f2py一起使用?”它在我的计算机上工作。至少使用您提供的代码。解释它不起作用。这句话没有任何意义。你是什么意思?“我如何编写一个fortran子程序,将任意数组作为输入和输出,并将其与f2py一起使用?”你不知道。这就是我在回答中的要点。我尝试删除接口块后的两行,并同时删除接口块,但总是失败,错误与我的问题相同。第二点:知道这一点很好,但这不是f2py的一个很大的缺点吗?您可以在Python中为这两者创建一个包装器。Python使用duck类型,Fortran使用带有特定子例程的泛型。这两种方法不兼容。可以想象f2py为您创建了这个包装器,但事实并非如此。我重复我的回答:不幸的是,f2py不支持现代Fortran的所有功能。