GAMESS里面CI和CC部分都会用到变换后的单双电子积分,所以直接找CI部分,定位到之前用的最多的ORMAS里面(源程序为ormas1.src),在1400行左右:
C C -- OBTAIN 1 AND 2 E- TRANSFORMED INTEGRALS OVER ACTIVE ORBITALS -- C CALLING ARGUMENT -CLABEL- GOVERNS WHETHER TRANSFORMED INTEGRALS C ON FILE -IJKT- INCLUDE THE CORE ORBITALS OR NOT. IT IS ASSUMED C THAT NO CORE INTEGRALS ARE IN -IJKT-, SO THIS VARIABLE TELLS IF C THE ACTIVE ORBITALS START FROM 1,2,3... OR NCORSV+1,NCORSV+2,... C NCORE = 0 IF(CLABEL) NCORE=NCORSV CALL RDCI12(DDITRF,IJKT,X(LSINT1),X(LSINT2),NCORE,M1,M2,M4,X(LIA), * X(LXX),X(LIXX),NINTMX) write(*,*)"yjma: come back, e .... " write(*,*)"yjma: IJKT ",IJKT write(*,*)"yjma: LSINT1,LSINT2 ",LSINT1," ",LSINT2 write(*,*)"yjma: NINTMX ",NINTMX write(*,*)"yjma: NCORE, M1, M2, M4 ",NCORE," ",M1," ",M2," ",M4 ij=0 do i=1,M1 do j=1,i ! Here must be OK (orign: do j=i,M1) write(*,*)"INT1",X(LSINT1+ij),j,i ij=ij+1 end do end do ij=0 ijkl=0 do i=1,M1 do j=1,i ij=ij+1 kl=0 do k=1,M1 do l=1,k kl=kl+1 if(ij.ge.kl)then write(*,*)"INT2",X(LSINT2+ijkl),i,j,k,l ijkl=ijkl+1 end if end do end do end do end do write(*,*)"yjma: ===================================" C C ----- COMPUTE FULL CLASS CI WAVEFUNCTION ----- C
实际上这里是直接输出到输出文件里面,如果想要输出到文件的话让GAMESS写到文件里就可以了。此处只是输出,算是在trans.src里面算得,蛮复杂的,不用管。 这里虽然算得时候是可以按照对称性计算,但是这里读出或者存的时候还是全部的读出。 怎样简化到类似于高对称性下面FCIDUMP的格式,貌似本人还要翻一下群论才行或者看看Nwchem里面行不行吧。
双电子积分中 (i,j|k,l) (i,j|l,k) (j,i|k,l) (j,i|l,k) (k,l|i,j) (k,l|j,i) (l,k|i,j) (l,k|j,i) 均相等 http://blog.sina.com.cn/s/blog_6594d5d30100p0lg.html
*FCUDUMP格式**
open(unit=7760,file='/home/yjma/FCIDUMP_GAMESS/FCIDUMP') ij=0 ijkl=0 do i=1,M1 do j=1,i ij=ij+1 kl=0 do k=1,M1 do l=1,k kl=kl+1 if(ij.ge.kl)then if(abs(X(LSINT2+ijkl)).gt.1.0e-15)then write(7760,7761)X(LSINT2+ijkl),i,j,k,l else write(7760,7762)0.0000000000000001,i,j,k,l end if ijkl=ijkl+1 end if end do end do end do end do 7761 format(G21.12,I4,I4,I4,I4) open(unit=7760,file='/home/yjma/FCIDUMP_GAMESS/FCIDUMP') ij=0 do i=1,M1 do j=1,i if(abs(X(LSINT1+ij)).gt.1.0e-15)then write(7760,7762)X(LSINT1+ij),i,j,0,0 else write(7760,7762)0.0000000000000001,i,j,0,0 end if ij=ij+1 end do end do 7762 format(G21.12,I4,I4,I4,I4)
(J_Sagat)