a = 5.404 bulk = Atoms(symbols='Si8', positions=[(0, 0, 0), (0, 0.5, 0.5), (0.5, 0, 0.5), (0.5, 0.5, 0), (0.25, 0.25, 0.25), (0.25, 0.75, 0.75), (0.75, 0.25, 0.75), (0.75, 0.75, 0.25)], pbc=True) bulk.set_cell((a, a, a), scale_atoms=True) n = 20 parameters = { 'gpts':(n,n,n), 'nbands':8*3, 'width':0.1, 'kpts':(2,2,2), 'usesymm':True, 'xc':'GLLB'} bulk.set_calculator(GPAW(**parameters)) E = bulk.get_potential_energy() parameters['usesymm'] = False bulk.set_calculator(GPAW(**parameters)) E2 = bulk.get_potential_energy() equal(E, E2, 1e-3)
# This test takes approximately 0.4 seconds from ase import * from gpaw.utilities import equal from gpaw import GPAW a = 6.0 atoms = Atoms( [Atom('C', [a / 2 + 0.0234, a / 2 + 0.0345, a / 2 + 0.0456], magmom=2)], cell=(a, a, a)) calc = GPAW(nbands=6, h=0.2, hund=0, convergence={'eigenstates': 1e-11}) atoms.set_calculator(calc) for i in range(3): f1, f2 = CheckForce(atoms, 0, i, 0.012) equal(f1, f2, 0.0022)
g = Generator(atom, xcname='GLLB', scalarrel=False, nofiles=True) g.run(**parameters[atom]) setup_paths.insert(0, '.') a = 5.404 bulk = Atoms(symbols='Si8', positions=[(0, 0, 0), (0, 0.5, 0.5), (0.5, 0, 0.5), (0.5, 0.5, 0), (0.25, 0.25, 0.25), (0.25, 0.75, 0.75), (0.75, 0.25, 0.75), (0.75, 0.75, 0.25)], pbc=True) bulk.set_cell((a, a, a), scale_atoms=True) n = 20 parameters = { 'gpts': (n, n, n), 'nbands': 8 * 3, 'width': 0.1, 'kpts': (2, 2, 2), 'usesymm': True, 'xc': 'GLLB' } bulk.set_calculator(GPAW(**parameters)) E = bulk.get_potential_energy() parameters['usesymm'] = False bulk.set_calculator(GPAW(**parameters)) E2 = bulk.get_potential_energy() equal(E, E2, 1e-3)
e = fcc.get_potential_energy() calc.write(file_prefix + '.gpw') del calc, fcc for nhosts in nhostsread: file_prefix = 'Fe_%d_%1.1f_par%d' % (nkpt, magmom, nhosts) print '------ restart calculation ', file_prefix, rank * 111111111 calc = Calculator(file_prefix + '.gpw', txt=file_prefix + '_restart.txt', tolerance=1e-10) atoms = calc.get_atoms() atoms.positions[0] = (0, 0, -0.0001) erg = atoms.get_potential_energy() result = 'ok' equal(e, erg, 1e-4) niter = calc.niter tests.append((test, result, niter, nhosts)) del calc, atoms for test in tests: print "%s ---- %10s --- %d ---- %d " % (test[0], test[1], test[2], test[3]) nhosts = 8 d = 2.0 if 1: a = 5.0 O2 = Atoms([ Atom('O', (0 + d, d, d), magmom=1),
from ase import * from gpaw.utilities import equal import numpy as np from gpaw import GPAW from gpaw.poisson import PoissonSolver a = 2.7 bulk = Atoms('Li', pbc=True, cell=(a, a, a)) k = 4 g = 8 calc = GPAW(gpts=(g, g, g), kpts=(k, k, k), nbands=2, poissonsolver=PoissonSolver(relax='GS'), txt=None) bulk.set_calculator(calc) bulk.get_potential_energy() ave_pot = np.sum(calc.hamiltonian.vHt_g.ravel()) / (2 * g)**3 equal(ave_pot, 0.0, 1e-8) calc = GPAW(gpts=(g, g, g), kpts=(k, k, k), nbands=2, poissonsolver=PoissonSolver(relax='J'), txt=None) bulk.set_calculator(calc) bulk.get_potential_energy() ave_pot = np.sum(calc.hamiltonian.vHt_g.ravel()) / (2 * g)**3 equal(ave_pot, 0.0, 1e-8)
'X_PBE-C_PBE': -7.51091709464 * Hartree, # 'PBE' 'X_PBE_R-C_PBE': -7.5341232518 * Hartree, # 'revPBE' 'oldRPBE': -7.53943687939 * Hartree, # 'oldRPBE' 'PW91': -7.52300459704 * Hartree, # 'PW91' 'oldLDA': -7.3970905596 * Hartree, # 'oldLDA' 'LDA': -7.3970905596 * Hartree # 'LDA' } a = 5.0 n = 24 li = Atoms([Atom('Li', (0.0, 0.0, 0.0), magmom=1.0)], cell=(a, a, a), pbc=True) calc = GPAW(gpts=(n, n, n), nbands=1, xc='X_PBE-C_PBE') li.set_calculator(calc) e = li.get_potential_energy() + calc.get_reference_energy() equal(e, -7.462 * Hartree, 0.056 * Hartree) equal(e, reference_886['X_PBE-C_PBE'], tolerance) calc.set(xc='X_PBE_R-C_PBE') erev = li.get_potential_energy() + calc.get_reference_energy() equal(erev, -7.487 * Hartree, 0.057 * Hartree) equal(erev, reference_886['X_PBE_R-C_PBE'], tolerance) equal(e - erev, 0.025 * Hartree, 0.002 * Hartree) calc.set(xc='X-C_PW') elda = li.get_potential_energy() + calc.get_reference_energy() equal(elda, reference_886['X-C_PW'], tolerance) calc.set(xc='RPBE') erpbe = li.get_potential_energy() + calc.get_reference_energy() equal(erpbe, reference_886['oldRPBE'], tolerance)
parsizes_dc[8] = [(1,2,4),(1,4,2),(2,1,4),(2,2,2),(2,4,1),(4,1,2),(4,2,1)] #more if spinpol: ndomains = max(1, world.size//2) else: ndomains = world.size for pbc_c in pbcs_c: name_spin = 'spin%s' % (spinpol and 'polarized' or 'paired') name_pbc = 'pbc%d%d%d' % pbc_c[:] name = 'resume_%s_%s' % (name_spin, name_pbc) for parsize_c in parsizes_dc[ndomains]: calc = get_calc(name, spinpol, parsize_c, pbc_c) write('spinpol=%s, pbc=(%d,%d,%d), parsize=(%d,%d,%d): ' \ % ((spinpol,) + tuple(pbc_c) + tuple(parsize_c))) try: E1 = calc.get_potential_energy() calc.scf.reset() calc.scf.niter_fixdensity = -1 #a hack! calc.calculate(calc.atoms) E2 = calc.get_potential_energy() except ValueError, e: if e.message != 'Grid too small!': raise e write('ignored\n') else: equal(E1, E2, 1e-4) write('ok\n')
E_alone_neutral = Be_alone.get_potential_energy() Be_aloneC.set_calculator(GPAW(h=0.3, charge=+1, nbands=1)) E_alone_charged = Be_aloneC.get_potential_energy() print "A test for periodic charged calculations" print "Be neutal solid: ", E_solid_neutral, " eV" print "Be neutal alone: ", E_alone_neutral, " eV" print "Be charged solid: ", E_solid_charged, " eV" print "Be charged alone: ", E_alone_charged, " eV" IPs = E_solid_neutral - E_solid_charged IPa = E_alone_neutral - E_alone_charged print "Ionization potential solid", IPs, " eV" print "Ionization potential alone", IPa, " eV" # Make sure that the ionization potential won't differ by more than 0.05eV equal(Ips, IPa, 0.05) from gpaw.utilities import equal """Some results: WITH CORRECTION TURNED ON: a = 12.0 Be neutal solid: 0.000241919665987 eV Be neutal alone: 0.000520077168021 eV Be charged solid: 8.95928916603 eV Be charged alone: 9.03395959412 eV Ionization potential solid -8.95904724637 eV Ionization potential alone -9.03343951695 eV Difference: 0.07eV
from gpaw.analyse.expandyl import ExpandYl R = 1. H2 = Cluster([Atom('H',(0,0,0)), Atom('H',(0,0,R))]) H2.minimal_box(3.) calc = Calculator(h=0.2, width=0.01, nbands=2) H2.SetCalculator(calc) H2.GetPotentialEnergy() yl = ExpandYl(H2.center_of_mass(), calc.wfs.gd, Rmax=2.5) gl = [] for n in range(calc.nbands): psit_G = calc.kpt_u[0].psit_nG[n] norm = calc.wfs.gd.integrate(psit_G**2) g = yl.expand(psit_G) gsum = np.sum(g) # allow for 10 % inaccuracy in the norm print "norm, sum=", norm, gsum equal(norm, gsum, 0.1) gl.append(g/gsum*100) # 1 sigma_g has s-symmetry mainly print gl[0] equal( gl[0][0], 100, 10) # 1 sigma_u has p-symmetry mainly print gl[1] equal( gl[1][1], 100, 10)
calc.write(file_prefix+'.gpw') del calc,fcc for nhosts in nhostsread: file_prefix = 'Fe_%d_%1.1f_par%d'%(nkpt,magmom,nhosts) print '------ restart calculation ',file_prefix, rank*111111111 calc = GPAW(file_prefix+'.gpw', txt=file_prefix+'_restart.txt', tolerance = 1e-10) atoms = calc.get_atoms() atoms[0].set_cartesian_position([0, 0, -0.0001]) erg = atoms.get_potential_energy() result = 'ok' equal(e,erg,1e-4) niter = calc.niter tests.append((test,result,niter,nhosts)) del calc,atoms for test in tests: print "%s ---- %10s --- %d ---- %d "%(test[0],test[1],test[2],test[3]) nhosts = 8 d = 2.0 if 1: a = 5.0 O2 = Atoms([Atom('O',(0+d,d,d ), magmom=1),
spinpol=False, convergence={'eigenstates': 1e-7}) atoms.set_calculator(calc) atoms.get_potential_energy() calc.write('hwire%s.gpw' % natoms, 'all') else: calc = GPAW('hwire%s.gpw' % natoms, txt=None) wannier = Wannier(numberofwannier=natoms, calculator=calc, occupationenergy=occupationenergy,) # initialwannier=[[[1.* i / natoms, .5, .5], [0,], .5] # for i in range(natoms)]) wannier.localize() wannier.translate_all_wannier_functions_to_cell([1, 0, 0]) centers = wannier.get_centers() for i in wannier.get_sorted_indices(): center = centers[i]['pos'] print center quotient = round(center[0] / hhbondlength) equal(hhbondlength*quotient - center[0], 0., 2e-3) equal(center[1], 4., 2e-3) equal(center[2], 4., 2e-3) for i in range(natoms): wannier.write_cube(i, 'hwire%s.cube' % i, real=True) os.system('rm hwire1.gpw hwire*.cube')
# This test takes approximately 0.4 seconds from ase import * from gpaw.utilities import equal from gpaw import GPAW a = 6.0 atoms = Atoms([Atom('C', [a / 2 + 0.0234, a / 2 + 0.0345, a / 2 + 0.0456], magmom=2)], cell=(a, a, a)) calc = GPAW(nbands=6, h=0.2, hund=0, convergence={'eigenstates': 1e-11}) atoms.set_calculator(calc) for i in range(3): f1, f2 = CheckForce(atoms, 0, i, 0.012) equal(f1, f2, 0.0022)
xc='PBE', kpts=[4,4,1], convergence={'energy': 0.001, 'density': 0.001, 'eigenstates': 1.0e-7, 'bands': -3}) atoms.set_calculator(calc_1) E_gs = atoms.get_potential_energy() # Dscf calculation based on the MolecularOrbital class calc_1.set(nbands=25, spinpol=True) weights = {2: [0.,0.,0.,1.], 3: [0.,0.,0.,-1.]} lumo = dscf.MolecularOrbital(calc_1, weights=weights) dscf.dscf_calculation(calc_1, [[1.0, lumo, 1]], atoms) E_es1 = atoms.get_potential_energy() equal(E_es1, E_gs + 4.55, 0.1) # Dscf calculation based on the AEOrbital class. Two new calculators # are needed. One for the molecule and one for the dscf calcultion""" calc_mol = GPAW(h=0.24, nbands=8, xc='PBE', spinpol=True, kpts=[4,4,1], convergence={'energy': 0.1, 'density': 0.1, 'eigenstates': 1.0e-9, 'bands': -1}) CO = atoms.copy() del CO[:2] CO.set_calculator(calc_mol)
from ase import * from gpaw import GPAW from gpaw.utilities import equal a = 5.0 H = Atoms('H', [(a/2, a/2, a/2)], magmoms=[1], pbc=False, cell=(a, a, a)) H.set_calculator(GPAW(h=0.1, setups='ae', fixmom=True)) e1 = H.get_potential_energy() c = a / 2.0 d = 0.74 s = d / 2 / 3**0.5 H2 = Atoms('H2', [(c - s, c - s, c - s), (c + s, c + s, c + s)], pbc=False, cell=(a, a, a)) H2.set_calculator(GPAW(h=0.1, setups='ae')) e2 = H2.get_potential_energy() print e1, e2, 2 * e1 - e2 equal(2 * e1 - e2, 4.55354238957, 1e-5)
atoms.set_calculator(calc) atoms.get_potential_energy() calc.write('hwire%s.gpw' % natoms, 'all') else: calc = GPAW('hwire%s.gpw' % natoms, txt=None) wannier = Wannier( numberofwannier=natoms, calculator=calc, occupationenergy=occupationenergy, ) # initialwannier=[[[1.* i / natoms, .5, .5], [0,], .5] # for i in range(natoms)]) wannier.localize() wannier.translate_all_wannier_functions_to_cell([1, 0, 0]) centers = wannier.get_centers() for i in wannier.get_sorted_indices(): center = centers[i]['pos'] print center quotient = round(center[0] / hhbondlength) equal(hhbondlength * quotient - center[0], 0., 2e-3) equal(center[1], 4., 2e-3) equal(center[2], 4., 2e-3) for i in range(natoms): wannier.write_cube(i, 'hwire%s.cube' % i, real=True) os.system('rm hwire1.gpw hwire*.cube')
parsizes_dc[8] = [(1, 2, 4), (1, 4, 2), (2, 1, 4), (2, 2, 2), (2, 4, 1), (4, 1, 2), (4, 2, 1)] #more if spinpol: ndomains = max(1, world.size // 2) else: ndomains = world.size for pbc_c in pbcs_c: name_spin = 'spin%s' % (spinpol and 'polarized' or 'paired') name_pbc = 'pbc%d%d%d' % pbc_c[:] name = 'resume_%s_%s' % (name_spin, name_pbc) for parsize_c in parsizes_dc[ndomains]: calc = get_calc(name, spinpol, parsize_c, pbc_c) write('spinpol=%s, pbc=(%d,%d,%d), parsize=(%d,%d,%d): ' \ % ((spinpol,) + tuple(pbc_c) + tuple(parsize_c))) try: E1 = calc.get_potential_energy() calc.scf.reset() calc.scf.niter_fixdensity = -1 #a hack! calc.calculate(calc.atoms) E2 = calc.get_potential_energy() except ValueError, e: if e.message != 'Grid too small!': raise e write('ignored\n') else: equal(E1, E2, 1e-4) write('ok\n')
calc = GPAW(convergence={'eigenstates': 1e-6}, hosts=hosts, txt='exx_parallel.txt') loa.set_calculator(calc) p.append(loa.get_potential_energy()) exx.append(calc.get_exact_exchange()) print 'number of CPUs :', hosts print 'Potential energy :', p[i] print 'Exchange energy :', exx[i] print '' i += 1 for i in range(1, len(exx)): equal(p[i], p[0], 1e-2) equal(exx[i], exx[0], 1e-2) ## number of CPUs : 1 ## Potential energy : -1.07206007502 ## Exchange energy : -137.443595686 ## number of CPUs : 2 ## Potential energy : -1.07206007502 ## Exchange energy : -137.443595686 ## number of CPUs : 3 ## Potential energy : -1.0721486372 ## Exchange energy : -137.405085235 ## number of CPUs : 4