import numpy as np from gpaw import GPAW from gpaw.response.df import DF w = np.linspace(0, 24., 481) # 0-24 eV with 0.05 eV spacing q = np.array([0.0, 0.00001, 0.]) df = DF(calc='si.gpw', q=q, w=w, eta=0.1, # Broadening parameter ecut=150, # Energy cutoff for planewaves optical_limit=True, txt='df_2.out') # Output text df1, df2 = df.get_dielectric_function() df.get_absorption_spectrum(df1, df2, filename='si_abs.dat') df.check_sum_rule(df1, df2) df.write('df_2.pckl') # Save important parameters and data
if ABS: w = np.linspace(0, 24, 481) q = np.array([0.0, 0.00001, 0.]) # getting macroscopic constant df = DF(calc='si.gpw', q=q, w=(0.,), eta=0.0001, hilbert_trans=False, txt='df_1.out', ecut=150, optical_limit=True) df1, df2 = df.get_dielectric_function() eM1, eM2 = df.get_macroscopic_dielectric_constant(df1, df2) df.write('df_1.pckl') if np.abs(eM1 - 13.992277) > 1e-4 or np.abs(eM2 - 12.589596) > 1e-4: print eM1, eM2 raise ValueError('Pls check dielectric constant !') #getting absorption spectrum df = DF(calc='si.gpw', q=q, w=w, eta=0.1, ecut=150, optical_limit=True, txt='df_2.out') df1, df2 = df.get_dielectric_function() df.get_absorption_spectrum(df1, df2, filename='si_abs') df.check_sum_rule(df1, df2) df.write('df_2.pckl')
bse = BSE('Al.gpw',w=np.linspace(0,24,241), q=np.array([0.25, 0, 0]),ecut=50., eta=0.2) bse.get_dielectric_function('Al_bse.dat') if df: # Excited state calculation q = np.array([1/4.,0.,0.]) w = np.linspace(0, 24, 241) df = DF(calc='Al.gpw', q=q, w=w, eta=0.2, ecut=50,hilbert_trans=False) df1, df2 = df.get_dielectric_function() df.get_EELS_spectrum(df1, df2,filename='Al_df.dat') df.write('Al.pckl') df.check_sum_rule() if check_spectrum: d = np.loadtxt('Al_bse.dat')[:,2] wpeak = 16.4 Nw = 164 if d[Nw] > d[Nw-1] and d[Nw] > d[Nw+1]: pass else: raise ValueError('Plasmon peak not correct ! ') if np.abs(d[Nw] - 27.5317730322) > 1e-5: print d[Nw]
q = np.array([0.0, 0.00001, 0.]) # getting macroscopic constant df = DF(calc='si.gpw', q=q, w=(0., ), eta=0.0001, hilbert_trans=False, txt='df_1.out', ecut=150, optical_limit=True) df1, df2 = df.get_dielectric_function() eM1, eM2 = df.get_macroscopic_dielectric_constant(df1, df2) df.write('df_1.pckl') if np.abs(eM1 - 13.992277) > 1e-4 or np.abs(eM2 - 12.589596) > 1e-4: print eM1, eM2 raise ValueError('Pls check dielectric constant !') #getting absorption spectrum df = DF(calc='si.gpw', q=q, w=w, eta=0.1, ecut=150, optical_limit=True, txt='df_2.out') df1, df2 = df.get_dielectric_function()
q=np.array([0.25, 0, 0]), ecut=50., eta=0.2) bse.get_dielectric_function('Al_bse.dat') if df: # Excited state calculation q = np.array([1 / 4., 0., 0.]) w = np.linspace(0, 24, 241) df = DF(calc='Al.gpw', q=q, w=w, eta=0.2, ecut=50, hilbert_trans=False) df1, df2 = df.get_dielectric_function() df.get_EELS_spectrum(df1, df2, filename='Al_df.dat') df.write('Al.pckl') df.check_sum_rule() if check_spectrum: d = np.loadtxt('Al_bse.dat')[:, 2] wpeak = 16.4 Nw = 164 if d[Nw] > d[Nw - 1] and d[Nw] > d[Nw + 1]: pass else: raise ValueError('Plasmon peak not correct ! ') if np.abs(d[Nw] - 27.5317730322) > 1e-5: print d[Nw] raise ValueError('Please check spectrum strength ! ')
a = 6.75 * Bohr atoms = bulk("C", "diamond", a=a) calc = GPAW(h=0.2, eigensolver=RMM_DIIS(), mixer=Mixer(0.1, 3), kpts=(4, 4, 4), occupations=FermiDirac(0.001)) atoms.set_calculator(calc) atoms.get_potential_energy() calc.write("C.gpw", "all") # Macroscopic dielectric constant calculation q = np.array([0.0, 0.00001, 0.0]) w = np.linspace(0, 24.0, 241) df = DF(calc="C.gpw", q=q, w=(0.0,), eta=0.001, ecut=50, hilbert_trans=False, optical_limit=True) eM1, eM2 = df.get_macroscopic_dielectric_constant() eM1_ = 6.15176021 # 6.15185095143 for dont use time reversal symmetry eM2_ = 6.04805705 # 6.04815084635 if np.abs(eM1 - eM1_) > 1e-5 or np.abs(eM2 - eM2_) > 1e-5: print eM1, eM2 raise ValueError("Macroscopic dielectric constant not correct ! ") # Absorption spectrum calculation del df df = DF(calc="C.gpw", q=q, w=w, eta=0.25, ecut=50, optical_limit=True, txt="C_df.out") df.get_absorption_spectrum() df.check_sum_rule() df.write("C_df.pckl")
atoms.set_calculator(calc) atoms.get_potential_energy() calc.write('C.gpw','all') # Macroscopic dielectric constant calculation q = np.array([0.0, 0.00001, 0.]) w = np.linspace(0, 24., 241) df = DF(calc='C.gpw', q=q, w=(0.,), eta=0.001, ecut=50, hilbert_trans=False, optical_limit=True) df1, df2 = df.get_dielectric_function() eM1, eM2 = df.get_macroscopic_dielectric_constant(df1, df2) eM1_ = 6.15185095143 eM2_ = 6.04815084635 if (np.abs(eM1 - eM1_) > 1e-5 or np.abs(eM2 - eM2_) > 1e-5): print eM1, eM2 raise ValueError('Macroscopic dielectric constant not correct ! ') # Absorption spectrum calculation df = DF(calc='C.gpw', q=q, w=w, eta=0.25, ecut=50, optical_limit=True, txt='C_df.out') df1, df2 = df.get_dielectric_function() df.get_absorption_spectrum(df1, df2) df.check_sum_rule(df1, df2) df.write('C_df.pckl')
eigensolver="cg", occupations=FermiDirac(0.001), convergence={"bands": 70}, ) atoms.set_calculator(calc) atoms.get_potential_energy() calc.write("si.gpw", "all") if ABS: w = np.linspace(0, 24, 481) q = np.array([0.0, 0.00001, 0.0]) # getting macroscopic constant df = DF(calc="si.gpw", q=q, w=w, eta=0.0001, hilbert_trans=False, txt="df_1.out", ecut=150, optical_limit=True) df1, df2 = df.get_dielectric_function() eM1, eM2 = df.get_macroscopic_dielectric_constant(df1, df2) df.write("df_1.pckl") # getting absorption spectrum df = DF(calc="si.gpw", q=q, w=w, eta=0.1, ecut=150, optical_limit=True, txt="df_2.out") df1, df2 = df.get_dielectric_function() df.get_absorption_spectrum(df1, df2, filename="si_abs.dat") df.check_sum_rule(df1, df2) df.write("df_2.pckl")
width=0.1, ) atoms.set_calculator(calc) atoms.get_potential_energy() if EELS: for i in range(1, 2): w = np.linspace(0, 15, 301) q = np.array([-i / 64.0, i / 64.0, 0.0]) # Gamma - K ecut = 40 + i * 10 df = DF(calc=calc, q=q, w=w, eta=0.05, ecut=ecut, txt="df_" + str(i) + ".out") df.get_surface_response_function(z0=21.2 / 2, filename="be_EELS") df.get_EELS_spectrum() df.check_sum_rule() df.write("df_" + str(i) + ".pckl") if check: d = np.loadtxt("be_EELS") wpeak1 = 2.50 # eV wpeak2 = 9.95 Nw1 = 50 Nw2 = 199 if ( d[Nw1, 1] > d[Nw1 - 1, 1] and d[Nw1, 1] > d[Nw1 + 1, 1] and d[Nw2, 1] > d[Nw2 - 1, 1] and d[Nw2, 1] > d[Nw2 + 1, 1] ):
width=0.1) atoms.set_calculator(calc) atoms.get_potential_energy() if EELS: for i in range(1, 2): w = np.linspace(0, 15, 301) q = np.array([-i/64., i/64., 0.]) # Gamma - K ecut = 40 + i*10 df = DF(calc=calc, q=q, w=w, eta=0.05, ecut = ecut, txt='df_' + str(i) + '.out') df.get_surface_response_function(z0=21.2/2, filename='be_EELS') df.get_EELS_spectrum() df.check_sum_rule() df.write('df_' + str(i) + '.pckl') if check: d = np.loadtxt('be_EELS') wpeak1 = 2.50 # eV wpeak2 = 9.95 Nw1 = 50 Nw2 = 199 if (d[Nw1, 1] > d[Nw1-1, 1] and d[Nw1, 1] > d[Nw1+1, 1] and d[Nw2, 1] > d[Nw2-1, 1] and d[Nw2, 1] > d[Nw2+1, 1]): pass else: raise ValueError('Plasmon peak not correct ! ')
df = DF(calc='C.gpw', q=q, w=(0., ), eta=0.001, ecut=50, hilbert_trans=False, optical_limit=True) df1, df2 = df.get_dielectric_function() eM1, eM2 = df.get_macroscopic_dielectric_constant(df1, df2) eM1_ = 6.15185095143 eM2_ = 6.04815084635 if (np.abs(eM1 - eM1_) > 1e-5 or np.abs(eM2 - eM2_) > 1e-5): print eM1, eM2 raise ValueError('Macroscopic dielectric constant not correct ! ') # Absorption spectrum calculation df = DF(calc='C.gpw', q=q, w=w, eta=0.25, ecut=50, optical_limit=True, txt='C_df.out') df1, df2 = df.get_dielectric_function() df.get_absorption_spectrum(df1, df2) df.check_sum_rule(df1, df2) df.write('C_df.pckl')