예제 #1
0
파일: test_itrf.py 프로젝트: zzy2014/pyscf
    def test_grad(self):
        coords = [(0.0, 0.1, 0.0)]
        charges = [1.00]
        mf = itrf.mm_charge(scf.RHF(mol), coords, charges).run()
        hfg = itrf.mm_charge_grad(grad.RHF(mf), coords, charges).run()
        self.assertAlmostEqual(numpy.linalg.norm(hfg.de), 26.978089280783195,
                               9)

        mfs = mf.as_scanner()
        e1 = mfs('''
                 H              -0.00000000   -0.000    0.001
                 H                 -0.00000000   -0.000    1.
                 H                 -0.00000000   -0.82    0.
                 H                 -0.91000000   -0.020    0.
                 ''')
        e2 = mfs('''
                 H              -0.00000000   -0.000   -0.001
                 H                 -0.00000000   -0.000    1.
                 H                 -0.00000000   -0.82    0.
                 H                 -0.91000000   -0.020    0.
                 ''')
        self.assertAlmostEqual((e1 - e2) / 0.002 * lib.param.BOHR,
                               hfg.de[0, 2], 5)

        bak = pyscf.DEBUG
        pyscf.DEBUG = 1
        ref = hfg.get_hcore()
        pyscf.DEBUG = 0
        v = hfg.get_hcore()
        self.assertAlmostEqual(abs(ref - v).max(), 0, 12)
        pyscf.DEBUG = bak
예제 #2
0
 def test_mp2_grad(self):
     pt = mp.mp2.MP2(mf)
     pt.kernel()
     g1 = pt.nuc_grad_method().kernel(pt.t2,
                                      mf_grad=grad.RHF(mf),
                                      atmlst=[0, 1, 2])
     self.assertAlmostEqual(lib.finger(g1), -0.035681131697586257, 6)
예제 #3
0
    def test_finite_diff_x2c_rhf_grad(self):
        mf = scf.RHF(mol).x2c()
        mf.conv_tol = 1e-14
        e0 = mf.kernel()
        g = grad.RHF(mf).kernel()
        self.assertAlmostEqual(lib.finger(g), 0.0056363502746766807, 6)

        mf_scanner = mf.as_scanner()
        pmol = mol.copy()
        e1 = mf_scanner(
            pmol.set_geom_(
                'O  0. 0. 0.0001; 1  0. -0.757 0.587; 1  0. 0.757 0.587'))
        e2 = mf_scanner(
            pmol.set_geom_(
                'O  0. 0. -.0001; 1  0. -0.757 0.587; 1  0. 0.757 0.587'))
        self.assertAlmostEqual(g[0, 2], (e1 - e2) / 2e-4 * lib.param.BOHR, 5)

        #e1 = mf_scanner(pmol.set_geom_('O  0.  1e-5 0.; 1  0. -0.757 0.587; 1  0. 0.757 0.587'))
        #e2 = mf_scanner(pmol.set_geom_('O  0. -1e-5 0.; 1  0. -0.757 0.587; 1  0. 0.757 0.587'))
        #self.assertAlmostEqual(g[0,1], (e1-e2)/2e-5*lib.param.BOHR, 5)

        e1 = mf_scanner(
            pmol.set_geom_(
                'O  0. 0. 0.; 1  0. -0.7571 0.587; 1  0. 0.757 0.587'))
        e2 = mf_scanner(
            pmol.set_geom_(
                'O  0. 0. 0.; 1  0. -0.7569 0.587; 1  0. 0.757 0.587'))
        self.assertAlmostEqual(g[1, 1], (e2 - e1) / 2e-4 * lib.param.BOHR, 5)
예제 #4
0
파일: test_hf.py 프로젝트: NuturesH/pyscf-1
 def test_nr_rhf(self):
     rhf = scf.RHF(mol)
     rhf.conv_tol = 1e-14
     rhf.scf()
     g = grad.RHF(rhf)
     self.assertAlmostEqual(finger(g.grad_elec()), 7.9210392362911595, 6)
     self.assertAlmostEqual(finger(g.kernel()), 0.367743084803, 6)
