fortran和python_python调用fortran
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 王磊 于 2016-12-13 10:49 编辑
python调用fortran主要目的是节省时间同时利用一下已有的fortran程序,本人对fortran熟悉一些,对python算不上入门,仅仅是对其感兴趣。看到对f2py功能的介绍,便想尝试其对fortran的调用,故写此贴,便于以后查阅,也便于和需要的朋友分享交流。不得不说如果涉及到单个点的循环操作,最好不要用python的for循环,而是考虑用其内部函数,这会节省很多时间。尽管如此,还是赞叹python的字典功能的灵活性,对错误等的处理功能。
python调用python要点总结
(1)f2py将fortran子程序编译链接为动(静态)态库。
(2)python调用fortran需要写好接口,关键点包括:
(a)数据类型,numpy默认的数据类型为float64也就是双精度浮点数,所以fortran里的浮点数也必须是双精度的,需要声明为real*8,默认的real是单精度的,不会报错但是会造成内存溢出!
(b)加intent(out)之后会把python对应函数中的相应变量隐藏,也就是不需要输入了!例如fortran中的函数为subroutingfoo(a,n)
给n维数组a加了intent(out)之后,表示它只是输出,不接受输入数据。于是在python中调用时,只需要指定维数n就可以了,即:foo(n)。注意:接口中的虚参,不能存在intent(inout)属性,因为python不认可,如果一个虚参具备intent(inout)属性,则会报如下错:“ValueError:failed to initialize intent(inout) array -- input not fortran contiguous --input 'l' not compatible to 'd'”
(c)一般在使用fortran的时候需要注意二维数组的行列关系的问题,即是说fortran里面的数组是先填充一列、再填充一行,而python数组遵循C语法规范、先填充一行,在天聪一列,不过貌似利用f2py进行传递时,已经进行过智能转换,所以不需要管这个,按照相同的方式使用就行。
(d)需要注意的是,在进行调用的时候,intent(in)的变量(输入变量)里,跟维数有关的变量必须放置在最后。比如我的函数命名为:f(a,b,c,d,n)这里面a、b、c、d都是普通的变量或数组之类的,但是n必须是一个跟维数有关的变量,用来在fortran程序里定义数组时使用。上面这条里所说的跟维数有关的变量必须放在最后,适用于n也是一个用来传递的变量的情况下。即是说你在使用时希望将维数信息用变量n来进行传递时,那么就得把它放在最后。再换句话说,n就是intent(in)的情况。 如果数组维长放在了最前面,可能出现的一个错误是:
“(shape(u,0)==m)failed for 1st keyword m: vector2:m=0”。
遵循上述几点,大致可以保证程序无误。
参考链接如下:
http://blog.sciencenet.cn/blog-350278-628083.html
http://www.jb51.net/article/82121.htm
下面是自己编写的一个测试程序,仅供参考。意思到位了,但还不够简洁。
(1)fortran程序如下,foo.f90文件内容
subroutine hello(a,b,c,d,e,f)
implicit none
integer,intent(in):: a,b,c,d,e,f
write(*,*) a,b,c,d,e,f
end subroutine hello
subroutine vector(u,v,vec,m,n)
implicit none
integer,intent(in) :: m, n
real(8),intent(in) :: u(m,n),v(m,n)
real(8),intent(out) :: vec(m,n) !输出参数,python中不需要出现
integer i
vec=sqrt(u*u+v*v)
do i=1,3
write(*,*) "i=",i
write(*,*) u(i,:5)
write(*,*) v(i,:5)
end do
return
end subroutine vector
(2)python程序如下,python.py文件内容。
import numpy as N
def good_magnitudes(u, v,minmag=0.1):
shape_input = N.shape(u)
output = N.zeros(shape_input,dtype=u.dtype.char)
for i in xrange(shape_input[0]):
for j in xrange(shape_input[1]):
mag = ((u[i,j]**2) + (v[i,j]**2))**0.5 #千万不要写for循环,慢的舍生忘死了
if mag >minmag:
output[i,j] = mag
else:
output[i,j] = minmag
return output
def faster_good_magnitudes(u, v, minmag=0.1):
mag = ((u**2) + (v**2))**0.5 #快很多哦
output = N.where(mag >minmag, mag, minmag)
return output
n=100000000
u=N.reshape(N.arange(n),(1000,n//1000))
v=N.reshape(N.arange(n),(1000,n//1000))
vec=N.reshape(N.arange(n),(1000,n//1000))
print u[0][:10]
print v[0][:10]
print u[1][:10]
print v[1][:10]
print u[2][:10]
print v[2][:10]
import foo #导入fortran子程序
import time
foo.hello(1,2,3,4,5,6) #参数的个数不受限制
begin_time0 = time.time()
foo.vector(u,v,1000,100000) #千万注意,维数长度的量,一定要放在最后面,当然你用变量存储维长也是可以的,也建议用变量存储
print time.time() -begin_time0
begin_time1 = time.time()
vect2=faster_good_magnitudes(u, v, minmag=0.1)
print time.time() -begin_time1
begin_time2 = time.time()
vect1=good_magnitudes(u, v, minmag=0.1)
print time.time() -begin_time2
(3)操作步骤:
f2py -m foo -c foo.f90
python python.py
(4)结果如下:
[0 1 2 3 4 5 6 7 8 9] 对应python中: print u[0][:10]
[0 1 2 3 4 5 6 7 8 9] 对应python中: print v[0][:10]
[100000 100001 100002 100003 100004 100005 100006 100007 100008 100009] 对应python中: print u[1][:10]
[100000 100001 100002 100003 100004 100005 100006 100007 100008 100009] 对应python中: print v[1][:10]
[200000 200001 200002 200003 200004 200005 200006 200007 200008 200009] 对应python中: print u[2][:10]
[200000 200001 200002 200003 200004 200005 200006 200007 200008 200009] 对应python中: print v[2][:10]
1 2 3 4 5 6
下面输出对应fortran中的:
do i=1,3
write(*,*) "i=",i
write(*,*) u(i,:5)
write(*,*) v(i,:5)
end do
i= 1
0.0000000000000000 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000
0.0000000000000000 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000
i= 2
100000.00000000000 100001.00000000000 100002.00000000000 100003.00000000000 100004.00000000000
100000.00000000000 100001.00000000000 100002.00000000000 100003.00000000000 100004.00000000000
i= 3
200000.00000000000 200001.00000000000 200002.00000000000 200003.00000000000 200004.00000000000
200000.00000000000 200001.00000000000 200002.00000000000 200003.00000000000 200004.00000000000
输出时间:
混合fortran片段:4.3228559494s
直接python:10.6145708561s单点for循环: 490s+
由此输出可以发现,使用相同的行列规则既可以正确的使用数据。同时,数据量小的时候,直接python程序即可(使用一些技巧提升速度),不需要混合调用,除非非得使用单次循环。
fortran和python_python调用fortran相关推荐
- oracle sql 调用自定义函数_PSCAD入门教程(第7节):怎样调用fortran编写的自定义函数?(附模型)...
PSCAD入门教程(第7节):怎样调用fortran编写的自定义函数?(附模型)mp.weixin.qq.com https://www.zhihu.com/video/12422083467175 ...
- f2py支持在fortran语言中调用其他Fortran函数或C代码或Python代码
f2py支持在fortran语言中调用其他Fortran函数或C代码或Python代码 分类: Python Numpy_Scipy fortran MinGW_GCC_Boost f2py 2012 ...
- C/C++调用Fortran的使用说明
C/C++调用Fortran的使用说明 [日期:2010-11-22] 来源:C/C++ 作者:C/C++ [字体:大 中 小] 这里将详细介绍一下在C++中如何调用用Fortran语言编写函数的问题 ...
- fortran的gui开发 python_python和fortran的接口
由于历史缘故,很多成熟的计算代码都是用fortran写成的.在python中调用fortran代码,要用到f2py这个程序.现在该项目已经合并到numpy中了,先安装python再装好numpy,就可 ...
- python fortran混合编程_python调用fortran模块
在python中调用fortran代码,要用到f2py这个程序.它的项目主页在此.现在该项目已经合并到numpy中了,先安装python再装好numpy,就可以使用f2py.不过对windows平台必 ...
- fortran 和 java_JNA实现Java调用Fortran
JNA实现Java调用Fortran 在成功实现Java调用C++之后,接下来想到能否通过JNA实现Java调用Fortran,今天试验了一下,还是比较容易的. 网上有一个Java调用F95的例子,但 ...
- 利用f2py实现python调用fortran
利用f2py实现python调用fortran 利用f2py实现python调用fortran 参考文献 引言 最快的直接使用方式 生成.pyf文件的使用方法 在fortran源码中加入注释的使用方式 ...
- windows下python利用f2py调用Fortran
目录 1.运行环境 2.测试实例 3.参考文章 Fortran(Formula Translation)是世界上第一个被正式推广使用的高级语言,其目前仍然是数值计算领域最重要的编程语言之一,虽然有ju ...
- Intel Visual Fortran Compiler 11调用lapack库实现并行多处理计算
Intel Visual Fortran Compiler 11调用lapack库实现并行多处理计算 采用fortran进行数值计算的朋友们都应该听说过大名鼎鼎的lapack库,我就不多做介绍了,在此 ...
最新文章
- AI一分钟|美团推出无人配送开放平台,有望提高配送效率;福特成立自动驾驶汽车公司,投资40亿美元...
- 计算机地质应用软件,中国地质大学《质软件应用》作业报告.doc
- 设置代理_ie浏览器一键取消自动检测设置并设置代理
- Java知多少(25)再谈Java包
- 打印5列五颗星_13个Excel快捷打印技巧,让你熟练掌握打印机操作
- 图解 Python 算法
- 用友U8常见问题之最大单据号修复语句
- 88se9230 linux raid,Gen10磁盘控制器Marvell 88SE9230阵列RAID设置方法教程图文
- spring authorization server授权服务器教程,资源服务器搭建接入认证服务器
- 怎么做超链接html,HTML怎么做超链接
- 《数字化决策》连载 | 七:探索并建立决策模型(3)
- Visual Studio NuGet程序包找不到源
- [蓝桥杯]蓝肽子序列(c++详解)
- 从一文中了解SSRF的各种绕过姿势及攻击思路
- odoo12 数据文件翻译
- 智慧教室打破了传统教室的局限性,由内到外充满“黑科技“
- 取出切词后词频高的词
- python实现excel的10个常用操作
- 条形码--JsBarcode(银联二维码用过)
- 天正怎么批量填充柱子_天正建筑最常用的几十个快捷键
热门文章
- 若腾网络大站协议邮件群发软件不换ip不用小号
- flutter - local_auth
- c/c艹常用类型数据范围
- 39-【什么叫规矩 什么叫体统】内置算法-遍历、搬运、查找
- 帕金森最新研究进展(2022年10月)
- patindex不存在 mysql_mysql中取字符串中的数字的语句
- R语言-模拟产生统计专业学生的成绩
- 【图像处理】PS 用彩图生成单色图
- 如何用python画出一般函数图_如何使用python的matplotlib画一元一次函数图像
- MindManager 2020 Win v20.1.238思维导图软件开心版安装教程