Esempio n. 1
0
def run_hf(xyz,
           basis,
           charge=0,
           multiplicity=1,
           conv_tol=1e-12,
           conv_tol_grad=1e-8,
           max_iter=150):
    mol = gto.M(
        atom=xyz,
        basis=basis,
        unit="Bohr",
        # spin in the pyscf world is 2S
        spin=multiplicity - 1,
        charge=charge,
        # Disable commandline argument parsing in pyscf
        parse_arg=False,
        dump_input=False,
        verbose=0,
    )
    mf = scf.HF(mol)
    mf.conv_tol = conv_tol
    mf.conv_tol_grad = conv_tol_grad
    mf.max_cycle = max_iter
    # since we want super tight convergence for tests,
    # tweak the options for non-RHF systems
    if multiplicity != 1:
        mf.max_cycle += 500
        mf.diis = scf.EDIIS()
        mf.diis_space = 3
        mf = scf.addons.frac_occ(mf)
    mf.kernel()
    return mf
Esempio n. 2
0
def calc_hf(mol, **scfargs):
    mf = scf.HF(mol).run(**scfargs)
    if not mf.converged:
        raise RuntimeError("SCF not converged!")
    etot = mf.e_tot
    grad = mf.nuc_grad_method().kernel()
    rdm = mf.make_rdm1()
    return etot, -grad / BOHR, rdm
Esempio n. 3
0
def calc_mp2(mol, **scfargs):
    import pyscf.mp
    mf = scf.HF(mol).run(**scfargs)
    if not mf.converged:
        raise RuntimeError("SCF not converged!")
    postmf = pyscf.mp.MP2(mf).run()
    etot = postmf.e_tot
    grad = postmf.nuc_grad_method().kernel()
    return etot, -grad / BOHR, None
Esempio n. 4
0
def init_guess_mixed(mol, mixing_parameter=numpy.pi / 4):
    ''' Copy from pyscf/examples/scf/56-h2_symm_breaking.py

    Generate density matrix with broken spatial and spin symmetry by mixing
    H**O and LUMO orbitals following ansatz in Szabo and Ostlund, Sec 3.8.7.

    psi_1a = numpy.cos(q)*psi_homo + numpy.sin(q)*psi_lumo
    psi_1b = numpy.cos(q)*psi_homo - numpy.sin(q)*psi_lumo

    psi_2a = -numpy.sin(q)*psi_homo + numpy.cos(q)*psi_lumo
    psi_2b =  numpy.sin(q)*psi_homo + numpy.cos(q)*psi_lumo

    Returns:
        Density matrices, a list of 2D ndarrays for alpha and beta spins
    '''
    # opt: q, mixing parameter 0 < q < 2 pi

    # based on init_guess_by_1e
    h1e = scf.hf.get_hcore(mol)
    s1e = scf.hf.get_ovlp(mol)
    mo_energy, mo_coeff = scf.hf.eig(h1e, s1e)
    mf = scf.HF(mol)
    mo_occ = mf.get_occ(mo_energy=mo_energy, mo_coeff=mo_coeff)

    homo_idx = 0
    lumo_idx = 1

    for i in range(len(mo_occ) - 1):
        if mo_occ[i] > 0 and mo_occ[i + 1] < 0:
            homo_idx = i
            lumo_idx = i + 1

    psi_homo = mo_coeff[:, homo_idx]
    psi_lumo = mo_coeff[:, lumo_idx]

    Ca = numpy.zeros_like(mo_coeff)
    Cb = numpy.zeros_like(mo_coeff)

    # mix h**o and lumo of alpha and beta coefficients
    q = mixing_parameter

    for k in range(mo_coeff.shape[0]):
        if k == homo_idx:
            Ca[:, k] = numpy.cos(q) * psi_homo + numpy.sin(q) * psi_lumo
            Cb[:, k] = numpy.cos(q) * psi_homo - numpy.sin(q) * psi_lumo
            continue
        if k == lumo_idx:
            Ca[:, k] = -numpy.sin(q) * psi_homo + numpy.cos(q) * psi_lumo
            Cb[:, k] = numpy.sin(q) * psi_homo + numpy.cos(q) * psi_lumo
            continue
        Ca[:, k] = mo_coeff[:, k]
        Cb[:, k] = mo_coeff[:, k]

    dm = scf.UHF(mol).make_rdm1((Ca, Cb), (mo_occ, mo_occ))
    return dm
