|
|
本帖最后由 Shannon 于 2015-7-2 00:48 编辑
一直想把代码的双电子积分用libint计算,速度估计快好多。 但苦于C++和matlab在windows平台上几乎完全没法兼容。 cygwin上编译了无数次,每次matlab运行 mex文件 都会直接挂掉。
个人是坚定不移的拿来煮义者,如果有代码能利用是绝对不想多写一行的, 用matlab一个好处就是matlab在超高开发效率的同时 , 能使用C/C++写的mex从而达到极快的计算速率, 同时包含JVM虚拟机,直接调用各种java代码混编 毫无障碍。 可惜, libint 上matlab实在是兼容不了, 线程不安全这个问题 非常 残念,动辄退出令编程极其不爽。
不得已,转战python平台, 现已路转粉。
python那简洁的编程风格 能治愈 业余程序猿 们 习惯乱缩进的顽疾,同时有海量的免费 代码库 能直接用。scipy/numpy 的函数 几乎能逐句翻译matlab代码。
目前代码版本的双电子积分是 用 python 和swig 包装 c++写的 libint库实现的。理论上价值不大,但可能是一个还不错的python参考代码,故分享共赏。
以后有时间再在这个python 代码基础上写出几何导数计算,libint已经自带有几何导数功能,只需要整理一下就能用。
(代码license为GPL,欢迎使用)
7z压缩包内,libint和c++代码已经在windows7 64bit/core i7 3770/cygwin 64bit/ swig 3.05/ python 2.7 32bit/mingw32 下编译好了,直接测试即可。
代码介绍如下:
1. 编译环境
我的环境是 windows7 64bit/core i7 3770/cygwin 64bit/ swig 3.05/ python 2.7 32bit/mingw32
需要用到swig 和 python 2.7 win32 版。 代码用到了numpy 和scipy,这两个没有官方的64bit安装包(非官方安装包有)。
编译需要用mingw的gcc 编译. cygwin的gcc 编译会报错。 libint同样需要mingw编译,但是需要在cygwin环境中。
cygwin中若有gcc,和mingw会冲突,清将cygwin内的gcc和g++改名掉(或者删掉),如果有同学在cygwin内装了python的话,也得改名或者删掉,以免出现冲突。
mingw的gcc和cygwin的gcc生成的库文件有很大差别, 没法兼容。
2. 编译libint
libint的编译是老样子:
./configure
make
make intall
非常简单,就是需要点耐心。
生产的库文件找到,用来第三部工作。
3. 编译python的c模块
3.1,准备接口文件 maincode.i,如下,直接调用头文件就可以了,以后也不需要改。另外,为了能让python使用指针和c++数组,需要cpointer.i和carray.i。这两个swig库文件用法可以参考 http://www.swig.org/Doc1.3/Library.html
- /* File : interface.i */
- %module maincode
- %{
- #include "maincode.h"
- %}
- %include "maincode.h"
- %include "cpointer.i"
- %include "carrays.i"
- %array_class(double, doubleArray);
- %pointer_class(double, doublep);
复制代码 3.2 准备头文件编译的代码类似函数库,不需要main函数,吧main改成别的名字,然后写个头文件,例如这样的:
- int compute(double *Result,double * contrcoef1,double * alphascale1,
- int contrdepth1input,double * A,double * contrcoef2,double * alphascale2,
- int contrdepth2input,double * B,double * contrcoef3,double * alphascale3,
- int contrdepth3input,double * C,double * contrcoef4,double * alphascale4,
- int contrdepth4input,double * D,int am0i,int am1i,int am2i,int am3i);
-
复制代码 有了swig之后,python可以调用 含有数组和指针的c++函数的。
头文件写好之后,用swig生成 wrap 的c++代码文件:
swip -c++ -python XXXXXXXX.i
3.3 写setup.py,用distutils安装
如题, 直接用gcc编译非常麻烦,推荐用python自带的distutils 安装。
setup.py
- from distutils.core import setup, Extension
- module1 = Extension(<font color="#ff0000">'_maincode'</font>, sources=['maincode_wrap.cxx',
- 'maincode.cpp'], include_dirs=['libint/include/libint2'],library_dirs=['libint/lib'],libraries=['int2'])
- setup (name = 'maincode',
- version = '1.0',
- description = 'Simple maincode from SWIG tutorial',
- ext_modules = [module1])
复制代码 maincode前面那个_符号很重要,没写会导致很难发现的错误。 另外,使用cygwin 的gcc在此处会爆出 NoneType" object is not iterable 这样的错误。 安装:
python setup.py build_ext --compiler=mingw32 --inplace
inplace 的用处是将编译好的pyd文件放在当前文件夹下。
4. matlab调用python
matlab 也可以调用python,直接import py.package名.* 就可以用了。 和调用java类似。
但是自己编译的c模块,用matlab有时会载入失败。 这个代码中是用 .mat 文件在python部分和matlab部分之间传递变量的。python 的scipy可以直接读取.mat文件,然后locals().update(XX)将读取的变量加入python的namespace里面。
|
评分 Rate
-
查看全部评分 View all ratings
|