登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

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相关推荐

  1. oracle sql 调用自定义函数_PSCAD入门教程(第7节):怎样调用fortran编写的自定义函数?(附模型)...

    PSCAD入门教程(第7节):怎样调用fortran编写的自定义函数?(附模型)​mp.weixin.qq.com https://www.zhihu.com/video/12422083467175 ...

  2. f2py支持在fortran语言中调用其他Fortran函数或C代码或Python代码

    f2py支持在fortran语言中调用其他Fortran函数或C代码或Python代码 分类: Python Numpy_Scipy fortran MinGW_GCC_Boost f2py 2012 ...

  3. C/C++调用Fortran的使用说明

    C/C++调用Fortran的使用说明 [日期:2010-11-22] 来源:C/C++ 作者:C/C++ [字体:大 中 小] 这里将详细介绍一下在C++中如何调用用Fortran语言编写函数的问题 ...

  4. fortran的gui开发 python_python和fortran的接口

    由于历史缘故,很多成熟的计算代码都是用fortran写成的.在python中调用fortran代码,要用到f2py这个程序.现在该项目已经合并到numpy中了,先安装python再装好numpy,就可 ...

  5. python fortran混合编程_python调用fortran模块

    在python中调用fortran代码,要用到f2py这个程序.它的项目主页在此.现在该项目已经合并到numpy中了,先安装python再装好numpy,就可以使用f2py.不过对windows平台必 ...

  6. fortran 和 java_JNA实现Java调用Fortran

    JNA实现Java调用Fortran 在成功实现Java调用C++之后,接下来想到能否通过JNA实现Java调用Fortran,今天试验了一下,还是比较容易的. 网上有一个Java调用F95的例子,但 ...

  7. 利用f2py实现python调用fortran

    利用f2py实现python调用fortran 利用f2py实现python调用fortran 参考文献 引言 最快的直接使用方式 生成.pyf文件的使用方法 在fortran源码中加入注释的使用方式 ...

  8. windows下python利用f2py调用Fortran

    目录 1.运行环境 2.测试实例 3.参考文章 Fortran(Formula Translation)是世界上第一个被正式推广使用的高级语言,其目前仍然是数值计算领域最重要的编程语言之一,虽然有ju ...

  9. Intel Visual Fortran Compiler 11调用lapack库实现并行多处理计算

    Intel Visual Fortran Compiler 11调用lapack库实现并行多处理计算 采用fortran进行数值计算的朋友们都应该听说过大名鼎鼎的lapack库,我就不多做介绍了,在此 ...

最新文章

  1. AI一分钟|美团推出无人配送开放平台,有望提高配送效率;福特成立自动驾驶汽车公司,投资40亿美元...
  2. 计算机地质应用软件,中国地质大学《质软件应用》作业报告.doc
  3. 设置代理_ie浏览器一键取消自动检测设置并设置代理
  4. Java知多少(25)再谈Java包
  5. 打印5列五颗星_13个Excel快捷打印技巧,让你熟练掌握打印机操作
  6. 图解 Python 算法
  7. 用友U8常见问题之最大单据号修复语句
  8. 88se9230 linux raid,Gen10磁盘控制器Marvell 88SE9230阵列RAID设置方法教程图文
  9. spring authorization server授权服务器教程,资源服务器搭建接入认证服务器
  10. 怎么做超链接html,HTML怎么做超链接
  11. 《数字化决策》连载 | 七:探索并建立决策模型(3)
  12. Visual Studio NuGet程序包找不到源
  13. [蓝桥杯]蓝肽子序列(c++详解)
  14. 从一文中了解SSRF的各种绕过姿势及攻击思路
  15. odoo12 数据文件翻译
  16. 智慧教室打破了传统教室的局限性,由内到外充满“黑科技“
  17. 取出切词后词频高的词
  18. python实现excel的10个常用操作
  19. 条形码--JsBarcode(银联二维码用过)
  20. 天正怎么批量填充柱子_天正建筑最常用的几十个快捷键

热门文章

  1. 若腾网络大站协议邮件群发软件不换ip不用小号
  2. flutter - local_auth
  3. c/c艹常用类型数据范围
  4. 39-【什么叫规矩 什么叫体统】内置算法-遍历、搬运、查找
  5. 帕金森最新研究进展(2022年10月)
  6. patindex不存在 mysql_mysql中取字符串中的数字的语句
  7. R语言-模拟产生统计专业学生的成绩
  8. 【图像处理】PS 用彩图生成单色图
  9. 如何用python画出一般函数图_如何使用python的matplotlib画一元一次函数图像
  10. MindManager 2020 Win v20.1.238思维导图软件开心版安装教程