def calc_localized_orbitals(mf,mol,method='ER',jmol=False): # mf ... pyscf calculation object # mol ... pyscf geometry object # method ... localization method: ER, FB, PM # jmol ... debug option to check furher 3d information files # Localization. # Spin 1. # only occupied orbitals mo_occ = mf.mo_coeff[0][:,mf.mo_occ[0]>0] if method == 'ER': loc1 = edmiston.Edmiston(mol, mo_occ) if method == 'FB': loc1 = boys.Boys(mol, mo_occ) if method == 'PM': loc1 = pipek.PipekMezey(mol, mo_occ) orb1 = loc1.kernel() # Spin 2 # only occupied orbitals mo_occ = mf.mo_coeff[1][:,mf.mo_occ[1]>0] if method == 'ER': loc2 = edmiston.Edmiston(mol, mo_occ) if method == 'FB': loc2 = boys.Boys(mol, mo_occ) if method == 'PM': loc2 = pipek.PipekMezey(mol, mo_occ) orb2 = loc2.kernel() # Write orbitals for jmol format. if jmol == True: # Spin 1. tools.molden.from_mo(mol, 'orb1.molden', orb1) with open('orb1.spt', 'w') as f: f.write('load orb1.molden; isoSurface MO 001;\n') # Spin 2. tools.molden.from_mo(mol, 'orb2.molden', orb2) with open('orb2.spt', 'w') as f: f.write('load orb2.molden; isoSurface MO 001;\n') # Write orbitals in cube format. # Spin 1. occ = len(mf.mo_coeff[0][mf.mo_occ[0] == 1]) for i in range(occ): orbital(mol, str(method)+'_orb_'+str(i)+'spin1.cube', orb1[:,i], nx=80, ny=80, nz=80) # Spin 2. occ = len(mf.mo_coeff[1][mf.mo_occ[1] == 1]) for i in range(occ): orbital(mol, str(method)+'_orb_'+str(i)+'spin2.cube', orb2[:,i], nx=80, ny=80, nz=80)
def test_pipek(self): idx = numpy.array([17,20,21,22,23,30,36,41,42,47,48,49])-1 loc = pipek.PipekMezey(mol) mo = loc.kernel(mf.mo_coeff[:,idx]) pop = pipek.atomic_pops(mol, mo) z = numpy.einsum('xii,xii->', pop, pop) self.assertAlmostEqual(z, 12, 4)
def test_pipek_becke_scheme(self): loc = pipek.PipekMezey(h2o, mf_h2o.mo_coeff[:, 3:8]) loc.pop_method = 'becke' mo = loc.kernel() pop = pipek.atomic_pops(h2o, mo) z = numpy.einsum('xii,xii->', pop, pop) self.assertAlmostEqual(z, 3.548139685217463, 4)
def test_pipek_exp4(self): loc = pipek.PipekMezey(h2o, mf_h2o.mo_coeff[:, 3:8]) loc.exponent = 4 loc.max_cycle = 100 mo = loc.kernel() pop = pipek.atomic_pops(h2o, mo) z = numpy.einsum('xii,xii->', pop, pop) self.assertAlmostEqual(z, 3.5368940222128247, 4)
def test_pipek(self): idx = numpy.array([17, 20, 21, 22, 23, 30, 36, 41, 42, 47, 48, 49]) - 1 # Initial guess from Boys localization. Otherwise uncertainty between # two solutions found in PM kernel mo = boys.Boys(mol, mf.mo_coeff[:, idx]).kernel() loc = pipek.PipekMezey(mol, mo) loc.max_cycle = 100 mo = loc.kernel() pop = pipek.atomic_pops(mol, mo) z = numpy.einsum('xii,xii->', pop, pop) self.assertAlmostEqual(z, 12, 4)