예제 #5
0
    def test_ccsd_grad(self):
        mycc = cc.ccsd.CCSD(mf)
        mycc.max_memory = 1
        mycc.conv_tol = 1e-10
        eris = mycc.ao2mo()
        ecc, t1, t2 = mycc.kernel(eris=eris)
        l1, l2 = mycc.solve_lambda(eris=eris)
        g1 = ccsd_grad.kernel(mycc, t1, t2, l1, l2, mf_grad=grad.RHF(mf))
        self.assertAlmostEqual(lib.finger(g1), -0.036999389889460096, 6)

        mol = gto.M(
            verbose = 5,
            output = '/dev/null',
            atom = 'H 0 0 0; H 0 0 1.706',
            basis = '631g',
            unit='Bohr')
        mf0 = scf.RHF(mol).run(conv_tol=1e-14)
        mycc0 = cc.ccsd.CCSD(mf0).run(conv_tol=1e-10)
        mol.set_geom_('H 0 0 0; H 0 0 1.704', unit='Bohr')
        mf1 = scf.RHF(mol).run(conv_tol=1e-14)
        mycc1= cc.ccsd.CCSD(mf1).run(conv_tol=1e-10)
        mol.set_geom_('H 0 0 0; H 0 0 1.705', unit='Bohr')
        mycc2 = cc.ccsd.CCSD(scf.RHF(mol))
        g_scanner = mycc2.nuc_grad_method().as_scanner().as_scanner()
        g1 = g_scanner(mol)[1]
        self.assertTrue(g_scanner.converged)
        self.assertAlmostEqual(g1[0,2], (mycc1.e_tot-mycc0.e_tot)*500, 6)
예제 #6
0
 def test_frozen(self):
     myci = ci.cisd.CISD(mf)
     myci.frozen = [0, 1, 10, 11, 12]
     myci.max_memory = 1
     myci.kernel()
     g1 = cisd_grad.kernel(myci, myci.ci, mf_grad=grad.RHF(mf))
     self.assertAlmostEqual(lib.finger(g1), 0.10224149952700579, 6)
예제 #7
0
 def test_frozen(self):
     pt = mp.mp2.MP2(mf)
     pt.frozen = [0, 1, 10, 11, 12]
     pt.max_memory = 1
     pt.kernel()
     g1 = mp2_grad.kernel(pt, pt.t2, mf_grad=grad.RHF(mf))
     self.assertAlmostEqual(lib.finger(g1), 0.12457973399092415, 6)
예제 #8
0
 def test_cisd_grad(self):
     myci = ci.cisd.CISD(mf)
     myci.conv_tol = 1e-10
     myci.kernel()
     g1 = myci.nuc_grad_method().kernel(myci.ci,
                                        mf_grad=grad.RHF(mf),
                                        atmlst=[0, 1, 2])
     self.assertAlmostEqual(lib.finger(g1), -0.032562347119070523, 6)
예제 #9
0
 def hf_grad(self):
     if self._hf_grad is not NotImplemented:
         return self._hf_grad
     if self.hf_eng.mo_coeff is None:
         self.hf_eng.kernel()
     hf_grad = grad.RHF(self.hf_eng)
     self._hf_grad = hf_grad
     return self._hf_grad
예제 #10
0
 def grad(self, crd):
     crd =crd / ANGSTROM
     atom=" "
     for i in range(len(self.atoms)):
          atom+=self.atoms[i]+'\t'+str(crd[i, 0])+'\t'+str(crd[i, 1])+'\t'+str(crd[i, 2])+'\n'
     print atom
     mol = gto.M(atom=atom,basis=self.basis)
     rhf= scf.RHF(mol)
     energy = rhf.kernel()
     return energy* EH, grad.RHF(rhf).kernel()* (EH / BOHR)
예제 #11
0
파일: test_hf.py 프로젝트: NuturesH/pyscf-1
 def test_rhf_scanner(self):
     mol1 = mol.copy()
     mol1.set_geom_('''
     H   0.   0.   0.9
     F   0.   0.1  0.''')
     mf_scanner = grad.RHF(scf.RHF(mol).set(conv_tol=1e-14)).as_scanner()
     e, de = mf_scanner(mol)
     self.assertAlmostEqual(finger(de), 0.367743084803, 6)
     e, de = mf_scanner(mol1)
     self.assertAlmostEqual(finger(de), 0.041822093538, 6)
