def rhf_energy(self): """ Optimize RHF orbitals; return RHF energy, two-electron integrals, and coefficient matrix """ rhf = RHF(self.mol, self.mints) return(rhf.E,rhf.g,rhf.C,rhf.orb_e)
def __init__(self, mol, mints): rhf = RHF(mol, mints) self.E0 = rhf.computeEnergy() self.docc = rhf.docc self.nbf = len(rhf.S) self.e = rhf.e self.G = rhf.G self.C = rhf.C
return np.einsum('pqrs, pP, qQ, rR, sS-> PQRS', G, C, C, C, C) def get_energy(self): # MP2 energy correction e, E0, ndocc, ntot = self.e, self.E0, self.ndocc, self.ntot g_mo = self.transform_integrals( rhf.C, rhf.G) # calls transform_integrals function E = 0.0 for i in range( ndocc): # i and j over occupied orbitals, a and b over virtual for j in range(ndocc): for a in range(ndocc, ntot): for b in range(ndocc, ntot): E += (g_mo[i, a, j, b] * (2 * g_mo[i, a, j, b] - g_mo[i, b, j, a])) / ( e[i] + e[j] - e[a] - e[b] ) # MP2 energy expression print('The second order energy correction is {:20.14f}'.format(E)) print('The total RMP2 energy is {:20.14f}'.format(E0 + E)) return E # testing if __name__ == '__main__': rhf = RHF('../../3/bz3wp/Options.ini') rhf.get_energy() rmp2 = RMP2(rhf) rmp2.get_energy()
for j in range(nocc): for a in range(nocc, ntot): for b in range(nocc, ntot): Ec += gmo[i, a, j, b]*(2*gmo[i, a, j, b] - gmo[i, b, j, a])/\ (e[i] + e[j] - e[a] - e[b]) self.Ec = Ec self.E_mp2 = Ec + self.E_scf print('@MP2 correlation energy: {:15.10f}\n'.format(self.Ec)) print('@Total MP2 energy: {:15.10f}\n'.format(self.E_mp2)) return self.E_mp2 if __name__ == "__main__": import sys sys.path.insert(0, '../../3/jevandezande') from rhf import RHF rhf = RHF('../../3/jevandezande/Options.ini') rhf.energy() rmp2 = RMP2(rhf) e = rmp2.energy() dfrmp2 = RMP2(rhf, 'cc-pVDZ-RI') df_e = dfrmp2.energy() print("Energy Error: {:7.5e}".format(df_e - e)) print("norm(UMP2.gmo - DFUMP2.gmo): {:7.5E}".format( np.linalg.norm(rmp2.gmo - dfrmp2.gmo)))