Пример #1
0
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)
Пример #2
0
 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)
Пример #3
0
 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)
Пример #4
0
 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)
Пример #5
0
 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)