예제 #12
0
def calc_gradients_elec(mole, one_dm: np.ndarray, mf, coeffs, occs, energies):
    """Calculate electronic part of nuclear gradients.

    Parameters
    ----------
    mole
        A PySCF mole object.
    one_dm
        One-particle density matrix understood by IOdata 
        projected and formatted in a PySCF-compatible way 
        (single 2d array or list for a,b 2d arrays)
    mf
        A PySCF mean field object. Its only use is method specification.
    coeffs
        AO coefficient matrix understood by IOdata 
        projected and formatted in a PySCF-compatible way 
        (single 2d array or list for a,b 2d arrays)
    occs
        Occupation numbers formatted in a PySCF-compatible way 
        (single 1d array or list for a,b 1d arrays)
    energies
        MO energies formatted in a PySCF-compatible way 
        (single 1d array or list for a,b 1d arrays)


    Returns
    -------
    grad_elec
        Nuclear gradients in a.u. per cartesian coordinate per atom.
        (Due to electrons)

 """
    mo_energy = energies
    mo_coeff = coeffs
    mo_occ = occs
    if len(one_dm) == 2:
        try:
            grad_elec = grad.UKS(mf).grad_elec(mo_energy=mo_energy,
                                               mo_coeff=mo_coeff,
                                               mo_occ=mo_occ)
        except:
            grad_elec = grad.UHF(mf).grad_elec(mo_energy=mo_energy,
                                               mo_coeff=mo_coeff,
                                               mo_occ=mo_occ)
    else:
        try:
            grad_elec = grad.RKS(mf).grad_elec(mo_energy=mo_energy,
                                               mo_coeff=mo_coeff,
                                               mo_occ=mo_occ)
        except:
            grad_elec = grad.RHF(mf).grad_elec(mo_energy=mo_energy,
                                               mo_coeff=mo_coeff,
                                               mo_occ=mo_occ)
    return grad_elec
예제 #13
0
 def initialization_pyscf(self):
     self.scf_eng = scf.RHF(self.mol)
     self.scf_eng.conv_tol = 1e-11
     self.scf_eng.conv_tol_grad = 1e-9
     self.scf_eng.max_cycle = 100
     if self.init_scf:
         self.eng = self.scf_eng.kernel()
         if not self.scf_eng.converged:
             warnings.warn("SCF not converged!")
     self.scf_grad = grad.RHF(self.scf_eng)
     self.scf_hess = hessian.RHF(self.scf_eng)
     return
예제 #14
0
    def test_finite_diff_rhf_grad(self):
        mf = scf.RHF(mol)
        mf.conv_tol = 1e-14
        e0 = mf.kernel()
        g = grad.RHF(mf).kernel(atmlst=range(mol.natm))
        self.assertAlmostEqual(lib.finger(g), 0.0055115512502467556, 6)

        mf_scanner = mf.as_scanner()
        pmol = mol.copy()
        e1 = mf_scanner(
            pmol.set_geom_(
                'O  0. 0. 0.0001; 1  0. -0.757 0.587; 1  0. 0.757 0.587'))
        e2 = mf_scanner(
            pmol.set_geom_(
                'O  0. 0. -.0001; 1  0. -0.757 0.587; 1  0. 0.757 0.587'))
        self.assertAlmostEqual(g[0, 2], (e1 - e2) / 2e-4 * lib.param.BOHR, 5)
