24小时热门版块排行榜    

查看: 1648  |  回复: 3
【奖励】 本帖被评价2次,作者寒雨人生增加金币 1.6
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

[资源] 【原创首发】gfortran4.6+acml5.0.0 GAMESS2012(gmsnbo etc.) ubuntu 12.04 64bit

gfortran4.6+acml5.0.0 GAMESS2012(gmsnbo tinker vb2000 neo) ubuntu 12.04 64bit

以前发过帖子讲述GAMESS2012在ubuntu11.XX 32bit上的编译(链接)。
当时用的是Intel Fortran(Professional)+ mkl,编译的各部分代码都一样。
gfortran安装——在联网状态下用sudo apt-get install gfortran命令即可。
acml数学库可以去AMD的官网下载——注意下载适合的版本,一般5.0.0以上的acml(最新版本是5.2.0)需要4.6以上的gfortran配合,此外请注意要下载acml-5-x-x-gfortran-64bit-int64.tgz;然后解压,进入解压后的文件夹,运行安装脚本,按提示安装。默认的安装路径是/opt/acml5.x.x。
其实这里编译的过程都差不多,有三点需要注意:
1.gmsnbo.src源码修改:
因为是与vb2000一起编译,所以就要多修改几个(共3个)相互冲突的函数名,具体修改如下(来自官网的Bug报告)——
In the nbo_59.src source code, use a text editor to
globally replace "GETDM" by "NGETDM" throughout the
code. (This avoids conflict with SR GETDM as introduced
in the 25-Mar-2010 GAMESS version.) If both NBO
and VB2000 are being compiled with GAMESS, you should
also replace "REDUC1" by "NREDUC1" and "ANGLES" by
"NANGLES" in the definitions and calls to SR REDUC1
and SR ANGLES.

