def check_df(name, ref_energy, ref_loss, ref_energy_lfe, ref_loss_lfe, **kwargs_override): kwargs = dict(calc=calc, frequencies=w.copy(), eta=0.5, ecut=30, txt="df.%s.txt" % name) kwargs.update(kwargs_override) df = DielectricFunction(**kwargs) fname = "dfdump.%s.dat" % name df.get_eels_spectrum("RPA", q_c=q, filename=fname) world.barrier() d = np.loadtxt(fname, delimiter=",") loss = d[:, 1] loss_lfe = d[:, 2] energies = d[:, 0] # import pylab as pl # fig = pl.figure() # ax1 = fig.add_subplot(111) # ax1.plot(d[:, 0], d[:, 1]/np.max(d[:, 1])) # ax1.plot(d[:, 0], d[:, 2]/np.max(d[:, 2])) # ax1.axis(ymin=0, ymax=1) # fig.savefig('fig.%s.pdf' % name) energy, peakloss = getpeak(energies, loss) energy_lfe, peakloss_lfe = getpeak(energies, loss_lfe) check(name, energy, peakloss, ref_energy, ref_loss) check("%s-lfe" % name, energy_lfe, peakloss_lfe, ref_energy_lfe, ref_loss_lfe) line = template % (name, energy, peakloss, energy_lfe, peakloss_lfe, repr(kwargs_override)) scriptlines.append(line)
def get_hydrogen_chain_dielectric_function(NH, NK): a = Atoms('H', cell=[1, 1, 1], pbc=True) a.center() a = a.repeat((1, 1, NH)) a.calc = GPAW(mode=PW(200), kpts={'size': (1, 1, NK), 'gamma': True}, parallel={'band': 1}, dtype=complex, gpts=(10, 10, 10 * NH)) a.get_potential_energy() a.calc.diagonalize_full_hamiltonian(nbands=2 * NH) a.calc.write('H_chain.gpw', 'all') DF = DielectricFunction('H_chain.gpw', ecut=1e-3, hilbert=False, omega2=np.inf, intraband=False) eps_NLF, eps_LF = DF.get_dielectric_function(direction='z') omega_w = DF.get_frequencies() return omega_w, eps_LF
calc = GPAW(mode=PW(200), kpts=(4,4,4), parallel={'band':1}, idiotproof=False, # allow uneven distribution of k-points xc='LDA') atoms.set_calculator(calc) atoms.get_potential_energy() calc.write('Al', 'all') t2 = time.time() # Excited state calculation q = np.array([1/4.,0.,0.]) w = np.linspace(0, 24, 241) df = DielectricFunction(calc='Al', frequencies=w, eta=0.2, ecut=50, hilbert=False) df.get_eels_spectrum(xc='RPA', filename='EELS_Al', q_c=q) #df.check_sum_rule() #df.write('Al.pckl') t3 = time.time() print '' print 'For ground state calc, it took', (t2 - t1) / 60, 'minutes' print 'For excited state calc, it took', (t3 - t2) / 60, 'minutes' world.barrier() d = np.loadtxt('EELS_Al',delimiter=',') # New results are compared with test values wpeak1,Ipeak1 = findpeak(d[:,0],d[:,1])
atoms.get_potential_energy() calc.set(kpts=(20, 20, 7), fixdensity=True) atoms.get_potential_energy() # The result should also be converged with respect to bands: calc.diagonalize_full_hamiltonian(nbands=60) calc.write('graphite.gpw', 'all') # Part 2: Spectra calculations f = paropen('graphite_q_list', 'w') # write q for i in range(1, 6): # loop over different q df = DielectricFunction(calc='graphite.gpw', domega0=0.01, eta=0.2, # Broadening parameter. ecut=100, # write different output for different q: txt='out_df_%d.txt' % i) q_c = [i / 20.0, 0.0, 0.0] # Gamma - M excitation df.get_eels_spectrum(q_c=q_c, filename='graphite_EELS_%d' % i) # Calculate cartesian momentum vector: cell_cv = atoms.get_cell() bcell_cv = 2 * np.pi * np.linalg.inv(cell_cv).T q_v = np.dot(q_c, bcell_cv) print(sqrt(np.inner(q_v, q_v)), file=f) f.close()
from gpaw.test import equal, findpeak a = 6.75 * Bohr atoms = bulk('C', 'diamond', a=a) calc = GPAW(mode='pw', kpts=(3, 3, 3), eigensolver='rmm-diis', occupations=FermiDirac(0.001)) atoms.set_calculator(calc) atoms.get_potential_energy() calc.write('C.gpw', 'all') # Macroscopic dielectric constant calculation df = DielectricFunction('C.gpw', frequencies=(0.,), eta=0.001, ecut=200, hilbert=False) eM1, eM2 = df.get_macroscopic_dielectric_constant() eM1_ = 9.725 eM2_ = 9.068 equal(eM1, eM1_, 0.01) equal(eM2, eM2_, 0.01) # Absorption spectrum calculation df = DielectricFunction('C.gpw', eta=0.25, ecut=200, frequencies=np.linspace(0, 24., 241), hilbert=False) b0, b = df.get_dielectric_function(filename=None) df.check_sum_rule(b.imag) equal(b0[0].real, eM1_, 0.01)
xc='LDA', occupations=FermiDirac(0.001)) # Use small FD smearing atoms.set_calculator(calc) atoms.get_potential_energy() # Get ground state density # Restart Calculation with fixed density and dense kpoint sampling calc.set(kpts={'density': 15.0, 'gamma': False}, # Dense kpoint sampling fixdensity=True) atoms.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=70) # Diagonalize Hamiltonian calc.write('si_large.gpw', 'all') # Write wavefunctions # Getting absorption spectrum df = DielectricFunction(calc='si_large.gpw', eta=0.05, domega0=0.02, ecut=150) df.get_dielectric_function(filename='si_abs.csv') # Getting macroscopic constant df = DielectricFunction(calc='si_large.gpw', frequencies=[0.0], hilbert=False, eta=0.0001, ecut=150, ) epsNLF, epsLF = df.get_macroscopic_dielectric_constant() # Make table epsrefNLF = 14.08 # From [1] in top
eigensolver=RMM_DIIS(), mixer=Mixer(0.1,3), kpts=(4,4,4), parallel={'band':1}, idiotproof=False, # allow uneven distribution of k-points xc='LDA') atoms.set_calculator(calc) atoms.get_potential_energy() t2 = time.time() # Excited state calculation q = np.array([1/4.,0.,0.]) w = np.linspace(0, 24, 241) df = DielectricFunction(calc=calc, frequencies=w, eta=0.2, ecut=50) eels_NLFC_w, eels_LFC_w = df.get_eels_spectrum(filename='EELS_Al', q_c=q) df_NLFC_w, df_LFC_w = df.get_dielectric_function(q_c=q) df.check_sum_rule(spectrum=np.imag(df_NLFC_w)) df.check_sum_rule(spectrum=np.imag(df_LFC_w)) df.check_sum_rule(spectrum=eels_NLFC_w) df.check_sum_rule(spectrum=eels_LFC_w) #df.write('Al.pckl') t3 = time.time() print('') print('For ground state calc, it took', (t2 - t1) / 60, 'minutes')
txt='large.txt') a1.get_potential_energy() a2.get_potential_energy() # Use twice as many bands for expanded structure a1.calc.diagonalize_full_hamiltonian(nbands=20) a2.calc.diagonalize_full_hamiltonian(nbands=40) a1.calc.write('gs_Na_small.gpw', 'all') a2.calc.write('gs_Na_large.gpw', 'all') # Calculate the dielectric functions df1 = DielectricFunction('gs_Na_small.gpw', omegamax=15, domega0=0.05, hilbert=True, ecut=150) df1NLFCx, df1LFCx = df1.get_dielectric_function(direction='x') df1NLFCy, df1LFCy = df1.get_dielectric_function(direction='y') df1NLFCz, df1LFCz = df1.get_dielectric_function(direction='z') df2 = DielectricFunction('gs_Na_large.gpw', omegamax=15, domega0=0.05, hilbert=True, ecut=150) df2NLFCx, df2LFCx = df2.get_dielectric_function(direction='x') df2NLFCy, df2LFCy = df2.get_dielectric_function(direction='y')
from gpaw.response.df import DielectricFunction as DF df = DF('LiF_fulldiag.gpw', domega0=0.01, # grid-spacing at 0 eV omega2=10.0, # frequency where grid-spacing has doubled to 0.02 eV eta=0.1, # broadening parameter nbands=60, # number of bands to consider for building chi ecut=30, # energy cutoff for planewaves txt='LiF_RPA_out2.txt') # Calculate the dielectric function without and with local field effects: df.get_dielectric_function()
calc = GPAW(mode=PW(200), kpts=(4,4,4), parallel={'band':1}, idiotproof=False, # allow uneven distribution of k-points xc='LDA') atoms.set_calculator(calc) atoms.get_potential_energy() calc.write('Al', 'all') t2 = time.time() # Excited state calculation q = np.array([1/4.,0.,0.]) w = np.linspace(0, 24, 241) df = DielectricFunction(calc='Al', frequencies=w, eta=0.2, ecut=50, hilbert=False) df.get_eels_spectrum(xc='RPA', filename='EELS_Al', q_c=q) #df.check_sum_rule() #df.write('Al.pckl') t3 = time.time() print('') print('For ground state calc, it took', (t2 - t1) / 60, 'minutes') print('For excited state calc, it took', (t3 - t2) / 60, 'minutes') world.barrier() d = np.loadtxt('EELS_Al',delimiter=',') # New results are compared with test values wpeak1,Ipeak1 = findpeak(d[:,0],d[:,1])
cell=(a, a, a), pbc=True) a1.calc = GPAW(gpts=(10, 10, 10), mode=PW(300), kpts={'size': (10, 10, 10), 'gamma': True}, parallel={'band': 1}, txt='small.txt') a1.get_potential_energy() a1.calc.diagonalize_full_hamiltonian(nbands=20) a1.calc.write('gs_Na.gpw', 'all') # Calculate the dielectric functions df1 = DielectricFunction('gs_Na.gpw', nblocks=1, ecut=400, txt='1block.txt') df1NLFCx, df1LFCx = df1.get_dielectric_function(direction='x') df1NLFCy, df1LFCy = df1.get_dielectric_function(direction='y') df1NLFCz, df1LFCz = df1.get_dielectric_function(direction='z') df2 = DielectricFunction('gs_Na.gpw', nblocks=2, ecut=400, txt='2block.txt') df2NLFCx, df2LFCx = df2.get_dielectric_function(direction='x') df2NLFCy, df2LFCy = df2.get_dielectric_function(direction='y') df2NLFCz, df2LFCz = df2.get_dielectric_function(direction='z')
atoms.set_calculator(calc) atoms.get_potential_energy() # get ground state density # Restart Calculation with fixed density and dense kpoint sampling calc.set( kpts={ 'density': 15.0, 'gamma': False }, # dense kpoint sampling fixdensity=True) atoms.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=70) # diagonalize Hamiltonian calc.write('si_large.gpw', 'all') # write wavefunctions # Getting absorption spectrum df = DielectricFunction(calc='si_large.gpw', eta=0.05, domega0=0.02, ecut=150) df.get_dielectric_function(filename='si_abs.csv') # Getting macroscopic constant df = DielectricFunction( calc='si_large.gpw', frequencies=[0.0], hilbert=False, eta=0.0001, ecut=150, ) epsNLF, epsLF = df.get_macroscopic_dielectric_constant() # Make table epsrefNLF = 14.08 # from [1] in top
from gpaw import GPAW from gpaw.response.df import DielectricFunction calc = GPAW('Ag_GLLBSC.gpw', parallel={'domain': 1}) calc.diagonalize_full_hamiltonian(nbands=30) calc.write('Ag_GLLBSC_full.gpw', 'all') # Set up dielectric function: df = DielectricFunction( calc='Ag_GLLBSC_full.gpw', # Ground state input domega0=0.05) # energy grid spacing at omega=0 # Momentum transfer, must be the difference between two kpoints! q_c = [1.0 / 10, 0, 0] df.get_eels_spectrum(q_c=q_c) # a file called 'eels.csv' is generated # Plot spectrum import numpy as np import matplotlib.pyplot as plt data = np.loadtxt('eels.csv', delimiter=',') omega = data[:, 0] eels = data[:, 2] plt.plot(omega, eels) plt.xlabel('Energy (eV)') plt.ylabel('Loss spectrum') plt.xlim(0, 20) plt.show()
calc = GPAW(mode=PW(200), kpts=(4,4,4), parallel={'band':1}, idiotproof=False, # allow uneven distribution of k-points xc='LDA') atoms.set_calculator(calc) atoms.get_potential_energy() calc.write('Al', 'all') t2 = time.time() # Excited state calculation q = np.array([1/4.,0.,0.]) w = np.linspace(0, 24, 241) df = DielectricFunction(calc='Al', frequencies=w, eta=0.2, ecut=50, hilbert=False) df.get_eels_spectrum(xc='ALDA', filename='EELS_Al_ALDA',q_c=q) #df.check_sum_rule() #df.write('Al.pckl') t3 = time.time() print 'For ground state calc, it took', (t2 - t1) / 60, 'minutes' print 'For excited state calc, it took', (t3 - t2) / 60, 'minutes' world.barrier() d = np.loadtxt('EELS_Al_ALDA',delimiter=',') # New results are compared with test values wpeak1,Ipeak1 = findpeak(d[:,0],d[:,1]) wpeak2,Ipeak2 = findpeak(d[:,0],d[:,2])
from gpaw import GPAW from gpaw.response.df import DielectricFunction calc = GPAW("Ag_GLLBSC.gpw") calc.diagonalize_full_hamiltonian(nbands=30) calc.write("Ag_GLLBSC_full.gpw", "all") # Set up dielectric function: df = DielectricFunction(calc="Ag_GLLBSC_full.gpw", domega0=0.05) # Ground state input # energy grid spacing at omega=0 # Momentum transfer, must be the difference between two kpoints! q_c = [1.0 / 10, 0, 0] df.get_eels_spectrum(q_c=q_c) # a file called 'eels.csv' is generated # Plot spectrum import numpy as np import matplotlib.pyplot as plt data = np.loadtxt("eels.csv", delimiter=",") omega = data[:, 0] eels = data[:, 2] plt.plot(omega, eels) plt.xlabel("Energy (eV)") plt.ylabel("Loss spectrum") plt.xlim(0, 20) plt.show()
from pathlib import Path from gpaw.mpi import world from gpaw.response.df import DielectricFunction from gpaw.response.qeh import BuildingBlock df = DielectricFunction(calc='MoS2_gs_fulldiag.gpw', eta=0.001, domega0=0.05, omega2=10.0, nblocks=8, ecut=150, truncation='2D') buildingblock = BuildingBlock('MoS2', df, qmax=3.0) buildingblock.calculate_building_block() if world.rank == 0: Path('MoS2_gs_fulldiag.gpw').unlink()
from __future__ import print_function from gpaw.response.df import DielectricFunction df = DielectricFunction('gs_MoS2.gpw', ecut=100, frequencies=(0., ), nbands=50, intraband=False, hilbert=False, eta=0.1) alpha = df.get_polarizability(pbc=[True, True, False], filename=None)[1][0].real print('alpha = ', alpha, 'AA')
calc = GPAW(mode='pw', dtype=complex, xc='RPBE', nbands=16, eigensolver='rmm-diis', occupations=FermiDirac(0.01)) cluster.set_calculator(calc) cluster.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=24, scalapack=True) calc.write('Au2.gpw', 'all') if ABS: df = DielectricFunction('Au2.gpw', frequencies=np.linspace(0, 14, 141), hilbert=not True, eta=0.1, ecut=10) b0, b = df.get_dielectric_function(filename=None, direction='z') a0, a = df.get_polarizability(filename=None, direction='z') df_ws = DielectricFunction('Au2.gpw', frequencies=np.linspace(0, 14, 141), hilbert=not True, eta=0.1, ecut=10, truncation='wigner-seitz') a0_ws, a_ws = df_ws.get_polarizability(filename=None,
calc = GPAW(mode='pw', dtype=complex, xc='RPBE', nbands=16, eigensolver='rmm-diis', occupations=FermiDirac(0.01)) cluster.set_calculator(calc) cluster.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=24, scalapack=True) calc.write('Au2.gpw', 'all') if ABS: df = DielectricFunction('Au2.gpw', frequencies=np.linspace(0, 14, 141), hilbert=not True, eta=0.1, ecut=10) b0, b = df.get_dielectric_function(filename=None, direction='z') a0, a = df.get_polarizability(filename=None, direction='z') a0_ws, a_ws = df.get_polarizability(filename=None, wigner_seitz_truncation=True, direction='z') w0_ = 5.60491055 I0_ = 244.693028 w_ = 5.696528390 I_ = 207.8
import numpy as np from ase.lattice import bulk from gpaw import GPAW from gpaw.response.df import DielectricFunction # Part 1: Ground state calculation atoms = bulk('Si', 'diamond', a=5.431) # Generate diamond crystal structure for silicon calc = GPAW(mode='pw', kpts=(4,4,4)) # GPAW calculator initialization atoms.set_calculator(calc) atoms.get_potential_energy() # Ground state calculation is performed calc.write('si.gpw', 'all') # Use 'all' option to write wavefunction # Part 2 : Spectrum calculation # DF: dielectric function object df = DielectricFunction(calc='si.gpw', # Ground state gpw file (with wavefunction) as input domega0=0.05) # Using nonlinear frequency grid df.get_dielectric_function() # By default, a file called 'df.csv' is generated
import numpy as np from ase.build import bulk from gpaw import GPAW from gpaw.response.df import DielectricFunction # Part 1: Ground state calculation atoms = bulk('Si', 'diamond', a=5.431) # Generate diamond crystal structure for silicon calc = GPAW(mode='pw', kpts=(4, 4, 4)) # GPAW calculator initialization atoms.set_calculator(calc) atoms.get_potential_energy() # Ground state calculation is performed calc.write('si.gpw', 'all') # Use 'all' option to write wavefunction # Part 2 : Spectrum calculation # DF: dielectric function object df = DielectricFunction( calc='si.gpw', # Ground state gpw file (with wavefunction) as input domega0=0.05) # Using nonlinear frequency grid df.get_dielectric_function() # By default, a file called 'df.csv' is generated