def test_ao2mo_7d(self): L = 3. n = 6 cell = pgto.Cell() cell.a = numpy.diag([L, L, L]) cell.mesh = [n, n, n] cell.atom = '''He 2. 2.2 2. He 1.2 1. 1.''' cell.basis = {'He': [[0, (1.2, 1)], [1, (0.6, 1)]]} cell.verbose = 0 cell.build(0, 0) kpts = cell.make_kpts([1, 3, 1]) nkpts = len(kpts) nao = cell.nao_nr() numpy.random.seed(1) mo = (numpy.random.random((nkpts, nao, nao)) + numpy.random.random( (nkpts, nao, nao)) * 1j) with_df = rsdf.RSDF(cell, kpts) out = with_df.ao2mo_7d(mo, kpts) ref = numpy.empty_like(out) kconserv = kpts_helper.get_kconserv(cell, kpts) for ki, kj, kk in kpts_helper.loop_kkk(nkpts): kl = kconserv[ki, kj, kk] tmp = with_df.ao2mo((mo[ki], mo[kj], mo[kk], mo[kl]), kpts[[ki, kj, kk, kl]]) ref[ki, kj, kk] = tmp.reshape([nao] * 4) self.assertAlmostEqual(abs(out - ref).max(), 0, 12)
def setUpModule(): global cell, mf0, kmdf, kpts L = 5. n = 11 cell = pgto.Cell() cell.a = numpy.diag([L, L, L]) cell.mesh = numpy.array([n, n, n]) cell.atom = '''He 3. 2. 3. He 1. 1. 1.''' cell.basis = 'ccpvdz' cell.verbose = 0 cell.max_memory = 1000 cell.build(0, 0) mf0 = pscf.RHF(cell) mf0.exxdiv = 'vcut_sph' numpy.random.seed(1) kpts = numpy.random.random((5, 3)) kpts[0] = 0 kpts[3] = kpts[0] - kpts[1] + kpts[2] kpts[4] *= 1e-5 kmdf = rsdf.RSDF(cell) kmdf.linear_dep_threshold = 1e-7 kmdf.auxbasis = 'weigend' kmdf.kpts = kpts
def test_get_eri_gamma(self): odf = rsdf.RSDF(cell) odf.linear_dep_threshold = 1e-7 odf.auxbasis = 'weigend' eri0000 = odf.get_eri() self.assertTrue(eri0000.dtype == numpy.double) self.assertAlmostEqual(eri0000.real.sum(), 41.6128153879698, 7) self.assertAlmostEqual(lib.fp(eri0000), 1.998147596746171, 7) eri1111 = kmdf.get_eri((kpts[0], kpts[0], kpts[0], kpts[0])) self.assertTrue(eri1111.dtype == numpy.double) self.assertAlmostEqual(eri1111.real.sum(), 41.61281538796979, 7) self.assertAlmostEqual(eri1111.imag.sum(), 0, 7) self.assertAlmostEqual(lib.fp(eri1111), 1.9981475967461677, 7) self.assertAlmostEqual(abs(eri1111 - eri0000).max(), 0, 7) eri4444 = kmdf.get_eri((kpts[4], kpts[4], kpts[4], kpts[4])) self.assertTrue(eri4444.dtype == numpy.complex128) self.assertAlmostEqual(eri4444.real.sum(), 62.55123862990809, 7) self.assertAlmostEqual( abs(eri4444.imag).sum(), 1.8446941199052448e-07, 7) self.assertAlmostEqual(lib.fp(eri4444), 0.6205986625996083 - 6.3855069621608306e-09j, 8) eri0000 = ao2mo.restore(1, eri0000, cell.nao_nr()).reshape(eri4444.shape) self.assertAlmostEqual(abs(eri0000 - eri4444).max(), 0, 4)
def test_k_kpts_2(self): cell = pgto.Cell() cell.atom = 'He 1. .5 .5; He .1 1.3 2.1' cell.basis = {'He': [(0, (2.5, 1)), (0, (1., 1))]} cell.a = numpy.eye(3) * 2.5 cell.mesh = [11] * 3 cell.build() kpts = cell.get_abs_kpts([[-.25,-.25,-.25], [-.25,-.25, .25], [-.25, .25,-.25], [-.25, .25, .25], [ .25,-.25,-.25], [ .25,-.25, .25], [ .25, .25,-.25], [ .25, .25, .25]]) mydf = rsdf.RSDF(cell).set(auxbasis='weigend') mydf.linear_dep_threshold = 1e-7 mydf.kpts = kpts mydf.auxbasis = {'He': [(0, (4.096, 1)), (0, (2.56, 1)), (0, (1.6, 1)), (0, (1., 1))]} mydf.exxdiv = None mydf.omega = 0.3 mydf.exp_to_discard = 0.3 nao = cell.nao_nr() numpy.random.seed(1) dm = numpy.random.random((8,nao,nao)) dm = dm + dm.transpose(0,2,1) vk = df_jk.get_k_kpts(mydf, dm, 1, mydf.kpts) self.assertAlmostEqual(lib.fp(vk[0]), (1.0940331326660724 -0.01474246983191657j ), 7) self.assertAlmostEqual(lib.fp(vk[1]), (0.72106828546205248+0.008683360062569572j), 7) self.assertAlmostEqual(lib.fp(vk[2]), (0.89868267009698988-0.011091489111877838j), 7) self.assertAlmostEqual(lib.fp(vk[3]), (1.2604941401190835 +0.015979544115384041j), 7) self.assertAlmostEqual(lib.fp(vk[4]), (1.0492129520812594 -0.012424653667344821j), 7) self.assertAlmostEqual(lib.fp(vk[5]), (0.99271107721956797+0.012696925711370165j), 7) self.assertAlmostEqual(lib.fp(vk[6]), (0.92184754518871648-0.012035727588110348j), 7) self.assertAlmostEqual(lib.fp(vk[7]), (0.8518483148628242 +0.010084767506077213j), 7)
def density_fit(mf, auxbasis=None, mesh=None, with_df=None): '''Generate density-fitting SCF object Args: auxbasis : str or basis dict Same format to the input attribute mol.basis. If auxbasis is None, auxiliary basis based on AO basis (if possible) or even-tempered Gaussian basis will be used. mesh : tuple number of grids in each direction with_df : DF object ''' from pyscf.pbc.df import rsdf if with_df is None: if getattr(mf, 'kpts', None) is not None: kpts = mf.kpts else: kpts = numpy.reshape(mf.kpt, (1,3)) with_df = rsdf.RSDF(mf.cell, kpts) with_df.max_memory = mf.max_memory with_df.stdout = mf.stdout with_df.verbose = mf.verbose with_df.auxbasis = auxbasis if mesh is not None: with_df.mesh = mesh mf = copy.copy(mf) mf.with_df = with_df mf._eri = None return mf
def test_k_kpts_1(self): cell = pgto.Cell() cell.atom = 'He 1. .5 .5; He .1 1.3 2.1' cell.basis = {'He': [(0, (2.5, 1)), (0, (1., 1))]} cell.a = numpy.eye(3) * 2.5 cell.mesh = [11] * 3 cell.build() kpts = cell.get_abs_kpts([[-.25,-.25,-.25], [-.25,-.25, .25], [-.25, .25,-.25], [-.25, .25, .25], [ .25,-.25,-.25], [ .25,-.25, .25], [ .25, .25,-.25], [ .25, .25, .25]]) numpy.random.seed(1) nao = cell.nao_nr() dm = numpy.random.random((8,nao,nao)) mydf = rsdf.RSDF(cell).set(auxbasis='weigend') mydf.linear_dep_threshold = 1e-7 mydf.kpts = kpts mydf.auxbasis = {'He': [(0, (4.096, 1)), (0, (2.56, 1)), (0, (1.6, 1)), (0, (1., 1))]} mydf.exxdiv = None mydf.omega = 0.3 mydf.exp_to_discard = 0.3 vk = df_jk.get_k_kpts(mydf, dm, 0, mydf.kpts) self.assertAlmostEqual(lib.fp(vk[0]), (0.54220010040518218-0.00787204295681934j ), 7) self.assertAlmostEqual(lib.fp(vk[1]), (0.35987105007103914+0.0036047438452865574j), 7) self.assertAlmostEqual(lib.fp(vk[2]), (0.46287057223452965-0.0065045318150024475j), 7) self.assertAlmostEqual(lib.fp(vk[3]), (0.63677390788341914+0.0075132081533213447j), 7) self.assertAlmostEqual(lib.fp(vk[4]), (0.53680188658523353-0.0076414750780774933j), 7) self.assertAlmostEqual(lib.fp(vk[5]), (0.49613855046499666+0.0060603767383680838j), 7) self.assertAlmostEqual(lib.fp(vk[6]), (0.45430752211150049-0.0068611602260866128j), 7) self.assertAlmostEqual(lib.fp(vk[7]), (0.41856931218763038+0.0051073315205987522j), 7)
def test_jk_hermi0_high_cost(self): numpy.random.seed(12) nao = cell.nao_nr() dm = numpy.random.random((nao,nao)) dm = dm + dm.T dm[:2,-3:] *= .5 jkdf = rsdf.RSDF(cell).set(auxbasis='weigend') jkdf.linear_dep_threshold = 1e-7 jkdf.omega = 0.3 jkdf.exp_to_discard = 0.3 vj0, vk0 = jkdf.get_jk(dm, hermi=0, exxdiv=None) ej0 = numpy.einsum('ij,ji->', vj0, dm) ek0 = numpy.einsum('ij,ji->', vk0, dm) self.assertAlmostEqual(ej0, 242.0415113546338546, 7) self.assertAlmostEqual(ek0, 280.5844313219625974, 7)
def test_jk_hermi0(self): numpy.random.seed(12) nao = cell0.nao_nr() dm = numpy.random.random((nao,nao)) dm = dm + dm.T dm[:2,-3:] *= .5 jkdf = rsdf.RSDF(cell0).set(auxbasis='weigend') jkdf.linear_dep_threshold = 1e-7 jkdf.omega = 0.3 jkdf.exp_to_discard = 0.3 vj0, vk0 = jkdf.get_jk(dm, hermi=0, exxdiv=None) ej0 = numpy.einsum('ij,ji->', vj0, dm) ek0 = numpy.einsum('ij,ji->', vk0, dm) self.assertAlmostEqual(ej0, 25.7750081387043, 7) self.assertAlmostEqual(ek0, 30.8140235220774, 7)
def test_eri1111(self): kpts = numpy.random.random((4, 3)) * .25 kpts[3] = -numpy.einsum('ij->j', kpts[:3]) with_df = rsdf.RSDF(cell).set(auxbasis='weigend') with_df.linear_dep_threshold = 1e-7 with_df.kpts = kpts mo = (numpy.random.random((nao, nao)) + numpy.random.random( (nao, nao)) * 1j) eri = with_df.get_eri(kpts).reshape((nao, ) * 4) eri0 = numpy.einsum('pjkl,pi->ijkl', eri, mo.conj()) eri0 = numpy.einsum('ipkl,pj->ijkl', eri0, mo) eri0 = numpy.einsum('ijpl,pk->ijkl', eri0, mo.conj()) eri0 = numpy.einsum('ijkp,pl->ijkl', eri0, mo) eri1 = with_df.ao2mo(mo, kpts) self.assertAlmostEqual( abs(eri1.reshape(eri0.shape) - eri0).sum(), 0, 9)
def test_j_kpts_high_cost(self): numpy.random.seed(1) nao = cell.nao_nr() dm = numpy.random.random((4,nao,nao)) dm = dm + dm.transpose(0,2,1) mydf = rsdf.RSDF(cell).set(auxbasis='weigend') mydf.linear_dep_threshold = 1e-7 mydf.kpts = numpy.random.random((4,3)) mydf.auxbasis = 'weigend' mydf.omega = 0.3 mydf.exp_to_discard = 0.3 vj = df_jk.get_j_kpts(mydf, dm, 1, mydf.kpts) self.assertAlmostEqual(lib.fp(vj[0]), (0.4917612920404451 + -0.1189108415838486j), 7) self.assertAlmostEqual(lib.fp(vj[1]), (0.5490079977477804 + -0.0460035459549861j), 7) self.assertAlmostEqual(lib.fp(vj[2]), (0.5364805888399165 + -0.0835075280950256j), 7) self.assertAlmostEqual(lib.fp(vj[3]), (0.5489645342271054 + 0.0076957400601779j), 7)
def test_j_kpts(self): numpy.random.seed(1) nao = cell0.nao_nr() dm = numpy.random.random((4,nao,nao)) dm = dm + dm.transpose(0,2,1) mydf = rsdf.RSDF(cell0).set(auxbasis='weigend') mydf.linear_dep_threshold = 1e-7 mydf.kpts = numpy.random.random((4,3)) mydf.auxbasis = 'weigend' mydf.omega = 0.3 mydf.exp_to_discard = 0.3 vj = df_jk.get_j_kpts(mydf, dm, 1, mydf.kpts) self.assertAlmostEqual(lib.fp(vj[0]), (7.240207870630442-0.001010622364950332j) , 7) self.assertAlmostEqual(lib.fp(vj[1]), (7.248745538469966-0.001562604522803734j) , 7) self.assertAlmostEqual(lib.fp(vj[2]), (7.241193241602369-0.002518439407055759j) , 7) self.assertAlmostEqual(lib.fp(vj[3]), (7.2403591406956185+0.001475803952777666j), 7)
def test_k_kpts_high_cost(self): numpy.random.seed(1) nao = cell.nao_nr() dm = numpy.random.random((4,nao,nao)) dm = dm + dm.transpose(0,2,1) mydf = rsdf.RSDF(cell).set(auxbasis='weigend') mydf.linear_dep_threshold = 1e-7 mydf.kpts = numpy.random.random((4,3)) mydf.exxdiv = None mydf.omega = 0.3 mydf.exp_to_discard = 0.3 mydf.auxbasis = 'weigend' vk = df_jk.get_k_kpts(mydf, dm, 0, mydf.kpts) self.assertAlmostEqual(lib.fp(vk[0]), (-2.8332378458006682 + -1.0578692394119324j), 7) self.assertAlmostEqual(lib.fp(vk[1]), (-7.4404313581193380 + 0.1023364493364826j), 7) self.assertAlmostEqual(lib.fp(vk[2]), (-2.5718854219888430 + -1.4487422365382123j), 7) self.assertAlmostEqual(lib.fp(vk[3]), (-0.7922307287610381 + 0.0116940681352038j), 7)
def test_k_kpts(self): numpy.random.seed(1) nao = cell0.nao_nr() dm = numpy.random.random((4,nao,nao)) dm = dm + dm.transpose(0,2,1) mydf = rsdf.RSDF(cell0).set(auxbasis='weigend') mydf.linear_dep_threshold = 1e-7 mydf.kpts = numpy.random.random((4,3)) mydf.exxdiv = None mydf.omega = 0.3 mydf.exp_to_discard = 0.3 mydf.auxbasis = 'weigend' vk = df_jk.get_k_kpts(mydf, dm, 0, mydf.kpts) self.assertAlmostEqual(lib.fp(vk[0]), (4.831027586092549-0.12376435978940196j) , 7) self.assertAlmostEqual(lib.fp(vk[1]), (4.783208264204395-0.00585421470169705j) , 7) self.assertAlmostEqual(lib.fp(vk[2]), (4.823839360632854+0.002511545727704362j), 7) self.assertAlmostEqual(lib.fp(vk[3]), (4.833891390413435+0.0208696082684768j) , 7)
def test_jk_single_kpt_high_cost(self): mf0 = pscf.RHF(cell) mf0.exxdiv = None mf = rsdf_jk.density_fit(mf0, auxbasis='weigend', mesh=(11,)*3) mf.with_df.mesh = cell.mesh mf.with_df.omega = 0.3 mf.with_df.exp_to_discard = 0.3 dm = mf.get_init_guess() vj, vk = mf.get_jk(cell, dm) ej1 = numpy.einsum('ij,ji->', vj, dm) ek1 = numpy.einsum('ij,ji->', vk, dm) j_ref = 48.283789539266174 # rsjk result k_ref = 32.30441176447805 # rsjk result self.assertAlmostEqual(ej1, j_ref, 4) self.assertAlmostEqual(ek1, k_ref, 2) self.assertAlmostEqual(ej1, 48.2837455394308037, 7) self.assertAlmostEqual(ek1, 32.3026087105977950, 7) numpy.random.seed(12) nao = cell.nao_nr() dm = numpy.random.random((nao,nao)) dm = dm + dm.T vj1, vk1 = mf.get_jk(cell, dm, hermi=0) ej1 = numpy.einsum('ij,ji->', vj1, dm) ek1 = numpy.einsum('ij,ji->', vk1, dm) self.assertAlmostEqual(ej1, 242.0467816643269714, 7) self.assertAlmostEqual(ek1, 280.1593488661793572, 7) numpy.random.seed(1) kpt = numpy.random.random(3) mydf = rsdf.RSDF(cell, [kpt]).set(auxbasis='weigend') mydf.linear_dep_threshold = 1e-7 mydf.omega = 0.3 mydf.exp_to_discard = 0.3 vj, vk = mydf.get_jk(dm, 1, kpt, exxdiv=None) ej1 = numpy.einsum('ij,ji->', vj, dm) ek1 = numpy.einsum('ij,ji->', vk, dm) self.assertAlmostEqual(ej1, 241.1512182675005249+0j, 7) self.assertAlmostEqual(ek1, 279.6464915858919085+0j, 7) vj, vk = mydf.get_jk(dm, 1, kpt, with_j=False, exxdiv='ewald') ek1 = numpy.einsum('ij,ji->', vk, dm) self.assertAlmostEqual(ek1, 691.6462442086188958+0j, 6)
def test_eri0000(self): with_df = rsdf.RSDF(cell).set(auxbasis='weigend') with_df.linear_dep_threshold = 1e-7 with_df.kpts = numpy.zeros((4, 3)) mo = (numpy.random.random((nao, nao)) + numpy.random.random( (nao, nao)) * 1j) eri = ao2mo.restore(1, with_df.get_eri(with_df.kpts), nao) eri0 = numpy.einsum('pjkl,pi->ijkl', eri, mo.conj()) eri0 = numpy.einsum('ipkl,pj->ijkl', eri0, mo) eri0 = numpy.einsum('ijpl,pk->ijkl', eri0, mo.conj()) eri0 = numpy.einsum('ijkp,pl->ijkl', eri0, mo) eri1 = with_df.ao2mo(mo, with_df.kpts) self.assertAlmostEqual( abs(eri1.reshape(eri0.shape) - eri0).sum(), 0, 9) mo = mo.real eri0 = numpy.einsum('pjkl,pi->ijkl', eri, mo.conj()) eri0 = numpy.einsum('ipkl,pj->ijkl', eri0, mo) eri0 = numpy.einsum('ijpl,pk->ijkl', eri0, mo.conj()) eri0 = numpy.einsum('ijkp,pl->ijkl', eri0, mo) eri1 = with_df.ao2mo(mo, with_df.kpts, compact=False) self.assertAlmostEqual( abs(eri1.reshape(eri0.shape) - eri0).sum(), 0, 9)
cell.basis = 'ccpvdz' cell.verbose = 0 cell.max_memory = 1000 cell.build(0,0) mf0 = pscf.RHF(cell) mf0.exxdiv = 'vcut_sph' numpy.random.seed(1) kpts = numpy.random.random((5,3)) kpts[0] = 0 kpts[3] = kpts[0]-kpts[1]+kpts[2] kpts[4] *= 1e-5 kmdf = rsdf.RSDF(cell) kmdf.linear_dep_threshold = 1e-7 kmdf.auxbasis = 'weigend' kmdf.kpts = kpts def tearDownModule(): global cell, mf0, kmdf del cell, mf0, kmdf class KnownValues(unittest.TestCase): def test_get_eri_gamma(self): odf = rsdf.RSDF(cell) odf.linear_dep_threshold = 1e-7 odf.auxbasis = 'weigend' eri0000 = odf.get_eri()