量化专业中做方法的同学肯定会遇到积分提取的问题,这里我把自己的方法写下来与大家分享。这里写一下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)

  • aoint_gamess.txt
  • Last modified: 2019/09/24 00:23
  • (external edit)