2.以前网络上(国内的网页,针对那个泄露出来的09年?月的版本的,---下载链接---)流传的一个帖子报告的gmsnbo.src的两个Bug,其修改貌似是有问题的——
以前的修改方式是这样的:
8427 行
IF(MORB.EQ.0.AND.NAMEAT(IATNO(NCTR.NE.'gh') THEN 改为
IF(MORB.EQ.0.AND.NAMEAT(IATNO(NCTR.NE.'gh'))) THEN
15421 行
IF(MORB.EQ.0.AND.NAMEAT(IATNO(NCTR).NE.'gh') THEN 改为
IF(MORB.EQ.0.AND.NAMEAT(IATNO(NCTR).NE.'gh')) THEN
发现这种修改存在问题的过程是这样的——
按上述修改完成之后,使用gfortran编译。其他所有模块都能正常编译成功,而gmsnbo无法正常编译,给出的错误提示的大意如下:
8427行
.NE.运算错误,原因是INTEGER(8)/CHARACTER。(NCTR是整型变量!)
15421行
.NE.运算错误,原因是INTEGER(8)/CHARACTER。(IATNO函数返回的也是整型变量!)

查阅NBO5的用户手册,可知:NCTR应该是原子中心的编号;IATNO函数返回的是原子序数;NAMEAT函数返回的是Hollerith(一种符号标记方法)原子符号。
从逻辑上讲,程序员不会轻易将两个不同类型的变量进行比较运算。而以前流行的这种修改方式显然是犯了这种逻辑错误的。笔者猜想,之所以用Intel Fortran进行编译而没有出现报错,可能是因为Intel Fotran能自动将不同类型的变量转化成同一种类型之后再进行比较,同时它也应该还能自行将布尔型变量视作0和1进行处理。

搞清楚以上关系之后,笔者进行了如下修改:
8427 行
IF(MORB.EQ.0.AND.NAMEAT(IATNO(NCTR.NE.'gh') THEN 改为
IF(MORB.EQ.0.AND.NAMEAT(IATNO(NCTR)).NE.'gh') THEN
15421 行
IF(MORB.EQ.0.AND.NAMEAT(IATNO(NCTR).NE.'gh') THEN 改为
IF(MORB.EQ.0.AND.NAMEAT(IATNO(NCTR)).NE.'gh') THEN
按理说这样才是符合逻辑的。

笔者接着使用./comp gmsnbo >& gmsnbo.src &命令进行gmsnbo的编译。结果仍人在这两个地方出现同样的报错信息。
但是这次的提示是——NAMEAT处为INTEGER(8),不能与CHARACTER*2型的'gh'进行比较。
这次笔者觉得很困惑,照例说,NAMEAT应该是返回CHARACTER型结果的。于是找到了FUNCTION NAMEAT看看。
结果发现,其实NAMEAT函数中的NAME、IGHOST、BLANK变量预置的数据中根也本没有包含'gh'。
所以,笔者在gmsnbo.src中搜索了'gh'这个关键字,并发现了一个名为CHARAT的函数,返回的是字符串,其中有个变量IGHOST预置了字符串'gh'。
笔者再次查阅手册,发现函数CHARAT(IZ)返回的是对应于原子序数IZ的原子符号(比如CHARAT(2)返回的是字符串He)。

基于以上发现,笔者大胆地做了如下修改:
IF(MORB.EQ.0.AND.NAMEAT(IATNO(NCTR.NE.'gh') THEN 改为
IF(MORB.EQ.0.AND.CHARAT(IATNO(NCTR)).NE.'gh') THEN
15421 行
IF(MORB.EQ.0.AND.NAMEAT(IATNO(NCTR).NE.'gh') THEN 改为
IF(MORB.EQ.0.AND.CHARAT(IATNO(NCTR)).NE.'gh') THEN
并各在这两行代码所在的子例程(SUBROUTINE)的变量申明部分加上如下内容(其实应该不用加的,因为声明函数时已经带上属性了,但是不加这两行貌似回报错):
CHARACTER*2,EXTERNAL :: CHARAT

注意:关于GAMESS源码的一些修改可以参考以前的改法,但是可能就是行数对不上了。这些在我以前的帖子中有提到(见此文开头链接)。

3.tinker源码的修改:
以前tinker源码是不需要修改的。但是使用gfortran之后,如果不做修改,就会无法编译Libtad模块。这个错误出现在fortran的内置获取系统时间的函数idate的调用上,在tinker源码Libtad.f中,直接使用的是idate(year,month,day)。这样,gfortran就会提示你,idate函数的参数太多。
笔者查阅了gfortran的编程手册之后,发现gfortran中idate函数其实是把参数换成了一个含有3个成员的一维数组。知道这点就很容易修改了,具体修改方式如下:
另外申明一个变量:integer date(3)
然后将idate(year,month,day)换成idate(date)
再写几个赋值语句就可以了:year=date(1)
month=date(2)
day=date(3)

至此,所有新的修改都已经说明完毕。可以按以前的办法,编译,link,运行tests里边的算例了。
PS:没有测试过gmsnbo。笔者不是计算专业出身,现在也不做理论计算,纯属业余瞎捣鼓。其实发现gmsnbo的源码很多是要改的。但是不知道从哪里下手好。需要阅读手册,需要认真读源码,但是笔者时间不够,那些源码又写得有些杂乱,所以笔者也就不了了之了。以上是笔者花了4个晚上捣鼓的一点东西。也许根本就没用,但是大家可以试一试,看看会有什么结果。

[ 来自科研家族 木虫量化 ]

[ Last edited by 寒雨人生 on 2012-10-12 at 09:43 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
引用回帖:
3楼: Originally posted by yun_hai_yan at 2013-05-23 10:18:54
为什么下载acml-5-x-x-gfortran-64bit-int64.tgz ,我的amd cpu 也是下载这个吗?

跟CPU关系不大,主要是系统。
你要是用的Linux-64bit,那么就用这个吧。
4楼2013-05-23 18:02:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 寒雨人生 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见