Fedora7-64bit下编译Gaussian03-C02

PS:编译gaussian03真是极为辛苦,以前弄到过一份G98的源码,想尽办法也仍然没有完整编译成功,差几个link编不出来,网上也有关于编译G98的讨论,但是却没起什么帮助,似乎gaussian是出了名的难编译,尤其是用的编译器比较讨厌,pgf的,编译的脚本也写得乱七八糟,莫名其妙,本以为编译gaussian几乎是无望的事,前一阵子有个好人发给我一个G03-C02的源码,这两天我又重新燃烧起来了,也不借助任何参考资料了(比如官网上就说运行bldg03就行,这话根本没有任何价值),完全是摸石头过河,反复编译过不下30遍,经过不懈努力,历经九九八十一难,终于修成正果。尤其是编译util.so的经历十分坎坷,本来一开始走的是歪门邪道,直接用官方发布的G03-C02的util.so,屏蔽掉对util.so的编译,虽然可以正常编译,但是总觉得不够完美,一定要“从头编”,或许可以说是ab initio compiling,于是又费尽周折,解决兼容性等问题。而且不光是能从头编译出来就算满意,还仔细比较了不同方式编译的性能,而且为了能够总结出这篇让所有人都能不遇到任何报错的编译方法,又反复验证很多次。下面这些内容看起来不多,但价值极高。其实如果是在单核32bit平台下编译麻烦会少很多。


Fedora7-64bit下编译Gaussian03-C.02
文/Sobereva @北京科音   写于约2008年


编译平台:root,fedora7-64bit,Intel Q6600。为保持兼容性这里编译32bit版本。如果软硬件严格符合这几条要求,没乱改过设置,对linux、gaussian和编译器不是完全外行,保证95%可能性一遍编译成功。

http://www.pgroup.com下载pgf77 workstation,约290MB,我用的是8.01版。解压运行install安装到默认路径,ACML和mpich1都不用装。
注册一个新帐户,邮箱只能用.edu等等的正经邮箱,如果难申请.edu的邮箱,可以到这里免费申请后缀是@hist.edu.cn的邮箱http://www.hsit.edu.cn。注册后邮箱里会受到激活信,激活帐户后,登陆,选Create trial keys,输入/opt/pgi/license.info里面的FLEXnet hostid后面的内容,就可以得到license.dat,拷进/opt/pgi。注意每台机子的id都不同,需要不同的license.dat,因此如果换了机子,就要重新在申请页面填写hostid以得到新的license.dat。这个license.dat可以使编译器在两周内运行。

ln -s /opt/pgi/linux86/8.0-1/bin/pgf77 /usr/bin/pgf77 (编译32bit版本用32bit版本编译器)
将g03源代码的压缩包解压到/sob/g03

修改/sob/g03/bsd/updatelink1的42行,将set-mflags改为/sob/g03/bsd/set-mflags
修改/sob/g03/bsd/setup-make的28、68行,将set-mflags改为/sob/g03/bsd/set-mflags
修改/sob/g03/bsd/g03.login的第74和第75行,将set-mflags改为/sob/g03/bsd/set-mflags,87行gau_machine改为./gau_machine
修改/sob/g03/bsd/bldg03的第198、205、208、211行,将set-mflags改为/sob/g03/bsd/set-mflags。把120行改为set x = i386
将/sob/g03/bsd/i386.make的580行(编译cmpdst.o那段)的-c前面加上-m32,将599行(编译mdutil.o那段)的-c前面加上-m32
将/sob/g03/mdutil.c的第1267行(pthread_kill_other_threads_np()那行)删掉。
修改/sob/g03/set-mflags,将23行改为set csize=4096(此数值每个CPU不同,也就是cat /proc/cpuinfo里面显示的cache size项),把第30行amd64改为aamd64(使之识别不能,这样即便是64位平台,也使用前面默认的编译32bit版本的参数)
拷贝/sob/g03内所有.inc文件至/usr/include
/sob/g03>csh
/sob/g03>setenv g03root /sob
/sob/g03>chmod 777 *
/sob/g03>chmod 777 ./bsd/*
/sob/g03>source bsd/g03.login
/sob/g03>bsd/bldg03 >& all.txt      (如果编译失败,在all.txt里面搜error找原因)
将以下内容(星号内的)按顺序加入/root/.bashrc:
******************
export g03root=/sob
source /sob/g03/bsd/g03.profile
export GAUSS_SCRDIR=/sob/g03/scratch
******************
/sob/g03>mkdir scratch
/sob/g03>bash
即可使用,经简单测试编译出来的和网上的已编译好的G03-C02(IA32)运算结果一致,而且速度还快10%。

 

编译过程实际上是bldg03调用g03.make和updatelink1来完成。编译前先编译出gau-fsplit(bsd/fsplit.c)等工具,gau-fsplit将fortran源代码文件拆成一个个子程序源文件,每个源文件只含一个函数,文件名就是函数的名字,分别编译为.o再连接成完整文件。首先在temputil临时目录下编译的util.a所需要的一堆.o,连接成util.a,再连接成util.so,之后就把这临时目录删掉。然后依次编译lxxx.exe,也是先编译一大堆.o,暂存在temp-lxxx目录然后组合,之后删掉这个临时文件夹。
编译一开始会删掉bsd/g03.make,根据系统的架构不同,自动制作g03.make软连接连接到???.make(比如i386.make),然后以g03.make控制文件的编译过程。

要想保留util.so的临时文件夹temputil,把bldg03第342行也就是rm -f -r temputil注释掉。
想要保留每个子程序的临时文件夹,把g03.make里面所有rm -f替换为#rm -f。这样每个link子程序包含的内容比较清晰,方便查询。

如果想编译某个子程序,比如l502.exe,运行make -f bsd/i386.make l502.exe。编译所有.exe,即不编译util.a,运行make -f bsd/i386.make exe。

gau-machine的返回值就是当前CPU的架构,比如i386、amd64。即便是intel CPU,只要是64bit环境下,都显示amd64。gau-machine是由bsd/machine.c编译得到的,每次跑bldg03时都先编译一编。

bsd/set-mflags是用来设定编译时的参数的脚本。在其中会调用gau-machine来确定编译参数,以此决定用哪些参数和bsd下面哪个位数的.a库,参数保存在$mflags,并把它传递给其它脚本。

在64bit平台下编译32位版本还有另外一种办法,就是修改/sob/g03/bsd/gau-machine.c的131行,将amd64改为i386。用这种方法就不必修改bldg03的第120行,也不必修改set-mflags里面的第30行。但是这样编译出来高斯比前面说的方法要慢1/5以上,比官方编译好的更慢,但是更保险,如果前面的方法编译出来的运行有问题则用这种修改machine.c的方法。

 

上文编译所需的xxx包下载地址,仅供学习交流之用:/usr/uploads/file/20150610/20150610212844_91729.zip