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
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)
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)
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)
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)
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)
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)
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)
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
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)
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)
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
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
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)
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
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
-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
def test_energy_nuc(self): rhf = scf.RHF(h2o) g = grad.RHF(rhf) self.assertAlmostEqual(finger(g.grad_nuc()), 10.086972893020102, 9)
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)
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]
def test_energy_nuc(self): rhf = scf.RHF(mol) rhf.scf() g = grad.RHF(rhf) self.assertAlmostEqual(finger(g.grad_nuc()), 8.2887823210941249, 9)
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)
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]]
[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)
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