Py学习  »  Python

【f2py】详解python调用Fortran子程序

happy科研 • 2 年前 • 362 次点击  

点击上方 蓝字关注我们



感谢北京超算刘工分享的编程经验


可以在python中调用现有的Fortran程序,用于提高计算效率。只需要在源码中添加注释形式的说明,不影响原始代码。下面来看一个具体的实例:


fortran源码


module  interpo    implicit none    contains        ! 第一个子程序    subroutine addsub(outdata,data1,data2)      implicit none      integer :: outdata,data1,data2
!f2py integer, intent(out):: outdata !f2py integer, intent(in):: data1,data2
outdata=data1+data2 end
! 第二个子程序 subroutine multisub(output,input,m,n) implicit none integer :: m,n real(8), dimension(m,n) :: input, output
!f2py integer, optional, depend(input):: m=shape(input,0) !f2py integer, optional, depend(input):: n=shape(input,1) !f2py real(8), intent(in):: input(m,n) !f2py real(8), intent(out):: output(m,n) output=input*10. endend


编译


f2py -m inter -c inter.f90  (使用gfortran编译)f2py --verbose --fcompiler=intelem -c -m inter inter.f90 (使用ifort编译)

会生成inter.cpython-37m-x86_64-linux-gnu.so动态库,python直接调用就行


python代码


import interimport numpy as np 
# 测试第一个子程序out1=inter.interpo.addsub(8,3)print(out1)
# 测试第二个子程序inp2 = np.random.rand(3,3)out2=inter.interpo.multisub(inp2)print(out2)


输出结果


说明


第一个子程序有三个参数,其中一个输出,两个输入

!f2py integer, intent(out):: outdata!f2py integer, intent(in):: data1,data2

我们在 python中调用的时候,只需要给出输入变量即可


第二个子程序有四个参数,一个输入数组,一个输出数组,还有两个参数表示维度信息

!f2py integer, optional, depend(input):: m=shape(input,0)!f2py integer, optional, depend(input):: n=shape(input,1) !f2py real(8), intent(in):: input(m,n)!f2py real(8), intent(out):: output(m,n)

python脚本中,我们只需要传递输入数组,输出变量和第一个子程序类似,不需要传递,维度信息m和n可以通过输入数组获取,也不需要传递。


总结


1.通过编译器将fortran程序编译成动态库或者静态库

2.在fortran中通过!f2py定义变量输入输出类型

3.f2py在编译时候如果需要链接多个库,可直接使用-L/dir/ -lib编译




往期推荐


NCL函数扩展:调用fortran子程序


点我写留言


点个在看你最好看

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/123245
 
362 次点击