def test_rohf(self): pmol = mol.copy() pmol.charge = 1 pmol.spin = 1 pmol.build(False, False) mf = scf.density_fit(scf.ROHF(pmol)) self.assertAlmostEqual(mf.scf(), -75.626515724371814, 9)
def test_rohf(self): pmol = mol.copy() pmol.charge = 1 pmol.spin = 1 pmol.build(False, False) mf = scf.density_fit(scf.ROHF(pmol), auxbasis='weigend') self.assertAlmostEqual(mf.scf(), -75.626515724371814, 9)
def test_uhf_veff(self): mf = scf.density_fit(scf.UHF(mol), auxbasis='weigend') nao = mol.nao_nr() numpy.random.seed(1) dm = numpy.random.random((2,4,nao,nao)) vhf = mf.get_veff(mol, dm, hermi=0) self.assertAlmostEqual(numpy.linalg.norm(vhf), 413.82341595365853, 9)
def test_cc(): # pragma: nocover from pyscf import gto from pyscf import scf mol = gto.Mole() mol.atom = [[8, (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]] mol.basis = { 'H': '3-21g', 'O': '3-21g', } mol.build() rhf = scf.RHF(mol) rhf = scf.density_fit(scf.RHF(mol)) rhf.scf() # -76.0267656731 from tcc.rccsd_mul import RCCSD_MUL_RI from tcc.rccsd_cpd import RCCSD_CPD_LS_T from tcc.cc_solvers import (residual_diis_solver, classic_solver, root_solver) cc1 = RCCSD_CPD_LS_T(rhf, rankt={'t2': 20}) cc2 = RCCSD_MUL_RI(rhf) converged1, energy1, amps1 = classic_solver(cc1, max_cycle=150) converged2, energy2, amps2 = classic_solver(cc2, max_cycle=150)
def test_uhf_veff(self): mf = scf.density_fit(scf.UHF(mol)) nao = mol.nao_nr() numpy.random.seed(1) dm = numpy.random.random((4,nao,nao)) vhf = mf.get_veff(mol, dm, hermi=0) self.assertAlmostEqual(numpy.linalg.norm(vhf), 188.34081056589872, 9)
def test_cc_unit(): # pragma: nocover from pyscf import gto from pyscf import scf mol = gto.Mole() mol.atom = [[8, (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]] mol.basis = { 'H': '3-21g', 'O': '3-21g', } mol.build() rhf = scf.RHF(mol) rhf = scf.density_fit(scf.RHF(mol)) rhf.scf() from tcc.rccsdt_ri import RCCSDT_UNIT_RI from tcc.cc_solvers import (classic_solver, update_diis_solver) cc = RCCSDT_UNIT_RI(rhf) converged, energy, amps = classic_solver(cc, conv_tol_energy=1e-8, max_cycle=100) cc._converged = False converged, energy, amps = update_diis_solver(cc, conv_tol_energy=1e-8, max_cycle=100) print('dE: {}'.format(energy - -1.304738e-01))
def test_uhf_veff(self): mf = scf.density_fit(scf.UHF(mol), auxbasis='weigend') nao = mol.nao_nr() numpy.random.seed(1) dm = numpy.random.random((2, 4, nao, nao)) vhf = mf.get_veff(mol, dm, hermi=0) self.assertAlmostEqual(numpy.linalg.norm(vhf), 413.82341595365853, 9)
def test_uhf_veff(self): mf = scf.density_fit(scf.UHF(mol)) nao = mol.nao_nr() numpy.random.seed(1) dm = numpy.random.random((4, nao, nao)) vhf = mf.get_veff(mol, dm, hermi=0) self.assertAlmostEqual(numpy.linalg.norm(vhf), 199.20550115531233, 9)
def test_cc_t2f(): # pragma: nocover from pyscf import gto from pyscf import scf mol = gto.Mole() mol.atom = [ [8, (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]] mol.basis = {'H': '3-21g', 'O': '3-21g', } mol.build() rhf = scf.RHF(mol) rhf.scf() rhfri = scf.density_fit(scf.RHF(mol)) rhfri.scf() from tcc.rccsdt import RCCSDT, RCCSDT_UNIT from tcc.rccsdt_cpd import (RCCSDT_UNIT_nCPD_LS_T, RCCSDT_UNIT_nCPD_T_LS_T) from tcc.cc_solvers import (classic_solver, step_solver) cc1 = RCCSDT_UNIT(rhf) cc2 = RCCSDT_UNIT_nCPD_T_LS_T(rhfri, rankt={'t3': 40}) converged1, energy1, amps1 = classic_solver( cc1, conv_tol_energy=1e-7, lam=3, max_cycle=100) converged2, energy2, amps2 = step_solver( cc2, conv_tol_energy=1e-7, beta=1 - 1 / 5, max_cycle=100) print('E(full) - E(T2 CPD): {}'.format(energy2 - energy1))
def test_rccsd_mul_ri(self): from pyscf import gto from pyscf import scf mol = gto.Mole() mol.atom = [[8, (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]] mol.basis = { 'H': 'sto-3g', 'O': 'sto-3g', } mol.build(parse_arg=False) rhfri = scf.density_fit(scf.RHF(mol)) rhfri.scf() # -74.961181409648674 from tcc.cc_solvers import classic_solver from tcc.rccsd_mul import RCCSD_MUL_RI cc = RCCSD_MUL_RI(rhfri) converged, energy, _ = classic_solver(cc, conv_tol_amps=1e-8, conv_tol_energy=1e-8) self.assertEqual(np.allclose(energy, -0.049399404240317468, 1e-6), True)
def test_rccsd_cpd_true(): from pyscf import gto from pyscf import scf mol = gto.Mole() mol.atom = [[8, (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]] mol.basis = '3-21g' mol.build() rhf_ri = scf.density_fit(scf.RHF(mol)) rhf_ri.scf() from tcc.rccsd_cpd import (RCCSD_CPD_LS_T, RCCSD_CPD_LS_T_TRUE) cc1 = RCCSD_CPD_LS_T(rhf_ri, rankt={'t2': 30}) cc2 = RCCSD_CPD_LS_T_TRUE(rhf_ri, rankt={'t2': 30}) from tcc.cc_solvers import (update_diis_solver, classic_solver) converged1, energy1, amps1 = update_diis_solver(cc1, conv_tol_energy=1e-8, conv_tol_res=1e-8, beta=0.666, max_cycle=140) converged2, energy2, amps2 = update_diis_solver(cc2, conv_tol_energy=1e-8, conv_tol_res=1e-8, beta=0.666, max_cycle=140)
def test_assign_cderi(self): nao = mol.nao_nr() w, u = scipy.linalg.eigh(mol.intor('int2e_sph', aosym='s4')) idx = w > 1e-9 mf = scf.density_fit(scf.UHF(mol), auxbasis='weigend') mf._cderi = (u[:, idx] * numpy.sqrt(w[idx])).T.copy() self.assertAlmostEqual(mf.kernel(), -76.026765673110447, 9)
def test_rohf_symm(self): pmol = mol.copy() pmol.charge = 1 pmol.spin = 1 pmol.symmetry = 1 pmol.build(False, False) mf = scf.density_fit(scf.ROHF(pmol), auxbasis='weigend') self.assertAlmostEqual(mf.scf(), -75.626515724371814, 9)
def test_assign_cderi(self): nao = mol.nao_nr() w, u = scipy.linalg.eigh(mol.intor('int2e_sph', aosym='s4')) idx = w > 1e-9 mf = scf.density_fit(scf.UHF(mol), auxbasis='weigend') mf._cderi = (u[:,idx] * numpy.sqrt(w[idx])).T.copy() self.assertAlmostEqual(mf.kernel(), -76.026765673110447, 9)
def test_rohf_symm(self): pmol = mol.copy() pmol.charge = 1 pmol.spin = 1 pmol.symmetry = 1 pmol.build(False, False) mf = scf.density_fit(scf.ROHF(pmol)) self.assertAlmostEqual(mf.scf(), -75.626515724371814, 9)
def run_ccsd(): basis = BASIS dists = DISTS_REFERENCE.copy() lambdas = LAMBDAS_REFERENCE.copy() def make_mol(dist): from pyscf import gto mol = gto.Mole() mol.atom = [[7, (0., 0., 0.)], [7, (0., 0., dist)]] mol.basis = {'N': basis} mol.build() return mol mols = [make_mol(dist) for dist in dists] # Run all scfs here so we will have same starting points for CC run_scfs(mols, 'reference/{}/scfs_different_dist.p'.format(basis)) with open('reference/{}/scfs_different_dist.p'.format(basis), 'rb') as fp: ref_scfs = pickle.load(fp) from tcc.rccsd_mul import RCCSD_MUL_RI energies = [] amps = None for idxd, (dist, curr_scf) in enumerate(zip(dists, ref_scfs)): tim = time.process_time() rhf = scf.density_fit(scf.RHF(mols[idxd])) rhf.max_cycle = 1 rhf.scf() e_scf, mo_coeff, mo_energy = curr_scf cc = RCCSD_MUL_RI(rhf, mo_coeff=mo_coeff, mo_energy=mo_energy) converged, energy, amps = residual_diis_solver(cc, conv_tol_energy=1e-9, conv_tol_res=1e-8, max_cycle=500, verbose=logger.NOTE, amps=amps) energies.append(energy + e_scf) elapsed = time.process_time() - tim print('Step {} out of {}, dist = {}, time: {}\n'.format( idxd + 1, len(dists), dist, elapsed)) np.savetxt('reference/{}/RCCSD.txt'.format(basis), np.column_stack((dists, energies)), header='U E_total') # Plot from matplotlib import pyplot as plt fig, ax = plt.subplots() plt.plot(dists, energies) plt.xlabel('$D, \AA$') plt.ylabel('$E$, H') plt.title('Energy in RCCSD (RI)') fig.show()
def test_gto2sv_df(self): from pyscf import scf """ Test import of density-fitting Gaussian functions ... hm """ mf = scf.density_fit(scf.RHF(mol)) self.assertAlmostEqual(mf.scf(), -76.025936299702536, 2) sv = system_vars_c().init_pyscf_gto(mol) prod_log = prod_log_c().init_prod_log_df(mf.with_df.auxmol, sv) self.assertEqual(prod_log.rr[0], sv.ao_log.rr[0]) self.assertEqual(prod_log.pp[0], sv.ao_log.pp[0]) self.assertEqual(prod_log.nspecies, sv.ao_log.nspecies) self.assertEqual(prod_log.sp2charge, sv.ao_log.sp2charge)
def test_gto2sv_df(self): from pyscf import scf """ Test import of density-fitting Gaussian functions ... hm """ mf = scf.density_fit(scf.RHF(mol)) self.assertAlmostEqual(mf.scf(), -76.025936299702536, 2) sv = nao(gto=mol) prod_log = prod_log_c().init_prod_log_df(mf.with_df.auxmol, sv) self.assertEqual(prod_log.rr[0], sv.ao_log.rr[0]) self.assertEqual(prod_log.pp[0], sv.ao_log.pp[0]) self.assertEqual(prod_log.nspecies, sv.ao_log.nspecies) self.assertEqual(prod_log.sp2charge, sv.ao_log.sp2charge)
def test_gto2sv_df(self): from pyscf import scf """ Test import of density-fitting Gaussian functions ... hm """ mf = scf.density_fit(scf.RHF(mol)) self.assertAlmostEqual(mf.scf(), -76.025936299702536, 2) sv = nao(gto=mol) prod_log = prod_log_c(auxmol=mf.with_df.auxmol, nao=sv) self.assertEqual(prod_log.rr[0], sv.ao_log.rr[0]) self.assertEqual(prod_log.pp[0], sv.ao_log.pp[0]) self.assertEqual(prod_log.nspecies, sv.ao_log.nspecies) for a, b in zip(prod_log.sp2charge, sv.ao_log.sp2charge): self.assertEqual(a, b)
def test_assign_cderi(self): nao = molsym.nao_nr() w, u = scipy.linalg.eigh(mol.intor('cint2e_sph', aosym='s4')) idx = w > 1e-9 mf = scf.density_fit(scf.RHF(molsym)) mf._cderi = (u[:,idx] * numpy.sqrt(w[idx])).T.copy() mf.kernel() mc = mcscf.DFCASSCF(mf, 6, 6) mc.kernel() self.assertAlmostEqual(mc.e_tot, -108.98010545803884, 7)
def test_assign_cderi(self): nao = molsym.nao_nr() w, u = scipy.linalg.eigh(mol.intor('int2e_sph', aosym='s4')) idx = w > 1e-9 mf = scf.density_fit(scf.RHF(molsym)) mf._cderi = (u[:, idx] * numpy.sqrt(w[idx])).T.copy() mf.kernel() mc = mcscf.DFCASSCF(mf, 6, 6) mc.kernel() self.assertAlmostEqual(mc.e_tot, -108.98010545803884, 7)
def test_df_ao2mo(self): mf = scf.density_fit(msym) mf.max_memory = 100 mf.kernel() mc = mcscf.DFCASSCF(mf, 4, 4) eri0 = numpy.dot(mf._cderi.T, mf._cderi) nmo = mc.mo_coeff.shape[1] ncore = mc.ncore nocc = ncore + mc.ncas eri0 = ao2mo.restore(1, ao2mo.kernel(eri0, mc.mo_coeff), nmo) eris = mc.ao2mo(mc.mo_coeff) self.assertTrue(numpy.allclose(eri0[:,:,ncore:nocc,ncore:nocc], eris.ppaa)) self.assertTrue(numpy.allclose(eri0[:,ncore:nocc,:,ncore:nocc], eris.papa))
def test_nr_df_rohf(self): mol = gto.Mole() mol.build( verbose=0, atom=[["O", (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]], basis='cc-pvdz', charge=1, spin=1, ) mf = scf.density_fit(scf.ROHF(mol)) mf.conv_tol = 1e-11 self.assertAlmostEqual(mf.scf(), -75.626515724371899, 9)
def run_cc_ref(workdir): from pyscf.lib import logger print('Running CC') # Restore RHF object with open(workdir + 'rhf_results.p', 'rb') as fp: rhf_results = pickle.load(fp) e_tot, mo_coeff, mo_energy, atom = rhf_results mol = gto.Mole() mol.atom = atom mol.basis = BASIS mol.build() rhf = scf.density_fit(scf.RHF(mol)) rhf.max_cycle = 1 rhf.scf() # Run RCCSD_RI from tcc.rccsd import RCCSD_DIR_RI from tcc.cc_solvers import residual_diis_solver tim = time.process_time() if (not isfile(workdir + 'ccsd_results.p') or not isfile(workdir + 'RCCSD.txt')): cc = RCCSD_DIR_RI(rhf, mo_coeff=mo_coeff, mo_energy=mo_energy) converged, energy, amps = residual_diis_solver( cc, conv_tol_energy=1e-9, conv_tol_res=1e-8, max_cycle=500, verbose=logger.INFO) ccsd_results = [energy, amps] with open(workdir + 'ccsd_results.p', 'wb') as fp: pickle.dump(ccsd_results, fp) np.savetxt( workdir + 'RCCSD.txt', np.array([energy, ]), header='Energy' ) elapsed = time.process_time() - tim print('Done reference RCCSD, time: {}'.format(elapsed))
def test_nr_df_rohf(self): mol = gto.Mole() mol.build( verbose = 0, atom = [ ["O" , (0. , 0. , 0.)], [1 , (0. , -0.757 , 0.587)], [1 , (0. , 0.757 , 0.587)] ], basis = 'cc-pvdz', charge = 1, spin = 1, ) mf = scf.density_fit(scf.ROHF(mol)) mf.conv_tol = 1e-11 self.assertAlmostEqual(mf.scf(), -75.626515724371899, 9)
def test_df_ao2mo(self): mf = scf.density_fit(msym) mf.max_memory = 100 mf.kernel() mc = mcscf.DFCASSCF(mf, 4, 4) with df.load(mf._cderi) as feri: cderi = numpy.asarray(feri) eri0 = numpy.dot(cderi.T, cderi) nmo = mc.mo_coeff.shape[1] ncore = mc.ncore nocc = ncore + mc.ncas eri0 = ao2mo.restore(1, ao2mo.kernel(eri0, mc.mo_coeff), nmo) eris = mc.ao2mo(mc.mo_coeff) self.assertTrue(numpy.allclose(eri0[:,:,ncore:nocc,ncore:nocc], eris.ppaa)) self.assertTrue(numpy.allclose(eri0[:,ncore:nocc,:,ncore:nocc], eris.papa))
def test_nr_df_rohf(self): mol = gto.Mole() mol.build( verbose = 0, atom = [ ["O" , (0. , 0. , 0.)], [1 , (0. , -0.757 , 0.587)], [1 , (0. , 0.757 , 0.587)] ], basis = {"H": '6-31g', "O": '6-31g',}, charge = 1, spin = 1, ) mf = scf.density_fit(scf.ROHF(mol)) mf.conv_tol = 1e-11 self.assertAlmostEqual(mf.scf(), -75.5775921401438, 9)
def test_nr_df_rohf(self): mol = gto.Mole() mol.build( verbose=0, atom=[["O", (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]], basis={ "H": '6-31g', "O": '6-31g', }, charge=1, spin=1, ) mf = scf.density_fit(scf.ROHF(mol), 'weigend') mf.conv_tol = 1e-11 self.assertAlmostEqual(mf.scf(), -75.5775921401438, 9)
def __init__(self, mf): self.mol = mf.mol self.verbose = self.mol.verbose self.stdout = self.mol.stdout self.max_memory = mf.max_memory self.nmo = len(mf.mo_energy) self.nocc = self.mol.nelectron // 2 if hasattr(mf, 'with_df') and mf.with_df: self._scf = mf else: self._scf = scf.density_fit(mf) logger.warn(self, 'The input "mf" object is not DF object. ' 'DF-MP2 converts it to DF object with %s basis', self._scf.auxbasis) self.emp2 = None self.t2 = None
def run_scfs(mols, filename): scf_energies = [] scf_mos = [] scf_mo_energies = [] for idm, mol in enumerate(mols): rhf = scf.density_fit(scf.RHF(mol)) rhf.scf() scf_energies.append(rhf.e_tot) scf_mos.append(rhf.mo_coeff) scf_mo_energies.append(rhf.mo_energy) results = tuple( tuple([e_tot, mo_coeff, mo_energy]) for e_tot, mo_coeff, mo_energy in zip(scf_energies, scf_mos, scf_mo_energies)) with open(filename, 'wb') as fp: pickle.dump(results, fp)
def test_cpd_unf(): from pyscf import gto from pyscf import scf mol = gto.Mole() mol.atom = [[8, (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]] mol.basis = { 'H': '3-21g', 'O': '3-21g', } mol.build() rhf_ri = scf.density_fit(scf.RHF(mol)) rhf_ri.scf() # -76.0267656731 from tcc.rccsd import RCCSD, RCCSD_DIR_RI from tcc.rccsd_cpd import (RCCSD_nCPD_LS_T, RCCSD_CPD_LS_T) from tcc.cc_solvers import (classic_solver, step_solver) cc1 = RCCSD_DIR_RI(rhf_ri) cc2 = RCCSD_nCPD_LS_T(rhf_ri, rankt={'t2': 30}) cc3 = RCCSD_CPD_LS_T(rhf_ri, rankt={'t2': 30}) converged1, energy1, amps1 = classic_solver( cc1, conv_tol_energy=1e-8, ) converged2, energy2, amps2 = classic_solver(cc2, conv_tol_energy=1e-8, max_cycle=50) converged2, energy2, amps2 = step_solver(cc2, conv_tol_energy=1e-8, beta=0, max_cycle=150) converged3, energy3, amps3 = classic_solver(cc3, conv_tol_energy=1e-8, max_cycle=50) converged3, energy3, amps3 = step_solver(cc3, conv_tol_energy=1e-8, beta=0, max_cycle=150)
def test_cc(): # pragma: nocover from pyscf import gto from pyscf import scf mol = gto.Mole() mol.atom = [[8, (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]] mol.basis = { 'H': '3-21g', 'O': '3-21g', } mol.build() rhf = scf.RHF(mol) rhf = scf.density_fit(scf.RHF(mol)) rhf.scf() from tcc.rccsdt_ri import RCCSDT_RI from tcc.rccsdt_cpd import RCCSDT_nCPD_LS_T from tcc.rccsdt_cpd import RCCSDT_CPD_LS_T from tcc.cc_solvers import (classic_solver, step_solver) cc1 = RCCSDT_RI(rhf) cc2 = RCCSDT_nCPD_LS_T(rhf, rankt={'t2': 20, 't3': 40}) cc3 = RCCSDT_CPD_LS_T(rhf, rankt={'t2': 20, 't3': 40}) converged1, energy1, amps1 = classic_solver(cc1, conv_tol_energy=1e-9, conv_tol_res=1e-8, max_cycle=100) print('dE: {}'.format(energy1 - -1.304876e-01)) import numpy as np np.seterr(all='raise') import warnings warnings.filterwarnings("error") converged2, energy2, amps2 = step_solver(cc2, conv_tol_energy=1e-8, max_cycle=100) converged3, energy3, amps3 = step_solver(cc3, conv_tol_energy=1e-8, max_cycle=100) print('dE: {}'.format(energy2 - -0.12621546190311517)) print('E(CPD)-E(nCPD): {}'.format(energy3 - energy2))
def test_mp2_energy(): # pragma: nocover from pyscf import gto from pyscf import scf mol = gto.Mole() mol.atom = [[8, (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]] mol.basis = { 'H': 'cc-pvdz', 'O': 'cc-pvdz', } mol.build() rhf = scf.RHF(mol) rhf = scf.density_fit(scf.RHF(mol)) rhf.scf() # -76.0267656731 cc = RCCSD_MUL_RI(rhf) h = cc.create_ham() a = cc.init_amplitudes(h) energy = cc.calculate_energy(h, a) print('E_mp2 - E_cc,init = {:18.12g}'.format(energy - -0.204019967288338))
def test_cc(): # pragma: nocover from pyscf import gto from pyscf import scf mol = gto.Mole() mol.atom = [[8, (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]] mol.basis = { 'H': 'cc-pvdz', 'O': 'cc-pvdz', } mol.build() rhf = scf.RHF(mol) rhf = scf.density_fit(scf.RHF(mol)) rhf.scf() # -76.0267656731 from tcc.cc_solvers import classic_solver from tcc.rccsd_mul import RCCSD_MUL_RI cc = RCCSD_MUL_RI(rhf) converged, energy, _ = classic_solver(cc)
def test_rhf_veff(self): nao = mol.nao_nr() numpy.random.seed(1) dm = numpy.random.random((2,nao,nao)) mf = scf.density_fit(scf.RHF(mol)) vhf1 = mf.get_veff(mol, dm, hermi=0) naux = mf._cderi.shape[0] cderi = numpy.empty((naux,nao,nao)) for i in range(naux): cderi[i] = lib.unpack_tril(mf._cderi[i]) vj0 = [] vk0 = [] for dmi in dm: v1 = numpy.einsum('kij,ij->k', cderi, dmi) vj0.append(numpy.einsum('kij,k->ij', cderi, v1)) v1 = numpy.einsum('pij,jk->pki', cderi, dmi.T) vk0.append(numpy.einsum('pki,pkj->ij', cderi, v1)) vj1, vk1 = scf.dfhf.get_jk_(mf, mol, dm, 0) self.assertTrue(numpy.allclose(vj0, vj1)) self.assertTrue(numpy.allclose(numpy.array(vk0), vk1)) vhf0 = vj1 - vk1 * .5 self.assertTrue(numpy.allclose(vhf0, vhf1))
def test_rhf_veff(self): nao = mol.nao_nr() numpy.random.seed(1) dm = numpy.random.random((2, nao, nao)) mf = scf.density_fit(scf.RHF(mol), auxbasis='weigend') vhf1 = mf.get_veff(mol, dm, hermi=0) naux = mf._cderi.shape[0] cderi = numpy.empty((naux, nao, nao)) for i in range(naux): cderi[i] = lib.unpack_tril(mf._cderi[i]) vj0 = [] vk0 = [] for dmi in dm: v1 = numpy.einsum('kij,ij->k', cderi, dmi) vj0.append(numpy.einsum('kij,k->ij', cderi, v1)) v1 = numpy.einsum('pij,jk->pki', cderi, dmi.T) vk0.append(numpy.einsum('pki,pkj->ij', cderi, v1)) vj1, vk1 = df_jk.get_jk(mf.with_df, dm, 0) self.assertTrue(numpy.allclose(vj0, vj1)) self.assertTrue(numpy.allclose(numpy.array(vk0), vk1)) vhf0 = vj1 - vk1 * .5 self.assertTrue(numpy.allclose(vhf0, vhf1))
def build_rhf(workdir): print('Running SCF') if (not isfile(workdir + 'rhf_results.p') or not isfile(workdir + 'rhf_results.p')): mol = gto.Mole() mol.atom = load_geom(workdir) mol.basis = BASIS mol.build() rhf = scf.RHF(mol) rhf = scf.density_fit(scf.RHF(mol)) rhf.scf() rhf_results = tuple([rhf.e_tot, rhf.mo_coeff, rhf.mo_energy, mol.atom]) with open(workdir + 'rhf_results.p', 'wb') as fp: pickle.dump(rhf_results, fp) np.savetxt( workdir + 'RHF.txt', np.array([rhf.e_tot, ]), header='Energy' )
def test_cc_ri(): # pragma: nocover from pyscf import gto from pyscf import scf mol = gto.Mole() mol.atom = [['O', (0., 0., 0.)], ['H', (0., -0.757, 0.587)], ['H', (0., 0.757, 0.587)]] mol.basis = 'sto-3g' mol.build() rhf = scf.RHF(mol) rhf.scf() # -76.0267656731 rhf_ri = scf.density_fit(scf.RHF(mol)) rhf_ri.scf() from tcc.cc_solvers import residual_diis_solver from tcc.cc_solvers import classic_solver from tcc.rccsd import RCCSD_DIR_RI, RCCSD cc1 = RCCSD_DIR_RI(rhf_ri) cc2 = RCCSD(rhf) converged1, energy2, _ = classic_solver(cc1, conv_tol_energy=-1) converged2, energy2, _ = classic_solver(cc2, conv_tol_energy=-1)
def test_nr_df_rhf(self): rhf = scf.density_fit(scf.RHF(mol)) rhf.conv_tol = 1e-11 self.assertAlmostEqual(rhf.scf(), -76.025936299701982, 9)
def test_uhf_symm(self): mf = scf.density_fit(scf.UHF(symol)) self.assertAlmostEqual(mf.scf(), -76.025936299702536, 9)
def test_nr_df_rhf(self): rhf = scf.density_fit(scf.RHF(mol), 'weigend') rhf.conv_tol = 1e-11 self.assertAlmostEqual(rhf.scf(), -75.983210886950, 9)
def test_dhf(self): pmol = mol.copy() pmol.build(False, False) mf = scf.density_fit(scf.DHF(pmol), auxbasis='weigend') mf.conv_tol = 1e-10 self.assertAlmostEqual(mf.scf(), -76.080738677021458, 8)
def test_dhf(self): pmol = mol.copy() pmol.build(False, False) mf = scf.density_fit(scf.DHF(pmol)) self.assertAlmostEqual(mf.scf(), -76.080738685142961, 9)
the Hessian for the large-basis-density-fitted-scf scheme. """ mol = gto.Mole() mol.build( verbose=0, atom="""8 0 0. 0 1 0 -0.757 0.587 1 0 0.757 0.587""", basis="ccpvdz", ) # # 1. spin-free X2C-HF with density fitting approximation on 2E integrals # mf = scf.density_fit(scf.sfx2c(scf.RHF(mol))) energy = mf.kernel() print("E = %.12f, ref = -76.075115837941" % energy) # # 2. spin-free X2C correction for density-fitting HF. Since X2C correction is # commutable with density fitting operation, it is fully equivalent to case 1. # mf = scf.sfx2c(scf.density_fit(scf.RHF(mol))) energy = mf.kernel() print("E = %.12f, ref = -76.075115837941" % energy) # # 3. Newton method for non-relativistic HF # mo_init = mf.eig(mf.get_hcore(), mf.get_ovlp())[1]
def test_rhf(self): mf = scf.density_fit(scf.RHF(mol)) self.assertAlmostEqual(mf.scf(), -76.025936299702536, 9)
def test_rhf_symm(self): mf = scf.density_fit(scf.RHF(symol), auxbasis='weigend') self.assertAlmostEqual(mf.scf(), -76.025936299702536, 9)
the Hessian for the large-basis-density-fitted-scf scheme. ''' mol = gto.Mole() mol.build( verbose = 0, atom = '''8 0 0. 0 1 0 -0.757 0.587 1 0 0.757 0.587''', basis = 'ccpvdz', ) # # 1. spin-free X2C-HF with density fitting approximation on 2E integrals # mf = scf.density_fit(scf.sfx2c1e(scf.RHF(mol))) mf = scf.RHF(mol).x2c().density_fit() # Stream style energy = mf.kernel() print('E = %.12f, ref = -76.075408156180' % energy) # # 2. spin-free X2C correction for density-fitting HF. Since X2C correction is # commutable with density fitting operation, it is fully equivalent to case 1. # mf = scf.sfx2c1e(scf.density_fit(scf.RHF(mol))) mf = scf.RHF(mol).density_fit().x2c() # Stream style energy = mf.kernel() print('E = %.12f, ref = -76.075408156180' % energy) # # 3. The order to apply X2C or newton method matters. If relativistic effects
int3c = df.incore.cholesky_eri(mol, auxbasis='ccpvdz-fit') # Integrals on disk ftmp = tempfile.NamedTemporaryFile() df.outcore.cholesky_eri(mol, ftmp.name, auxbasis='ccpvdz-fit') fake_mol = gto.M() fake_mol.nelectron = 10 # Note: you need define the problem size # # Redefine the 2-electron integrals by overwriting mf._cderi with the given # 3-center intagrals. You need create density-fitting SCF object. The # regulare SCF object cannot hold the 3-center integrals. # mf = scf.density_fit(scf.RHF(fake_mol)) mf.get_hcore = lambda *args: (mol.intor('cint1e_kin_sph') + mol.intor('cint1e_nuc_sph')) mf.get_ovlp = lambda *args: mol.intor('cint1e_ovlp_sph') mf._cderi = int3c mf.init_guess = '1e' # Initial guess from Hcore mf.kernel() # # Assuming the 3-center integrals happens too huge to be held in memory, there # is a hacky way to input the integrals. The h5py dataset can be accessed in # the same way as the numpy ndarray. # with h5py.File(ftmp.name, 'r') as file1: mf = scf.density_fit(scf.RHF(fake_mol))
[8 , (0. , 0. , 0.)], [1 , (0. , -0.757 , 0.587)], [1 , (0. , 0.757 , 0.587)]] mol.basis = 'cc-pvdz' mol.build() mf = scf.RHF(mol).run() pt = DFMP2(mf) emp2, t2 = pt.kernel() print(emp2 - -0.204004830285) pt.with_df = df.DF(mol) pt.with_df.auxbasis = 'weigend' emp2, t2 = pt.kernel() print(emp2 - -0.204254500453) mf = scf.density_fit(scf.RHF(mol), 'weigend') mf.kernel() pt = DFMP2(mf) emp2, t2 = pt.kernel() print(emp2 - -0.203986171133) pt.with_df = df.DF(mol) pt.with_df.auxbasis = df.make_auxbasis(mol, mp2fit=True) emp2, t2 = pt.kernel() print(emp2 - -0.203738031827) pt.frozen = 2 emp2, t2 = pt.kernel() print(emp2 - -0.14433975122418313)
def test_init(self): from pyscf import dft from pyscf import x2c mol_r = mol mol_u = gto.M(atom='Li', spin=1, verbose=0) mol_r1 = gto.M(atom='H', spin=1, verbose=0) sym_mol_r = molsym sym_mol_u = gto.M(atom='Li', spin=1, symmetry=1, verbose=0) sym_mol_r1 = gto.M(atom='H', spin=1, symmetry=1, verbose=0) self.assertTrue(isinstance(scf.RKS(mol_r), dft.rks.RKS)) self.assertTrue(isinstance(scf.RKS(mol_u), dft.roks.ROKS)) self.assertTrue(isinstance(scf.UKS(mol_r), dft.uks.UKS)) self.assertTrue(isinstance(scf.ROKS(mol_r), dft.roks.ROKS)) self.assertTrue(isinstance(scf.GKS(mol_r), dft.gks.GKS)) self.assertTrue(isinstance(scf.KS(mol_r), dft.rks.RKS)) self.assertTrue(isinstance(scf.KS(mol_u), dft.uks.UKS)) self.assertTrue(isinstance(scf.RHF(mol_r), scf.hf.RHF)) self.assertTrue(isinstance(scf.RHF(mol_u), scf.rohf.ROHF)) self.assertTrue(isinstance(scf.RHF(mol_r1), scf.rohf.ROHF)) self.assertTrue(isinstance(scf.UHF(mol_r), scf.uhf.UHF)) self.assertTrue(isinstance(scf.UHF(mol_u), scf.uhf.UHF)) self.assertTrue(isinstance(scf.UHF(mol_r1), scf.uhf.UHF)) self.assertTrue(isinstance(scf.ROHF(mol_r), scf.rohf.ROHF)) self.assertTrue(isinstance(scf.ROHF(mol_u), scf.rohf.ROHF)) self.assertTrue(isinstance(scf.ROHF(mol_r1), scf.rohf.ROHF)) self.assertTrue(isinstance(scf.HF(mol_r), scf.hf.RHF)) self.assertTrue(isinstance(scf.HF(mol_u), scf.uhf.UHF)) self.assertTrue(isinstance(scf.HF(mol_r1), scf.rohf.ROHF)) self.assertTrue(isinstance(scf.GHF(mol_r), scf.ghf.GHF)) self.assertTrue(isinstance(scf.GHF(mol_u), scf.ghf.GHF)) self.assertTrue(isinstance(scf.GHF(mol_r1), scf.ghf.GHF)) self.assertTrue(not isinstance(scf.DHF(mol_r), scf.dhf.RHF)) self.assertTrue(isinstance(scf.DHF(mol_u), scf.dhf.UHF)) self.assertTrue(isinstance(scf.DHF(mol_r1), scf.dhf.HF1e)) self.assertTrue(isinstance(scf.RHF(sym_mol_r), scf.hf_symm.RHF)) self.assertTrue(isinstance(scf.RHF(sym_mol_u), scf.hf_symm.ROHF)) self.assertTrue(isinstance(scf.RHF(sym_mol_r1), scf.hf_symm.ROHF)) self.assertTrue(isinstance(scf.UHF(sym_mol_r), scf.uhf_symm.UHF)) self.assertTrue(isinstance(scf.UHF(sym_mol_u), scf.uhf_symm.UHF)) self.assertTrue(isinstance(scf.UHF(sym_mol_r1), scf.uhf_symm.UHF)) self.assertTrue(isinstance(scf.ROHF(sym_mol_r), scf.hf_symm.ROHF)) self.assertTrue(isinstance(scf.ROHF(sym_mol_u), scf.hf_symm.ROHF)) self.assertTrue(isinstance(scf.ROHF(sym_mol_r1), scf.hf_symm.ROHF)) self.assertTrue(isinstance(scf.HF(sym_mol_r), scf.hf_symm.RHF)) self.assertTrue(isinstance(scf.HF(sym_mol_u), scf.uhf_symm.UHF)) self.assertTrue(isinstance(scf.HF(sym_mol_r1), scf.hf_symm.ROHF)) self.assertTrue(isinstance(scf.GHF(sym_mol_r), scf.ghf_symm.GHF)) self.assertTrue(isinstance(scf.GHF(sym_mol_u), scf.ghf_symm.GHF)) self.assertTrue(isinstance(scf.GHF(sym_mol_r1), scf.ghf_symm.GHF)) self.assertTrue(isinstance(scf.X2C(mol_r), x2c.x2c.UHF)) self.assertTrue(isinstance(scf.sfx2c1e(scf.HF(mol_r)), scf.rhf.RHF)) self.assertTrue(isinstance(scf.sfx2c1e(scf.HF(mol_u)), scf.uhf.UHF)) self.assertTrue(isinstance(scf.sfx2c1e(scf.HF(mol_r1)), scf.rohf.ROHF)) self.assertTrue(isinstance(scf.sfx2c1e(scf.HF(sym_mol_r)), scf.rhf_symm.RHF)) self.assertTrue(isinstance(scf.sfx2c1e(scf.HF(sym_mol_u)), scf.uhf_symm.UHF)) self.assertTrue(isinstance(scf.sfx2c1e(scf.HF(sym_mol_r1)), scf.hf_symm.ROHF)) self.assertTrue(isinstance(scf.density_fit(scf.HF(mol_r)), scf.rhf.RHF)) self.assertTrue(isinstance(scf.density_fit(scf.HF(mol_u)), scf.uhf.UHF)) self.assertTrue(isinstance(scf.density_fit(scf.HF(mol_r1)), scf.rohf.ROHF)) self.assertTrue(isinstance(scf.density_fit(scf.HF(sym_mol_r)), scf.rhf_symm.RHF)) self.assertTrue(isinstance(scf.density_fit(scf.HF(sym_mol_u)), scf.uhf_symm.UHF)) self.assertTrue(isinstance(scf.density_fit(scf.HF(sym_mol_r1)), scf.hf_symm.ROHF)) self.assertTrue(isinstance(scf.newton(scf.HF(mol_r)), scf.rhf.RHF)) self.assertTrue(isinstance(scf.newton(scf.HF(mol_u)), scf.uhf.UHF)) self.assertTrue(isinstance(scf.newton(scf.HF(mol_r1)), scf.rohf.ROHF)) self.assertTrue(isinstance(scf.newton(scf.HF(sym_mol_r)), scf.rhf_symm.RHF)) self.assertTrue(isinstance(scf.newton(scf.HF(sym_mol_u)), scf.uhf_symm.UHF)) self.assertTrue(isinstance(scf.newton(scf.HF(sym_mol_r1)), scf.hf_symm.ROHF))
m = scf.RHF(mol) ehf = m.scf() mc = density_fit(mcscf.CASSCF(m, 6, 4)) mc.verbose = 4 mo = addons.sort_mo(mc, m.mo_coeff, (3,4,6,7,8,9), 1) emc = mc.kernel(mo)[0] print(ehf, emc, emc-ehf) #-76.0267656731 -76.0873922924 -0.0606266193028 print(emc - -76.0873923174, emc - -76.0926176464) mc = density_fit(mcscf.CASSCF(m, 6, (3,1))) mc.verbose = 4 emc = mc.mc2step(mo)[0] print(emc - -75.7155632535814) mf = scf.density_fit(m) mf.kernel() #mc = density_fit(mcscf.CASSCF(mf, 6, 4)) #mc = mcscf.CASSCF(mf, 6, 4) mc = mcscf.DFCASSCF(mf, 6, 4) mc.verbose = 4 mo = addons.sort_mo(mc, mc.mo_coeff, (3,4,6,7,8,9), 1) emc = mc.kernel(mo)[0] print(emc, 'ref = -76.0917567904955', emc - -76.0917567904955) #mc = density_fit(mcscf.CASCI(mf, 6, 4)) #mc = mcscf.CASCI(mf, 6, 4) mc = mcscf.DFCASCI(mf, 6, 4) mo = addons.sort_mo(mc, mc.mo_coeff, (3,4,6,7,8,9), 1) emc = mc.kernel(mo)[0] print(emc, 'ref = -76.0476686258461', emc - -76.0476686258461)
nocc = mol.nelectron // 2 nmo = mf.mo_energy.size nvir = nmo - nocc co = mf.mo_coeff[:, :nocc] cv = mf.mo_coeff[:, nocc:] g = ao2mo.incore.general(mf._eri, (co, cv, co, cv)).ravel() eia = mf.mo_energy[:nocc, None] - mf.mo_energy[nocc:] t2ref0 = g / (eia.reshape(-1, 1) + eia.reshape(-1)).ravel() t2ref0 = t2ref0.reshape(nocc, nvir, nocc, nvir).transpose(0, 2, 1, 3) pt = MP2(mf) emp2, t2 = pt.kernel() print(emp2 - -0.204019967288338) print("incore", numpy.allclose(t2, t2ref0)) pt.max_memory = 1 print("direct", numpy.allclose(pt.kernel()[1], t2ref0)) rdm1 = make_rdm1_ao(pt, mf.mo_energy, mf.mo_coeff) print(numpy.allclose(reduce(numpy.dot, (mf.mo_coeff, pt.make_rdm1(), mf.mo_coeff.T)), rdm1)) eri = ao2mo.restore(1, ao2mo.kernel(mf._eri, mf.mo_coeff), nmo) rdm2 = pt.make_rdm2() e1 = numpy.einsum("ij,ij", mf.make_rdm1(), mf.get_hcore()) e2 = 0.5 * numpy.dot(eri.flatten(), rdm2.flatten()) print(e1 + e2 + mf.energy_nuc() - mf.e_tot - -0.204019976381) pt = MP2(scf.density_fit(mf)) print(pt.kernel()[0] - -0.204254500454)
for i in range(start, end, step): yield i, min(i+step, end) if __name__ == '__main__': from pyscf import scf from pyscf import gto mol = gto.Mole() mol.verbose = 0 mol.atom = [ [8 , (0. , 0. , 0.)], [1 , (0. , -0.757 , 0.587)], [1 , (0. , 0.757 , 0.587)]] mol.basis = 'cc-pvdz' mol.build() mf = scf.RHF(mol) mf.scf() pt = MP2(mf) pt.max_memory = .05 emp2, t2 = pt.kernel() print(emp2 - -0.204254491987) mf = scf.density_fit(scf.RHF(mol)) mf.scf() pt = MP2(mf) pt.max_memory = .05 pt.ioblk = .05 pt.verbose = 5 emp2, t2 = pt.kernel() print(emp2 - -0.203986171133)
def test_nr_df_uhf(self): uhf = scf.density_fit(scf.UHF(mol)) uhf.conv_tol = 1e-11 self.assertAlmostEqual(uhf.scf(), -76.025936299702096, 9)
from pyscf import gto, df, scf, mcscf ''' Input Cholesky decomposed integrals for CASSCF See also examples/df/40-precompute_df_ints.py ''' mol = gto.M(atom='H 0 0 0; F 0 0 1', basis='ccpvdz') # # Integrals in memory. The size of the integral array is (M,N*(N+1)/2), where # the last two AO indices are compressed due to the symmetry # int3c = df.incore.cholesky_eri(mol, auxbasis='ccpvdz-fit') mf = scf.density_fit(scf.RHF(mol)) mf.with_df._cderi = int3c mf.kernel() # 3-cetner DF or Cholesky decomposed integrals need to be initialized once in # mf.with_df._cderi. DFCASSCF method automatically use the approximate integrals mc = mcscf.DFCASSCF(mf, 8, 8) mc.kernel() # # Integrals on disk # ftmp = tempfile.NamedTemporaryFile() df.outcore.cholesky_eri(mol, ftmp.name, auxbasis='ccpvdz-fit')
m.max_cycle = 1 #m.verbose = 5 m.scf() e1 = kernel(newton(m), m.mo_coeff, m.mo_occ, max_cycle=50, verbose=5)[1] m = scf.UHF(mol) m.max_cycle = 1 #m.verbose = 5 m.scf() e2 = kernel(newton(m), m.mo_coeff, m.mo_occ, max_cycle=50, verbose=5)[1] m = scf.UHF(mol) m.max_cycle = 1 #m.verbose = 5 m.scf() nrmf = scf.density_fit(newton(m)) nrmf.max_cycle = 50 nrmf.conv_tol = 1e-8 nrmf.conv_tol_grad = 1e-5 #nrmf.verbose = 5 e4 = nrmf.kernel() m = scf.density_fit(scf.UHF(mol)) m.max_cycle = 1 #m.verbose = 5 m.scf() nrmf = scf.density_fit(newton(m)) nrmf.max_cycle = 50 nrmf.conv_tol_grad = 1e-5 e5 = nrmf.kernel()
time0 = log.timer('mp2 ao2mo_ovov pass2', *time0) return h5dat del(WITH_T2) if __name__ == '__main__': from pyscf import scf from pyscf import gto mol = gto.Mole() mol.atom = [ [8 , (0. , 0. , 0.)], [1 , (0. , -0.757 , 0.587)], [1 , (0. , 0.757 , 0.587)]] mol.basis = 'cc-pvdz' mol.build() mf = scf.RHF(mol).run() mp = MP2(mf) mp.verbose = 5 pt = MP2(mf) emp2, t2 = pt.kernel() print(emp2 - -0.204019967288338) pt.max_memory = 1 emp2, t2 = pt.kernel() print(emp2 - -0.204019967288338) pt = MP2(scf.density_fit(mf, 'weigend')) print(pt.kernel()[0] - -0.204254500454)
*time1) time0 = log.timer('mp2 ao2mo_ovov pass2', *time0) return h5dat del (WITH_T2) if __name__ == '__main__': from pyscf import scf from pyscf import gto mol = gto.Mole() mol.atom = [[8, (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]] mol.basis = 'cc-pvdz' mol.build() mf = scf.RHF(mol).run() mp = MP2(mf) mp.verbose = 5 pt = MP2(mf) emp2, t2 = pt.kernel() print(emp2 - -0.204019967288338) pt.max_memory = 1 emp2, t2 = pt.kernel() print(emp2 - -0.204019967288338) pt = MP2(scf.density_fit(mf, 'weigend')) print(pt.kernel()[0] - -0.204254500454)
def test_nr_df_uhf(self): uhf = scf.density_fit(scf.UHF(mol)) uhf.conv_tol = 1e-11 self.assertAlmostEqual(uhf.scf(), -75.983210886950, 9)