Esempio n. 5
0
def calc_ccsd_t(mol, **scfargs):
    import pyscf.cc
    import pyscf.grad.ccsd_t as ccsd_t_grad
    mf = scf.HF(mol).run(**scfargs)
    if not mf.converged:
        raise RuntimeError("SCF not converged!")
    mycc = mf.CCSD().run()
    et_correction = mycc.ccsd_t()
    etot = mycc.e_tot + et_correction
    grad = ccsd_t_grad.Gradients(mycc).kernel()
    return etot, -grad / BOHR, None
Esempio n. 6
0
def calc_ccsd(mol, **scfargs):
    import pyscf.cc
    mf = scf.HF(mol).run(**scfargs)
    if not mf.converged:
        raise RuntimeError("SCF not converged!")
    mycc = mf.CCSD().run()
    etot = mycc.e_tot
    grad = mycc.nuc_grad_method().kernel()
    ccdm = np.einsum('pi,ij,qj->pq', mf.mo_coeff, mycc.make_rdm1(),
                     mf.mo_coeff.conj())
    return etot, -grad / BOHR, ccdm
Esempio n. 7
0
 def test_getattr(self):
     from pyscf import scf, dft, ci, tdscf
     mol = gto.M(atom='He')
     self.assertEqual(mol.HF().__class__, scf.HF(mol).__class__)
     self.assertEqual(mol.KS().__class__, dft.KS(mol).__class__)
     self.assertEqual(mol.UKS().__class__, dft.UKS(mol).__class__)
     self.assertEqual(mol.CISD().__class__, ci.cisd.RCISD)
     self.assertEqual(mol.TDA().__class__, tdscf.rhf.TDA)
     self.assertEqual(mol.dTDA().__class__, tdscf.rks.dTDA)
     self.assertEqual(mol.TDBP86().__class__, tdscf.rks.TDDFTNoHybrid)
     self.assertEqual(mol.TDB3LYP().__class__, tdscf.rks.TDDFT)
     self.assertRaises(AttributeError, lambda: mol.xyz)
     self.assertRaises(AttributeError, lambda: mol.TDxyz)
Esempio n. 8
0
def _pyscf_qm(qm_atnm, qm_crds, qm_basis, qm_chg_tot, esp_opts={}):

    atm_list = []
    for ia, xyz in enumerate(qm_crds):
        sym = qm_atnm[ia]  # .split(':')[0]
        atm_list.append([sym, (xyz[0], xyz[1], xyz[2])])
        #print(ia, sym, xyz)

    #print('qm_chg_tot', qm_chg_tot)
    qm_mol = _pyscf_mol_build(atm_list, qm_basis, qm_chg_tot)
    mf = scf.HF(qm_mol).run()

    ener_QM = mf.e_tot
    grds_QM = mf.Gradients().kernel()

    dm = mf.make_rdm1()

    esp_chg = esp_atomic_charges(qm_mol, dm, esp_opts)

    return ener_QM, grds_QM, esp_chg
Esempio n. 9
0
    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.HF1e))
        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.HF1e))
        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.HF1e))
        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.HF1e))
        #TODO: self.assertTrue(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.HF1e))
        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.HF1e))
        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.HF1e))
        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.HF1e))

        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))
Esempio n. 10
0
.kernel() function is the simple way to call HF driver.
.analyze() function calls the Mulliken population analysis etc.
'''

import pyscf

mol = pyscf.M(
    atom='H 0 0 0; F 0 0 1.1',  # in Angstrom
    basis='ccpvdz',
    symmetry=True,
)

myhf = mol.HF()
myhf.kernel()

# Orbital energies, Mulliken population etc.
myhf.analyze()

#
# myhf object can also be created using the APIs of gto, scf module
#
from pyscf import gto, scf
mol = gto.M(
    atom='H 0 0 0; F 0 0 1.1',  # in Angstrom
    basis='ccpvdz',
    symmetry=True,
)
myhf = scf.HF(mol)
myhf.kernel()
Esempio n. 11
0
#
#
#
# ------------------------------------------------------------------------
print('============================================================')
print()
print('         Resultados del SCF ')
print('(Todos los resultados estan en unidades atomicas)')
print()
print('============================================================')
print(' ')
nao = mol.nao
print('Numero de Orbitales Atomicos (nao): ', nao)
print('-------------------------------------------')
print()
mf = scf.HF(mol)
mf.kernel()
print()
print('--------------------------')
print('Molecular Energies: (moe) ')
print('--------------------------')
print()
moe = mf.mo_energy
print(moe)

print()
print('-------------------------------')
print('Molecular coeficients: (cmos)')
print('-------------------------------')
print('Orb moleculares en columnas,  \psi_a en la columna a')
print()