本帖最后由 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了。
|