def test_rdm_complex(self): mol = gto.M() mol.verbose = 0 nocc = 6 nvir = 8 mf = scf.GHF(mol) nmo = nocc + nvir numpy.random.seed(1) eri = (numpy.random.random((nmo, nmo, nmo, nmo)) + numpy.random.random( (nmo, nmo, nmo, nmo)) * 1j - (.5 + .5j)) eri = eri + eri.transpose(1, 0, 3, 2).conj() eri = eri + eri.transpose(2, 3, 0, 1) eri *= .1 def get_jk(mol, dm, *args, **kwargs): vj = numpy.einsum('ijkl,lk->ij', eri, dm) vk = numpy.einsum('ijkl,jk->il', eri, dm) return vj, vk def get_veff(mol, dm, *args, **kwargs): vj, vk = get_jk(mol, dm) return vj - vk def ao2mofn(mos): return eri mf.get_jk = get_jk mf.get_veff = get_veff hcore = numpy.random.random((nmo, nmo)) * .2 + numpy.random.random( (nmo, nmo)) * .2j hcore = hcore + hcore.T.conj() + numpy.diag(range(nmo)) * 2 mf.get_hcore = lambda *args: hcore mf.get_ovlp = lambda *args: numpy.eye(nmo) orbspin = numpy.zeros(nmo, dtype=int) orbspin[1::2] = 1 mf.mo_coeff = lib.tag_array(numpy.eye(nmo) + 0j, orbspin=orbspin) mf.mo_occ = numpy.zeros(nmo) mf.mo_occ[:nocc] = 1 mf.e_tot = mf.energy_elec(mf.make_rdm1(), hcore)[0] mycc = cc.GCCSD(mf) eris = gccsd._make_eris_incore(mycc, mf.mo_coeff, ao2mofn) mycc.ao2mo = lambda *args, **kwargs: eris mycc.kernel(eris=eris) mycc.solve_lambda(eris=eris) dm1 = mycc.make_rdm1() dm2 = mycc.make_rdm2() e1 = numpy.einsum('ij,ji', hcore, dm1) e1 += numpy.einsum('ijkl,ijkl', eri, dm2) * .5 self.assertAlmostEqual(e1, mycc.e_tot, 7) self.assertAlmostEqual( abs(dm2 - dm2.transpose(1, 0, 3, 2).conj()).max(), 0, 9) self.assertAlmostEqual( abs(dm2 - dm2.transpose(2, 3, 0, 1)).max(), 0, 9) self.assertAlmostEqual( abs(dm2 + dm2.transpose(2, 1, 0, 3)).max(), 0, 9) self.assertAlmostEqual( abs(dm2 + dm2.transpose(0, 3, 2, 1)).max(), 0, 9)
def ao2mo(self, mo_coeff=None): from pyscf.pbc import tools with_df = self._scf.with_df kpt = self._scf.kpt def ao2mofn(mo_coeff): nao, nmo = mo_coeff.shape mo_a = mo_coeff[:nao//2] mo_b = mo_coeff[nao//2:] orbspin = getattr(mo_coeff, 'orbspin', None) if orbspin is None: eri = with_df.ao2mo(mo_a, kpt, compact=False) eri += with_df.ao2mo(mo_b, kpt, compact=False) eri1 = with_df.ao2mo((mo_a,mo_a,mo_b,mo_b), kpt, compact=False) eri += eri1 eri += eri1.T eri = eri.reshape([nmo]*4) else: mo = mo_a + mo_b eri = with_df.ao2mo(mo, kpt, compact=False).reshape([nmo]*4) sym_forbid = (orbspin[:,None] != orbspin) eri[sym_forbid,:,:] = 0 eri[:,:,sym_forbid] = 0 return eri # _scf.exxdiv affects eris.fock. HF exchange correction should be # excluded from the Fock matrix. with lib.temporary_env(self._scf, exxdiv=None): eris = gccsd._make_eris_incore(self, mo_coeff, ao2mofn=ao2mofn) #if mo_coeff is self._scf.mo_coeff: # eris.mo_energy = self._scf.mo_energy[self.get_frozen_mask()] #else: madelung = tools.madelung(self._scf.cell, self._scf.kpt) eris.mo_energy = _adjust_occ(eris.mo_energy, eris.nocc, -madelung) return eris
def ao2mo(self, mo_coeff=None): with_df = self._scf.with_df kpt = self._scf.kpt def ao2mofn(mo_coeff): nao, nmo = mo_coeff.shape mo_a = mo_coeff[:nao // 2] mo_b = mo_coeff[nao // 2:] orbspin = getattr(mo_coeff, 'orbspin', None) if orbspin is None: eri = with_df.ao2mo(mo_a, kpt, compact=False) eri += with_df.ao2mo(mo_b, kpt, compact=False) eri1 = with_df.ao2mo((mo_a, mo_a, mo_b, mo_b), kpt, compact=False) eri += eri1 eri += eri1.T eri = eri.reshape([nmo] * 4) else: mo = mo_a + mo_b eri = with_df.ao2mo(mo, kpt, compact=False).reshape([nmo] * 4) sym_forbid = (orbspin[:, None] != orbspin) eri[sym_forbid, :, :] = 0 eri[:, :, sym_forbid] = 0 return eri return gccsd._make_eris_incore(self, mo_coeff, ao2mofn=ao2mofn)
def ao2mo(self, mo_coeff=None): from pyscf.pbc import tools with_df = self._scf.with_df kpt = self._scf.kpt def ao2mofn(mo_coeff): nao, nmo = mo_coeff.shape mo_a = mo_coeff[:nao//2] mo_b = mo_coeff[nao//2:] orbspin = getattr(mo_coeff, 'orbspin', None) if orbspin is None: eri = with_df.ao2mo(mo_a, kpt, compact=False) eri += with_df.ao2mo(mo_b, kpt, compact=False) eri1 = with_df.ao2mo((mo_a,mo_a,mo_b,mo_b), kpt, compact=False) eri += eri1 eri += eri1.T eri = eri.reshape([nmo]*4) else: mo = mo_a + mo_b eri = with_df.ao2mo(mo, kpt, compact=False).reshape([nmo]*4) sym_forbid = (orbspin[:,None] != orbspin) eri[sym_forbid,:,:] = 0 eri[:,:,sym_forbid] = 0 return eri # _scf.exxdiv affects eris.fock. HF exchange correction should be # excluded from the Fock matrix. with lib.temporary_env(self._scf, exxdiv=None): eris = gccsd._make_eris_incore(self, mo_coeff, ao2mofn=ao2mofn) #if mo_coeff is self._scf.mo_coeff: # eris.mo_energy = self._scf.mo_energy[self.get_frozen_mask()] #else: madelung = tools.madelung(self._scf.cell, self._scf.kpt) eris.mo_energy = _adjust_occ(eris.mo_energy, eris.nocc, -madelung) return eris
def test_ERIS(self): gcc = gccsd.GCCSD(mf, frozen=4) numpy.random.seed(9) mo_coeff0 = numpy.random.random(mf.mo_coeff.shape) - .9 nao = mo_coeff0.shape[0] // 2 orbspin = numpy.array([ 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 ]) mo_coeff0[nao:, orbspin == 0] = 0 mo_coeff0[:nao, orbspin == 1] = 0 mo_coeff1 = mo_coeff0.copy() mo_coeff1[-1, 0] = 1e-12 eris = gccsd._make_eris_incore(gcc, mo_coeff0) self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9) self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9) self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9) self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9) self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9) self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9) eris = gccsd._make_eris_outcore(gcc, mo_coeff0) self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9) self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9) self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9) self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9) self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9) self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9) eris = gccsd._make_eris_incore(gcc, mo_coeff1) self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9) self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9) self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9) self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9) self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9) self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9) gcc.max_memory = 0 eris = gcc.ao2mo(mo_coeff1) self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9) self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9) self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9) self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9) self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9) self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9)
def test_ERIS(self): gcc = gccsd.GCCSD(mf, frozen=4) numpy.random.seed(9) mo_coeff0 = numpy.random.random(mf.mo_coeff.shape) - .9 nao = mo_coeff0.shape[0]//2 orbspin = numpy.array([0,1,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,1]) mo_coeff0[nao:,orbspin==0] = 0 mo_coeff0[:nao,orbspin==1] = 0 mo_coeff1 = mo_coeff0.copy() mo_coeff1[-1,0] = 1e-12 eris = gccsd._make_eris_incore(gcc, mo_coeff0) self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9) self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9) self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9) self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9) self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9) self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9) eris = gccsd._make_eris_outcore(gcc, mo_coeff0) self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9) self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9) self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9) self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9) self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9) self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9) eris = gccsd._make_eris_incore(gcc, mo_coeff1) self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9) self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9) self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9) self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9) self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9) self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9) gcc.max_memory = 0 eris = gcc.ao2mo(mo_coeff1) self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9) self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9) self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9) self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9) self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9) self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9)
def ao2mo(self, mo_coeff=None): nmo = self.nmo mem_incore = nmo**4*2 * 8/1e6 mem_now = lib.current_memory()[0] if (self._scf._eri is not None and (mem_incore+mem_now < self.max_memory) or self.mol.incore_anyway): return gccsd._make_eris_incore(self, mo_coeff) elif getattr(self._scf, 'with_df', None): raise NotImplementedError else: return gccsd._make_eris_outcore(self, mo_coeff)
def ao2mo(self, mo_coeff=None): nmo = self.nmo mem_incore = nmo**4*2 * 8/1e6 mem_now = lib.current_memory()[0] if (self._scf._eri is not None and (mem_incore+mem_now < self.max_memory) or self.mol.incore_anyway): return gccsd._make_eris_incore(self, mo_coeff) elif getattr(self._scf, 'with_df', None): raise NotImplementedError else: return gccsd._make_eris_outcore(self, mo_coeff)
def test_rdm_complex(self): mol = gto.M() mol.verbose = 0 nocc = 6 nvir = 8 mf = scf.GHF(mol) nmo = nocc + nvir numpy.random.seed(1) eri = (numpy.random.random((nmo,nmo,nmo,nmo)) + numpy.random.random((nmo,nmo,nmo,nmo))* 1j - (.5+.5j)) eri = eri + eri.transpose(1,0,3,2).conj() eri = eri + eri.transpose(2,3,0,1) eri *= .1 def get_jk(mol, dm, *args,**kwargs): vj = numpy.einsum('ijkl,lk->ij', eri, dm) vk = numpy.einsum('ijkl,jk->il', eri, dm) return vj, vk def get_veff(mol, dm, *args, **kwargs): vj, vk = get_jk(mol, dm) return vj - vk def ao2mofn(mos): return eri mf.get_jk = get_jk mf.get_veff = get_veff hcore = numpy.random.random((nmo,nmo)) * .2 + numpy.random.random((nmo,nmo))* .2j hcore = hcore + hcore.T.conj() + numpy.diag(range(nmo))*2 mf.get_hcore = lambda *args: hcore mf.get_ovlp = lambda *args: numpy.eye(nmo) orbspin = numpy.zeros(nmo, dtype=int) orbspin[1::2] = 1 mf.mo_coeff = lib.tag_array(numpy.eye(nmo) + 0j, orbspin=orbspin) mf.mo_occ = numpy.zeros(nmo) mf.mo_occ[:nocc] = 1 mf.e_tot = mf.energy_elec(mf.make_rdm1(), hcore)[0] mycc = cc.GCCSD(mf) eris = gccsd._make_eris_incore(mycc, mf.mo_coeff, ao2mofn) mycc.ao2mo = lambda *args, **kwargs: eris mycc.kernel(eris=eris) mycc.solve_lambda(eris=eris) dm1 = mycc.make_rdm1() dm2 = mycc.make_rdm2() e1 = numpy.einsum('ij,ji', hcore, dm1) e1+= numpy.einsum('ijkl,ijkl', eri, dm2) * .5 self.assertAlmostEqual(e1, mycc.e_tot, 7) self.assertAlmostEqual(abs(dm2-dm2.transpose(1,0,3,2).conj()).max(), 0, 9) self.assertAlmostEqual(abs(dm2-dm2.transpose(2,3,0,1) ).max(), 0, 9) self.assertAlmostEqual(abs(dm2+dm2.transpose(2,1,0,3) ).max(), 0, 9) self.assertAlmostEqual(abs(dm2+dm2.transpose(0,3,2,1) ).max(), 0, 9)