예제 #15
0
 def initialization_pyscf(self):
     if (self.scf_eng.mo_coeff is NotImplemented or self.scf_eng.mo_coeff is None) and self.init_scf:
         self.scf_eng.kernel()
         if not self.scf_eng.converged:
             warnings.warn("SCF not converged!")
     if isinstance(self.scf_eng, dft.rks.RKS):
         self.xc = self.scf_eng.xc
         self.grids = self.scf_eng.grids
         self.xc_type = dft.libxc.xc_type(self.xc)
         self.cx = dft.numint.NumInt().hybrid_coeff(self.xc)
         self.scf_grad = grad.rks.Gradients(self.scf_eng)
         self.scf_hess = hessian.rks.Hessian(self.scf_eng)
     else:
         self.scf_grad = grad.RHF(self.scf_eng)
         self.scf_hess = hessian.RHF(self.scf_eng)
     return
    def get_forces(self, atoms=None):
        if self.method == 'HF':
            mf = scf.RHF(
                gto.M(atom=ase_atoms_to_pyscf(atoms),
                      basis=self.basis,
                      charge=0,
                      verbose=0)).run()
            gradient = grad.RHF(mf).kernel()
            forces = gradient * convert_forces

            self.results['forces'] = forces
            return forces

        elif self.method == "DFT":
            mf = dft.RKS(
                gto.M(atom=ase_atoms_to_pyscf(atoms),
                      basis=self.basis,
                      charge=0,
                      verbose=0)).run()
            mf.xc = self.xc
            #gradient = grad.rks(mf).kernel()
            gradient = mf.nuc_grad_method().kernel()
            forces = gradient * convert_forces

            self.results['forces'] = forces
            return forces

        elif self.method == "MP2":
            mf = scf.RHF(
                gto.M(atom=ase_atoms_to_pyscf(atoms),
                      basis=self.basis,
                      charge=0,
                      verbose=0)).run()
            mp2 = mp.MP2(mf).run()
            gradient = mp2.nuc_grad_method().kernel()

            forces = gradient * convert_forces

            self.results['forces'] = forces
            return forces
예제 #17
0
    def calculate(self,
                  atoms=None,
                  properties=['energy', 'forces'],
                  system_changes=[
                      'positions', 'numbers', 'cell', 'pbc', 'charges',
                      'magmoms'
                  ]):

        Calculator.calculate(self, atoms)

        calc_molcell = self.molcell.copy()
        calc_molcell.atom = ase_atoms_to_pyscf(atoms)
        #				calc_molcell.a = atoms.cell
        calc_molcell.build(None, None)
        self.mf = self.mf_class(calc_molcell)
        for key in self.mf_dict:
            self.mf.__dict__[key] = self.mf_dict[key]

        self.results['energy'] = self.mf.scf(verbose=0)
        self.results['forces'] = -1 * grad.RHF(self.mf).kernel(
        )  # convert forces to gradient (*-1) !!!!! for the NEB run
        self.results['mf'] = self.mf
예제 #18
0
        -486.638981725713393)

    print('-----------------------------------')
    mol = gto.M(verbose=0,
                atom=[["O", (0., 0., 0.)], [1, (0., -0.757, 0.587)],
                      [1, (0., 0.757, 0.587)]],
                basis='631g')
    mf = scf.RHF(mol)
    ehf = mf.scf()

    mycc = ccsd.CCSD(mf)
    mycc.conv_tol = 1e-10
    mycc.conv_tol_normt = 1e-10
    ecc, t1, t2 = mycc.kernel()
    l1, l2 = mycc.solve_lambda()
    g1 = kernel(mycc, t1, t2, l1, l2, mf_grad=grad.RHF(mf))
    print('gcc')
    print(g1)
    #[[ 0   0                1.00950925e-02]
    # [ 0   2.28063426e-02  -5.04754623e-03]
    # [ 0  -2.28063426e-02  -5.04754623e-03]]

    lib.parameters.BOHR = 1
    r = 1.76  #.748
    mol = gto.M(verbose=0, atom='''H 0 0 0; H 0 0 %f''' % r, basis='631g')
    mf = scf.RHF(mol)
    mf.conv_tol = 1e-14
    ehf0 = mf.scf()
    ghf = grad.RHF(mf).grad()
    mycc = ccsd.CCSD(mf)
    mycc.conv_tol = 1e-10
예제 #19
0
파일: test_h2o.py 프로젝트: zzy2014/pyscf
 def test_energy_nuc(self):
     rhf = scf.RHF(h2o)
     g = grad.RHF(rhf)
     self.assertAlmostEqual(finger(g.grad_nuc()), 10.086972893020102, 9)
