社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

happy科研 • 3 年前 • 543 次点击  

点击上方 蓝字关注我们



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


可以在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
 
543 次点击