Fortran Coder

查看: 17938|回复: 7
打印 上一主题 下一主题

[混编] Python与Fortran混编配置---f2py

[复制链接]

8

帖子

2

主题

1

精华

入门

F 币
79 元
贡献
41 点
跳转到指定楼层
楼主
发表于 2016-8-17 03:27:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 Labradog 于 2016-8-29 12:52 编辑

小弟才加入本论坛,看了下混编的帖子,多是Fortran和C,MATLAB,VB等。因小弟工作中用的是fortran计算,Python画图,充当胶水作用。这几天配置了一下Python与Fortran混编,各位且看如下。
第一,安装相关软件。Anaconda2(Python2.7),VS2012,IVF2013,sublime(强推,编写编译于一身,针对于ifort的配置有感兴趣的我再发)。安装好Anaconda后Numpy已经包含有f2py,但此时f2py识别不到ivf编译器。网上传言很多说f2py在windows平台只能用Gfortran的退散吧,在Linux以及windows平台,gfortran以及ifort我都实现了成功配置。f2py支持的编译器多着呢,具体看帮助文档。
第二,修改Python相关文件。因f2py默认是识别Vs2008,所以我采取了强制措施:修改......\Anaconda2\Lib\distutils\msvc9compiler.py。243行修改成toolskey = "VS110COMNTOOLS" % version,注意红色部分对应着VS版本,具体可参考:http://www.360doc.com/content/15/0414/13/12067640_463121220.shtml。此时,离胜利还是有点距离的,还是会提示unable find......。Google了好久之后发现还有一处需要修改:vc_env = query_vcvarsall(11.0, plat_spec)(因我没有备份原始文件,只记得改成了11.0,搜索整个文档也只发现了这一处11.0,应该就是他了,原本应该是vc_env = query_vcvarsall(version, plat_spec))。OK,胜利在望!f2py -c -m  target source.f90。。。。。仍旧是can not find...WTF!!
第三:google后发现VCForPython27.msi这个软件也是很关键的,具体他是干什么的自己Google。安装之。完了保险起见restart。

最后理论上再次f2py -c -m .......就可以了。。但是结果总是FFF。。。原来还是没有成功调用ivf。Google之, CMD 运行"C:\Program Files (x86)\Intel\Composer XE\bin\ifortvars.bat" intel64 vs2012。。注意版本对应。

最后的最后,f2py -c -m --fcompiler=intelvem 目标  源文件.F90...Yes,成功了。。。
测试一下:
[Fortran] 纯文本查看 复制代码
real function f(x)
        implicit none
        real,intent(in)::x
        f=x**3-2*x**2+x-1
end function f

real function df(x)
        implicit none
        real,intent(in)::x
        df=3*x**2-4*x+1 
end function df

subroutine newton_raphson()
        implicit none
        integer::i=0
        real::x0
        real::temp
        real,external::f,df
        write(*,*) "Enter origin x0 : "
        read(*,*) x0

        do
                temp=x0-f(x0)/df(x0)
                if (abs(temp-x0)<1.0e-5) exit
                x0=temp
                i=i+1
                write(*,100) f(x0),temp,i
                100 format (2x,"f(x)=",f7.3," when x= ",f6.3," at iteration",i3)
                        
        end do
                ! i=i+1.0
        write(*,*) temp
end subroutine newton_raphson
Fortran代码写的不行,还请多担待,我其实才学fortran没多久。笑脸!!
Cmd(此处先强推下Cmder,可以方便设置alias如下,每次先执行ini,再执行fp就ok啦~~~~ini= "C:\Program Files (x86)\Intel\Composer XE\bin\ifortvars.bat" intel64 vs2012;fp=f2py -c -m --fcompiler=intelvem $*)执行f2py -c -m --fcompiler=intelvem newton newton_raphson.F90得到newton.pyd,可导入Python。
python中
[Python] 纯文本查看 复制代码
{lamb} python
Python 2.7.11 |Anaconda 2.4.1 (64-bit)| (default, Dec  7 2015, 14:10:42) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: [url=http://continuum.io/thanks]http://continuum.io/thanks[/url] and [url=https://anaconda.org]https://anaconda.org[/url]
>>> import newton
>>> print newton.__doc__
This module 'newton' is auto-generated with f2py (version:2).
Functions:
  f = f(x)
  df = df(x)
  newton_raphson()
.
>>> newton.newton_raphson()
 Enter origin x0 :
5
  f(x)= 23.064 when x=  3.589 at iteration  1
  f(x)=  6.533 when x=  2.677 at iteration  2
  f(x)=  1.680 when x=  2.124 at iteration  3
  f(x)=  0.317 when x=  1.845 at iteration  4
  f(x)=  0.024 when x=  1.762 at iteration  5
  f(x)=  0.000 when x=  1.755 at iteration  6
  f(x)= -0.000 when x=  1.755 at iteration  7
   1.754878
>>>

半夜发帖,困得很,语言比较混乱,多担待~~~强行笑脸~~!!
Enjoy~!!!
PS:2016.08.29补充一下,突然之间直接输入F2py找不到了,配置了环境变量也不行。最后改成fp=python \path_to_f2py\f2py.py -c -m --fcompiler=intelvem $*就Ok了。


分享到:  微信微信
收藏收藏5 点赞点赞1 点踩点踩

2

帖子

0

主题

0

精华

新人

F 币
27 元
贡献
8 点
8#
发表于 2018-12-4 22:25:24 | 只看该作者
按照您的说法,重新配置了python3.6+VS2017,但是貌似还是不行,不知道是否可以私聊如何解决该问题,QQ:276104733,等待回复,谢谢

8

帖子

2

主题

1

精华

入门

F 币
79 元
贡献
41 点
7#
 楼主| 发表于 2016-8-17 22:52:11 | 只看该作者
pasuka 发表于 2016-8-17 21:44
ABAQUS的内核早就用C/C++重写了,所以C代码编译成obj文件再link完全可以

嗯,这样说来确实可以。但我不会c语言,学习成本有点高,另外,我莫名的喜欢Python

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

6#
发表于 2016-8-17 21:44:24 | 只看该作者
Labradog 发表于 2016-8-17 21:35
主要原因是:我的工作要利用ABAQUS进行二次开发,子程序就是Fortran写的。所以,。。。 ...

ABAQUS的内核早就用C/C++重写了,所以C代码编译成obj文件再link完全可以

8

帖子

2

主题

1

精华

入门

F 币
79 元
贡献
41 点
5#
 楼主| 发表于 2016-8-17 21:35:41 | 只看该作者
pasuka 发表于 2016-8-17 21:19
为啥不考虑ctypes或者cffi呢?前者python自带模块,后者傻瓜版
F03和F08标准下面,C和Fortran几乎等价,用i ...

主要原因是:我的工作要利用ABAQUS进行二次开发,子程序就是Fortran写的。所以,。。。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

地板
发表于 2016-8-17 21:19:55 | 只看该作者
为啥不考虑ctypes或者cffi呢?前者python自带模块,后者傻瓜版
F03和F08标准下面,C和Fortran几乎等价,用iso c binding多好,放之四海而皆准

8

帖子

2

主题

1

精华

入门

F 币
79 元
贡献
41 点
板凳
 楼主| 发表于 2016-8-17 09:51:15 | 只看该作者
fcode 发表于 2016-8-17 08:50
我就喜欢这种有料的好文章。

谢谢支持,以后有问题还请你多指教。

2022

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1598 元
贡献
689 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2016-8-17 08:50:22 | 只看该作者
我就喜欢这种有料的好文章。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-23 16:29

Powered by Tencent X3.4

© 2013-2024 Tencent

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