예제 #20
0
파일: test_h2o.py 프로젝트: zzy2014/pyscf
 def test_nr_rhf(self):
     rhf = scf.RHF(h2o)
     rhf.conv_tol = 1e-14
     rhf.kernel()
     g = grad.RHF(rhf)
     self.assertAlmostEqual(finger(g.grad_elec()), 10.126405944938071, 6)
예제 #21
0
if __name__ == '__main__':
    from pyscf import gto
    from pyscf import scf
    from pyscf.cc import ccsd
    from pyscf import grad

    mol = gto.M(verbose=0,
                atom=[["O", (0., 0., 0.)], [1, (0., -0.757, 0.587)],
                      [1, (0., 0.757, 0.587)]],
                basis='631g')
    mf = scf.RHF(mol).run()
    mycc = ccsd.CCSD(mf)
    ecc, t1, t2 = mycc.kernel()
    l1, l2 = mycc.solve_lambda()
    g1 = kernel(mycc, t1, t2, l1, l2)
    ghf = grad.RHF(mf).grad()
    print('gcc')
    print(ghf + g1)
    print(lib.finger(g1) - -0.042511000925747583)
    #[[ 0   0                1.00950969e-02]
    # [ 0   2.28063353e-02  -5.04754844e-03]
    # [ 0  -2.28063353e-02  -5.04754844e-03]]

    print('-----------------------------------')
    mol = gto.M(verbose=0,
                atom=[["O", (0., 0., 0.)], [1, (0., -0.757, 0.587)],
                      [1, (0., 0.757, 0.587)]],
                basis='631g')
    mf = scf.RHF(mol).run()
    mycc = ccsd.CCSD(mf)
    mycc.frozen = [0, 1, 10, 11, 12]
예제 #22
0
파일: test_hf.py 프로젝트: NuturesH/pyscf-1
 def test_energy_nuc(self):
     rhf = scf.RHF(mol)
     rhf.scf()
     g = grad.RHF(rhf)
     self.assertAlmostEqual(finger(g.grad_nuc()), 8.2887823210941249, 9)
예제 #23
0
파일: test_itrf.py 프로젝트: v3op01/pyscf
 def test_grad(self):
     coords = [(0.0,0.1,0.0)]
     charges = [1.00]
     mf = itrf.mm_charge(scf.RHF(mol), coords, charges).run()
     hfg = itrf.mm_charge_grad(grad.RHF(mf), coords, charges).run()
     self.assertAlmostEqual(numpy.linalg.norm(hfg.de), 30.316453059873059, 9)
예제 #24
0
파일: itrf.py 프로젝트: pengdl/pyscf
    fakemol._built = True
    return fakemol


if __name__ == '__main__':
    from pyscf import scf, cc, grad
    mol = gto.Mole()
    mol.atom = ''' O                  0.00000000    0.00000000   -0.11081188
                   H                 -0.00000000   -0.84695236    0.59109389
                   H                 -0.00000000    0.89830571    0.52404783 '''
    mol.basis = 'cc-pvdz'
    mol.build()

    coords = [(0.5, 0.6, 0.8)]
    #coords = [(0.0,0.0,0.0)]
    charges = [-0.5]
    mf = mm_charge(scf.RHF(mol), coords, charges)
    print(mf.kernel())  # -76.3206550372
    mycc = cc.ccsd.CCSD(mf)
    mycc.conv_tol = 1e-10
    mycc.conv_tol_normt = 1e-10
    ecc, t1, t2 = mycc.kernel()  # ecc = -0.228939687075
    l1, l2 = mycc.solve_lambda()[1:]

    hfg = mm_charge_grad(grad.RHF(mf), coords, charges)
    g1 = grad.ccsd.kernel(mycc, t1, t2, l1, l2, mf_grad=hfg)
    print(g1 + hfg.grad_nuc(mol))
