Python与Fortran混编配置---f2py
本帖最后由 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 -mtarget 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,成功了。。。
测试一下:
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_raphsonFortran代码写的不行,还请多担待,我其实才学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中
{lamb} python
Python 2.7.11 |Anaconda 2.4.1 (64-bit)| (default, Dec7 2015, 14:10:42) on win32
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> 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 iteration1
f(x)=6.533 when x=2.677 at iteration2
f(x)=1.680 when x=2.124 at iteration3
f(x)=0.317 when x=1.845 at iteration4
f(x)=0.024 when x=1.762 at iteration5
f(x)=0.000 when x=1.755 at iteration6
f(x)= -0.000 when x=1.755 at iteration7
1.754878
>>>
半夜发帖,困得很,语言比较混乱,多担待~~~强行笑脸~~!!
Enjoy~!!!
PS:2016.08.29补充一下,突然之间直接输入F2py找不到了,配置了环境变量也不行。最后改成fp=python \path_to_f2py\f2py.py -c -m --fcompiler=intelvem $*就Ok了。
我就喜欢这种有料的好文章。 fcode 发表于 2016-8-17 08:50
我就喜欢这种有料的好文章。
谢谢支持,以后有问题还请你多指教。 为啥不考虑ctypes或者cffi呢?前者python自带模块,后者傻瓜版
F03和F08标准下面,C和Fortran几乎等价,用iso c binding多好,放之四海而皆准 pasuka 发表于 2016-8-17 21:19
为啥不考虑ctypes或者cffi呢?前者python自带模块,后者傻瓜版
F03和F08标准下面,C和Fortran几乎等价,用i ...
主要原因是:我的工作要利用ABAQUS进行二次开发,子程序就是Fortran写的。所以,。。。 Labradog 发表于 2016-8-17 21:35
主要原因是:我的工作要利用ABAQUS进行二次开发,子程序就是Fortran写的。所以,。。。 ...
ABAQUS的内核早就用C/C++重写了,所以C代码编译成obj文件再link完全可以 pasuka 发表于 2016-8-17 21:44
ABAQUS的内核早就用C/C++重写了,所以C代码编译成obj文件再link完全可以
嗯,这样说来确实可以。但我不会c语言,学习成本有点高,另外,我莫名的喜欢Python:-D 按照您的说法,重新配置了python3.6+VS2017,但是貌似还是不行,不知道是否可以私聊如何解决该问题,QQ:276104733,等待回复,谢谢
页:
[1]