def run(lastres=[]): results = [] # Hirshfeld ---------------------------------------- if 1: hd = HirshfeldDensity(calc) # check for the number of electrons expected = [ [None, 10], [[0, 1, 2], 10], [[1, 2], 2], [[0], 8], ] #expected = [[[0, 2], 9], ] #expected = [[None, 10], ] for gridrefinement in [1, 2, 4]: #Test for all gridrefinements for get_all_electron_density parprint('grid refinement', gridrefinement) for result in expected: indicees, result = result full, gd = hd.get_density(indicees, gridrefinement) parprint('indicees', indicees, end=': ') parprint('result, expected:', gd.integrate(full), result) if gridrefinement < 4: #The highest level of gridrefinement gets wrong electron numbers equal(gd.integrate(full), result, 1.e-8) else: equal(gd.integrate(full), result, 1.e-4) hp = HirshfeldPartitioning(calc) vr = hp.get_effective_volume_ratios() parprint('Hirshfeld:', vr) if len(lastres): equal(vr, lastres.pop(0), 1.e-10) results.append(vr) # Wigner-Seitz ---------------------------------------- if 1: ws = WignerSeitz(calc.density.finegd, mol, calc) vr = ws.get_effective_volume_ratios() parprint('Wigner-Seitz:', vr) if len(lastres): equal(vr, lastres.pop(0), 1.e-10) results.append(vr) return results
def run(lastres=[]): results = [] # Hirshfeld ---------------------------------------- if 1: hd = HirshfeldDensity(calc) # check for the number of electrons expected = [[None, 10], [[0, 1, 2], 10], [[1, 2], 2], [[0], 8], ] #expected = [[[0, 2], 9], ] #expected = [[None, 10], ] for gridrefinement in [1, 2, 4]: #Test for all gridrefinements for get_all_electron_density parprint('grid refinement', gridrefinement) for result in expected: indicees, result = result full, gd = hd.get_density(indicees, gridrefinement) parprint('indicees', indicees, end=': ') parprint('result, expected:', gd.integrate(full), result) if gridrefinement < 4: #The highest level of gridrefinement gets wrong electron numbers equal(gd.integrate(full), result, 1.e-8) else: equal(gd.integrate(full), result, 1.e-5) hp = HirshfeldPartitioning(calc) vr = hp.get_effective_volume_ratios() parprint('Hirshfeld:', vr) if len(lastres): equal(vr, lastres.pop(0), 1.e-10) results.append(vr) # Wigner-Seitz ---------------------------------------- if 1: ws = WignerSeitz(calc.density.finegd, mol, calc) vr = ws.get_effective_volume_ratios() parprint('Wigner-Seitz:', vr) if len(lastres): equal(vr, lastres.pop(0), 1.e-10) results.append(vr) return results
# split the structures s1 = ss.find_connected(0) s2 = ss.find_connected(-1) assert len(ss) == len(s1) + len(s2) c = GPAW(xc='PBE', h=h, nbands=-6, occupations=FermiDirac(width=0.1), txt=None) cdf = GPAW(xc='vdW-DF', h=h, nbands=-6, occupations=FermiDirac(width=0.1), txt=None) for s in [s1, s2, ss]: s.set_calculator(c) s.minimal_box(box, h=h) Energy['PBE'].append(s.get_potential_energy()) cc = vdWTkatchenko09prl(HirshfeldPartitioning(c), vdWradii(s.get_chemical_symbols(), 'PBE')) s.set_calculator(cc) Energy['TS09'].append(s.get_potential_energy()) s.set_calculator(cdf) Energy['vdW-DF'].append(s.get_potential_energy()) parprint('Coupled cluster binding energy', -data[molecule]['interaction energy CC'] * 1000, 'meV') for xc in ['PBE', 'vdW-DF', 'TS09']: ene = Energy[xc] # print xc, 'energies', ene parprint(xc, 'binding energy', (ene[0] + ene[1] - ene[2]) * 1000, 'meV')
"""Test Hirshfeld for spin/no spin consitency""" from ase import Atom from gpaw import GPAW from ase.parallel import parprint from gpaw.analyse.hirshfeld import HirshfeldPartitioning from gpaw import FermiDirac from gpaw.cluster import Cluster from gpaw.test import equal h = 0.25 box = 3 atoms = Cluster() atoms.append(Atom('H')) atoms.minimal_box(box) volumes = [] for spinpol in [False, True]: calc = GPAW(h=h, occupations=FermiDirac(0.1, fixmagmom=True), experimental={'niter_fixdensity': 2}, spinpol=spinpol) calc.calculate(atoms) volumes.append(HirshfeldPartitioning(calc).get_effective_volume_ratios()) parprint(volumes) equal(volumes[0][0], volumes[1][0], 4e-9)
hd = HirshfeldDensity(calc) # check for the number of electrons expected = [ [None, 10], [[0, 1, 2], 10], [[1, 2], 2], [[0], 8], ] #expected = [[[0, 2], 9], ] #expected = [[None, 10], ] for result in expected: indicees, result = result full, gd = hd.get_density(indicees) parprint('indicees', indicees, end=': ') parprint('result, expected:', gd.integrate(full), result) equal(gd.integrate(full), result, 1.e-8) hp = HirshfeldPartitioning(calc) vr = hp.get_effective_volume_ratios() parprint('Hirshfeld:', vr) # equal(vr[1], vr[2], 1.e-3) # Wigner-Seitz ---------------------------------------- if 1: ws = WignerSeitz(calc.density.finegd, mol, calc) vr = ws.get_effective_volume_ratios() parprint('Wigner-Seitz:', vr)
equal(q_a.sum(), q, 0.03) return q_a # spin unpolarized if 1: out_traj = 'LiH.traj' out_txt = 'LiH.txt' cc = GPAW(h=h, xc='PBE', txt=out_txt) # this is needed to initialize txt output cc.initialize(s) hp = HirshfeldPartitioning(cc) c = vdWTkatchenko09prl(hp, vdWradii(s.get_chemical_symbols(), 'PBE')) s.set_calculator(c) E = s.get_potential_energy() F_ac = s.get_forces() s.write(out_traj) q_a = print_charge_and_check(hp) barrier() # test I/O, accuracy due to text output accuracy = 1.e-5 for fname in [out_traj, out_txt]: print(fname) s_out = ase.io.read(fname) print(s_out.calc)
hd = HirshfeldDensity(calc) # check for the number of electrons expected = [[None, 10], [[0, 1, 2], 10], [[1, 2], 2], [[0], 8], ] #expected = [[[0, 2], 9], ] #expected = [[None, 10], ] for result in expected: indicees, result = result full, gd = hd.get_density(indicees) parprint('indicees', indicees, end=': ') parprint('result, expected:', gd.integrate(full), result) equal(gd.integrate(full), result, 1.e-8) hp = HirshfeldPartitioning(calc) vr = hp.get_effective_volume_ratios() parprint('Hirshfeld:', vr) # equal(vr[1], vr[2], 1.e-3) # Wigner-Seitz ---------------------------------------- if 1: ws = WignerSeitz(calc.density.finegd, mol, calc) vr = ws.get_effective_volume_ratios() parprint('Wigner-Seitz:', vr)