# [[-0.50179182 -0.61489747 -0.96396085]
#  [-0.077348   -0.23457358  0.02839861]
#  [-0.44182244  0.14559838 -0.22348068]]
예제 #25
0
                      [1, (0., 0.757, -0.587)]],
                basis='631g')
    mf = scf.RHF(mol)
    mf.conv_tol = 1e-14
    ehf = mf.scf()

    mycc = ccsd.CCSD(mf)
    mycc.conv_tol = 1e-10
    mycc.conv_tol_normt = 1e-10
    ecc, t1, t2 = mycc.kernel()
    eris = mycc.ao2mo()
    e3ref = ccsd_t.kernel(mycc, eris, t1, t2)
    print ehf + ecc + e3ref
    eris = mycc.ao2mo(mf.mo_coeff)
    conv, l1, l2 = ccsd_t_lambda.kernel(mycc, eris, t1, t2)
    g1 = kernel(mycc, t1, t2, l1, l2, eris=eris, mf_grad=grad.RHF(mf))
    print(g1 + grad.grad_nuc(mol))
    #O      0.0000000000            0.0000000000           -0.0112045345
    #H      0.0000000000            0.0234464201            0.0056022672
    #H      0.0000000000           -0.0234464201            0.0056022672

    mol = gto.M(verbose=0,
                atom='''
H         -1.90779510     0.92319522     0.08700656
H         -1.08388168    -1.61405643    -0.07315086
H          2.02822318    -0.61402169     0.09396693
H          0.96345360     1.30488291    -0.10782263
               ''',
                unit='bohr',
                basis='631g')
    mf = scf.RHF(mol)
예제 #26
0
def model_cisd(q, params, full_id):
    """

    """

    Id = Cpp2Py(full_id)
    indx = Id[-1]

    r = q.col(indx)
    x1 = r.get(0)
    y1 = r.get(1)
    z1 = r.get(2)
    x2 = r.get(3)
    y2 = r.get(4)
    z2 = r.get(5)
    r = (1.0 / 1.889725989) * r  # convert to Angst

    mol = gto.M(atom=[['H', (x1, y1, z1)], ['H', (x2, y2, z2)]], basis="631g")
    mf = scf.RHF(mol)
    mf.verbose = -1
    res_mf = mf.kernel()
    print "HF energy = ", res_mf
    #   force = mf.nuc_grad_method().kernel()
    #    force = mf.grad()

    force = grad.RHF(mf).kernel()
    print force
    """
    myci = ci.cisd.CISD(mf)
    myci.verbose = -1
    myci.nstates = 1
    res_ci = myci.kernel()
    print "CISD correlation energy = ", res_ci[0]
    print "CISD vectors = ", res_ci[1]

    force = myci.nuc_grad_method().kernel(state=0)
    print force
    """

    obj = tmp()
    obj.ham_dia = CMATRIX(1, 1)
    obj.ovlp_dia = CMATRIX(1, 1)
    d1ham_dia = CMATRIXList()
    dc1_dia = CMATRIXList()

    for i in xrange(6):
        d1ham_dia.append(CMATRIX(1, 1))
        dc1_dia.append(CMATRIX(1, 1))

    obj.ham_dia.set(0, 0, (res_mf) * (1.0 + 0.0j))
    #    obj.ham_dia.set(0,0, (res_mf + res_ci[0])*(1.0+0.0j) )
    obj.ovlp_dia.set(0, 0, 1.0 + 0.0j)

    #  d Hdia / dR_0
    d1ham_dia[0].set(0, 0, (force[0][0]) * (1.0 + 0.0j))
    d1ham_dia[1].set(0, 0, (force[0][1]) * (1.0 + 0.0j))
    d1ham_dia[2].set(0, 0, (force[0][2]) * (1.0 + 0.0j))
    d1ham_dia[3].set(0, 0, (force[1][0]) * (1.0 + 0.0j))
    d1ham_dia[4].set(0, 0, (force[1][1]) * (1.0 + 0.0j))
    d1ham_dia[5].set(0, 0, (force[1][2]) * (1.0 + 0.0j))

    for i in xrange(6):
        #  <dia| d/dR_0| dia >
        dc1_dia[i].set(0, 0, 0.0 + 0.0j)

    obj.d1ham_dia = d1ham_dia
    obj.dc1_dia = dc1_dia

    return obj