爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 30092|回复: 15

[源代码] 【原创】f2py介绍以及从f2py引发的联想

[复制链接]

新浪微博达人勋

发表于 2012-3-18 22:59:33 | 显示全部楼层 |阅读模式

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

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

x
对于大气来说,python推广的一大瓶颈是计算性的code有限。比如计算旋度的, 计算散度的。很少有人会费心用python语言来写这些code。我们已经有大量的Fortran code来做这些事情了,为什么要浪费时间再用python重写呢?!

但我们有f2py!这几乎就把我们从崩溃的边缘给拯救出来了。因为这个python应用可以很迅速方便地把Fortran转换为python module。然后就可以方便地用import语句调用。

(f2py是open source的应用,你可以下载。EPD python带有这个应用)

做一个简单的例子,先是一个add.f
====== add.f ======
      SUBROUTINE ADD(A,B,C)
      IMPLICIT NONE
      DOUBLE PRECISION A,B,C
cf2py intent(in) :: A,B
cf2py intent(out) :: C
      C = A + B
      RETURN
      END
====== end =======

上面两行cf2py是f2py所需要的,对于.f来说,只是两行注释。

在命令行输入:
f2py -c -m add add.f
-c是建立.o object file, -m后面跟module名字。由于之前的add.f是subroutine,而f2py转换的对象是module,-m,f2py会封装subroutine。
文件夹里多了一个add.o的文件

进入python
进行如下操作
>>> import add
>>> print add.add(5,6)
11.0

到此,这个简单的Fortran程序就转换成了python的Module了。

可以看到,f2py的转换过程非常简单,再加上大量的Fortran库,我们就可以快速建立大量大气研究可用的module,由于是基于Fortran, 这些Module的运算速度可以非常迅速。而在此基础上,我们可以利用高层次的python平台,对module进行调用,建立一些高级的对象,让我们有更高的科研产出。python以及大量的open source库也就对我们开放了。

之前看到一篇讲把climate model移植到python上的文章。我想,那可能还有些遥远。就算实现,底层的运算也必然是C/C++/FORTRAN(效率更高,速度更快)。但在应用分析方面,python需要的,就是这样一些应用函数的转换。

欢迎大家拍砖。

评分

参与人数 1金钱 +12 贡献 +3 收起 理由
言深深 + 12 + 3 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-10-30 22:03:11 | 显示全部楼层
作为前段时间经常用f2py的人,我来说下感受。
1、我在我的Win7 64位下跑步起来f2py,查了下发现时EPD python的一个bug,尝试了多种方法,包括安装gfortran等等都无法解决。所以建议想要使用f2py的同学转移到linux环境下。 当然你在win下面能用起来当我没说。
2、f2py对fortran程序的编译也是按照你的fortran编译器来的,所以会有一些细微的区别。常见的比如intel编译器好通过、gfortran编译不好通过的问题也会出现(一般都是一些格式问题,其实没什么太大影响,改改就好了)
2、编译的时候是可以选择编译器的,在f2py命令里面加入compiler信息就可以实现,详情可以看看手册,有详细介绍。但是需要注意的是,f2py好像还不支持pgi编译器
3、需要注意的是,在进行调用的时候,intent(in)的变量里,跟维数有关的变量必须放置在最后。比如我的函数命名为:f(a,b,c,d,n)这里面a、b、c、d都是普通的变量或数组之类的,但是n必须是一个跟维数有关的变量,用来在fortran程序里定义数组时使用。
4、上面这条里所说的跟维数有关的变量必须放在最后,适用于n也是一个用来传递的变量的情况下。即是说你在使用时希望将维数信息用变量n来进行传递时,那么就得把它放在最后。再换句话说,n就是intent(in)的情况。
5、intent(out)的变量(注意这里限定为out,如果是inout类型的我没试过)可以放在任意位置,也不影响。(就是说不受上面那个跟纬度有关的变量的约束)(另外intent (out)的变量也需要出现在fortran的 subroutine 那一行)
比如在python里使用一个f2py设置好的函数时:
import f(a,b,c,d,n)
x=f(a,b,c,d,n)
就可以了,而这个函数在对应的fortran程序里面的定义需要这样:
subroutine f(a,b,c,d,n,x)
integer::a,b,c,n
integer,dimension(n)::d,x
!f2py intent(in)::a,b,c,d,n
!f2py intent(out)::x
x=(a*b-c)*d
return
end subrountine
如此。
6、一般在使用fortran的时候需要注意二维数组的行列关系的问题,即是说fortran里面的数组是(列,行)这样,而python里面是(行,列),不过貌似利用f2py进行传递时,不需要管这个,直接用就行。
7、f2py可以实现module的调用、子程序等等一些列fortran的功能。

说下使用体验。 f2py极大的提高了python的运算效率。我拿这个来写了个小模式来跑,真的是非常快。再加上python的绘图功能和简洁的语言结构,可以说是极大的改进了编程体验。Jonny Lin就用f2py做了个python版的qtcm模式,可以谷歌到。

一言概之,就是如虎添翼吧

评分

参与人数 1金钱 +20 贡献 +2 收起 理由
风子 + 20 + 2 支持支持!

查看全部评分

密码修改失败请联系微信:mofangbao
回复 支持 3 反对 0

使用道具 举报

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-3-18 23:14:03 | 显示全部楼层
不错的介绍,不知道楼主有没有尝试过数组以及字符串的交互,一些其他语言和fortran混编的时候这两个方面要注意的东西不少,不过这么强大的项目应该解决的很好吧,呵呵,真希望其他语言也有类似的工具
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-10-30 10:09:10 | 显示全部楼层
楼主真心看不懂啊  。。。。。。。。。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-10-30 22:06:15 | 显示全部楼层
看到有人在这里引入f2py,有点兴奋,所以就多说了点。。。
总之是个不错的库。numpy现在自带这个,不用额外安装了。
有了这个f2py后,很多东西都好弄很多,尤其是做模式理想实验的情况下。比如地形什么的,可以用python很方便的生成,然后交给fortran进行模拟,再返回给python进行绘图。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-10-30 22:09:03 | 显示全部楼层
另外想好好用python的就建议在linux环境下吧。。。好多功能在windows下面都用不起来Orz,比如绘制动态图、保存gif什么的,何况linux效率也更高,更好调用。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-11-11 21:26:28 | 显示全部楼层
要好好学习了。。。。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-2-7 09:07:55 | 显示全部楼层
kakame08 发表于 2015-2-7 00:24
是装numpy还是?这个也不会装。。。

不需要单独安装f2py,最简便快捷的方式是下载canopy免费版,里面集成了你需要的所有包。根据官网上的教程步骤一步步安装,很简单,连环境变量都帮你设置好了。它会自动识别你系统里安装的fortran编译器进行整合。
numpy是python的一个数学包,canopy里面包含了的。如果想要单独安装某个python包的话,一般下载其对应官网上的编译版本,就是那种里面有setup.py的那种。这种文件的安装就是输入:
python setup.py build
python setup.py install
就好了。
当然还是推荐直接用canopy吧。。。方便快捷
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-2-8 09:13:35 | 显示全部楼层
kakame08 发表于 2015-2-7 14:30
canopy有官网吗?我搜了下搜出来一堆不相干的东西

https://store.enthought.com/
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-27 18:51:48 | 显示全部楼层
学习FORTRAN模块调用功能,f2py调用FORTRAN,win7系统通过mingw解决,gFORTRAN的方式实现!
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表