点击上方 蓝字关注我们
感谢北京超算刘工分享的编程经验
可以在python中调用现有的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.
end
end
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直接调用就行
import inter
import 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中调用的时候,只需要给出输入变量即可
第二个子程序有四个参数,一个输入数组,一个输出数组,还有两个参数表示维度信息
python脚本中,我们只需要传递输入数组,输出变量和第一个子程序类似,不需要传递,维度信息m和n可以通过输入数组获取,也不需要传递。
1.通过编译器将fortran程序编译成动态库或者静态库
2.在fortran中通过!f2py定义变量输入输出类型
3.f2py在编译时候如果需要链接多个库,可直接使用-L/dir/ -lib编译
往期推荐
点我写留言