量化专业中做方法的同学肯定会遇到积分提取的问题,这里我把自己的方法写下来与大家分享。这里写一下Gamess的,毕竟gamess是开源的,每个人都可以获得。
1) 单电子积分
提取比较容易,在…/gamess/source里面,int1.src文件中
C ----- SUM UP PARTIAL CONTRIBUTIONS IF PARALLEL ----- C IF (GOPARR) THEN CALL DDI_GSUMF(910,H,L2) CALL DDI_GSUMF(911,S,L2) CALL DDI_GSUMF(912,T,L2) IF(LZINT) CALL DDI_GSUMF(913,Z,L2) IF(DOESP1) CALL DDI_GSUMF(913,ESP1E,L2) END IF C C ----- SAVE H, S, AND T MATRICES ON THE DAF ----- C CALL DAWRIT(IDAF,IODA,H,LL2,11,0) CALL DAWRIT(IDAF,IODA,S,LL2,12,0) CALL DAWRIT(IDAF,IODA,T,LL2,13,0) IF(LZINT) CALL DAWRIT(IDAF,IODA,Z,LL2,379,0) IF (ISAVE.EQ.1) THEN CALL DAWRIT(IDAF,IODA,H,LL2,311,0) CALL DAWRIT(IDAF,IODA,S,LL2,312,0) END IF IF(DOESP1) CALL DAWRIT(IDAF,IODA,ESP1E,L2,311,0) C C ----- OPTIONAL DEBUG PRINTOUT ----- C
此处写上简单的fortran循环就可以将单电子积分H、重叠积分S等读出,如
C ---- yjma output S --- open(unit=2507,file='AoS.tri') write(2507,*)L1 do i=1,LL2 write(2507,*)S(i) end do close(2507) c -------- yjma added in 2013.1.26 -------- open(unit=4417,file="SINTEGRALS_AO",FORM='UNFORMATTED', * ACCESS='SEQUENTIAL') do i=1,LL2 write(4417)H(i) end do close(4417) c -----------------------------------------
2)双电子积分
这个稍微麻烦一些,需要修改../gamess/source下面的int2a.src
找到下面这个部分
C C ----- PACK THE 4 INDICES OF INTEGRAL INTO ONE WORD C ----- WRITE LABEL + INTEGRAL ON TAPE (IS) C SAME = ISH .EQ. KSH .AND. JSH .EQ. LSH IANDJ = ISH .EQ. JSH KANDL = KSH .EQ. LSH C 循环的里面 添加输出 ! --------MAYI EXAMPLE------------- open(unit=2513,file='AO_2E.txt') write(2513,*)I1,I2,I3,I4,VAL !----------------------------- C IF (OUT) CALL INTOUT(I1,I2,I3,I4,QQ4,IJKL_INDEX,VAL) IF (I1 .EQ. I2) VAL = VAL*HALF IF (I3 .EQ. I4) VAL = VAL*HALF IF (I1 .EQ. I3 .AND. I2 .EQ. I4) VAL = VAL*HALF
两源文件都修改后,注意要编译一下。然后输出的文件会在gamess的交换文件目录里面 (scr). 如果相让gamess读入积分的话也是在这个目录里给出。
注意一点是,这里提出的单电子积分是Hartree-Fock迭代里面的。不包含各种各样的修正(比如静电场的作用等) 双电子积分还要注意对称性,我的另一篇博文里面有提到。
非常感谢liwei老师和H.J.Zhang的指导! (一晃好些年了呢; J_Sagat)