def test_kernel_symm(self): mol = gto.Mole() mol.verbose = 0 mol.output = None mol.atom = [ ['O', (0., 0., 0.)], ['H', (0., -0.757, 0.587)], ['H', (0., 0.757, 0.587)], ] mol.basis = 'sto-3g' mol.symmetry = 1 mol.build() m = scf.RHF(mol).run() norb = m.mo_coeff.shape[1] nelec = mol.nelectron - 2 h1e = reduce(numpy.dot, (m.mo_coeff.T, scf.hf.get_hcore(mol), m.mo_coeff)) eri = ao2mo.incore.full(m._eri, m.mo_coeff) orbsym = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, m.mo_coeff) myci = select_ci_symm.SCI().set(orbsym=orbsym, select_cutoff=.5e-3) e1, c1 = myci.kernel(h1e, eri, norb, nelec) myci = direct_spin1_symm.FCISolver().set(orbsym=orbsym) e2, c2 = myci.kernel(h1e, eri, norb, nelec) self.assertAlmostEqual(e1, e2, 6) c2 = select_ci.from_fci(c2, c1._strs, norb, nelec) self.assertAlmostEqual(abs(numpy.dot(c1.ravel(), c2.ravel())), 1, 6)
def solver(mol, singlet=True, symm=None): if symm is None: symm = mol.symmetry if symm: if singlet: return direct_spin0_symm.FCISolver(mol) else: return direct_spin1_symm.FCISolver(mol) else: if singlet: return direct_spin0.FCISolver(mol) else: return direct_spin1.FCISolver(mol)
def solver(mol=None, singlet=False, symm=None): if mol and symm is None: symm = mol.symmetry if symm: if singlet: return direct_spin0_symm.FCISolver(mol) else: return direct_spin1_symm.FCISolver(mol) else: if singlet: # The code for singlet direct_spin0 sometimes gets error of # "State not singlet x.xxxxxxe-06" due to numerical issues. # Calling direct_spin1 is slightly slower but more robust than # direct_spin0 especially when combining to energy penalty method # (:func:`fix_spin_`) return direct_spin0.FCISolver(mol) else: return direct_spin1.FCISolver(mol)
if __name__ == '__main__': from functools import reduce from pyscf import gto from pyscf import scf from pyscf import symm mol = gto.Mole() mol.verbose = 0 mol.output = None mol.atom = [ ['O', (0., 0., 0.)], ['H', (0., -0.757, 0.587)], ['H', (0., 0.757, 0.587)], ] mol.basis = 'sto-3g' mol.symmetry = 1 mol.build() m = scf.RHF(mol).run() norb = m.mo_coeff.shape[1] nelec = mol.nelectron - 2 h1e = reduce(numpy.dot, (m.mo_coeff.T, scf.hf.get_hcore(mol), m.mo_coeff)) eri = ao2mo.incore.full(m._eri, m.mo_coeff) orbsym = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, m.mo_coeff) myci = SelectedCI().set(orbsym=orbsym) e1, c1 = myci.kernel(h1e, eri, norb, nelec) myci = direct_spin1_symm.FCISolver().set(orbsym=orbsym) e2, c2 = myci.kernel(h1e, eri, norb, nelec) print(e1 - e2)