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') if rank == 0 : os.remove('si.gpw')
import numpy as np from ase.lattice import bulk from gpaw import GPAW from gpaw.response.df import DF # Part 1: Ground state calculation atoms = bulk('Si', 'diamond', a=5.431) # Generate diamond crystal structure for silicon calc = GPAW(h=0.20, 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 = DF(calc='si.gpw', # Ground state gpw file (with wavefunction) as input q=np.array([0.0, 0.00001, 0.0]), # Momentum transfer, here excites in y-direction w=np.linspace(0,14,141), # The Energies (eV) for spectrum: from 0-14 eV with 0.1 eV spacing optical_limit=True) # Indicates that its a optical spectrum calculation df.get_absorption_spectrum() # By default, a file called 'Absorption.dat' is generated
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
hilbert_trans=False, ecut=150, optical_limit=True, txt='df_1.out') eM1, eM2 = df.get_macroscopic_dielectric_constant() df.write('df_1.pckl') if np.abs(eM1 - 13.991793) > 1e-3 or np.abs(eM2 - 12.589129) > 1e-3: print eM1, eM2 raise ValueError('Please 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') df.get_absorption_spectrum(filename='si_abs') df.check_sum_rule() df.write('df_2.pckl') if rank == 0 : os.remove('si.gpw')
cluster.set_calculator(calc) cluster.get_potential_energy() calc.write('Au02.gpw','all') if ABS: df = DF(calc='Au02.gpw', q=np.array([0.0, 0.0, 0.00001]), w=np.linspace(0,14,141), eta=0.1, ecut=10, optical_limit=True, kcommsize=4) df.get_absorption_spectrum() d = np.loadtxt('Absorption.dat') wpeak = 2.5 # eV Nw = 25 if d[Nw, 4] > d[Nw-1, 4] and d[Nw, 4] > d[Nw+1, 4]: pass else: raise ValueError('Plasmon peak not correct ! ') if np.abs(d[Nw, 4] - 0.25788817927) > 5e-5: print d[Nw, 0], d[Nw, 4] raise ValueError('Please check spectrum strength ! ')
atoms.get_potential_energy() calc.write('C_kpt8.gpw','all') if bse: bse = BSE('C_kpt8.gpw',w=np.linspace(0,20,201), q=np.array([0,0,0.5]),optical_limit=True,ecut=50., nbands=8) bse.get_dielectric_function('C_bse.dat') if df: from gpaw.response.df import DF df = DF('C_kpt8.gpw',w=np.linspace(0,20,201),q=np.array([0,0,0.5]), optical_limit=True,ecut=50., hilbert_trans=False) df.get_absorption_spectrum(filename='C.dat') if check_spectrum: d = np.loadtxt('C_bse.dat')[:,2] Nw1 = 97 Nw2 = 109 if d[Nw1] > d[Nw1-1] and d[Nw1] > d[Nw1+1] and \ d[Nw2] > d[Nw2-1] and d[Nw2] > d[Nw2+1] : pass else: raise ValueError('Absorption peak not correct ! ') if np.abs(d[Nw1] - 68.8295454438) > 1e-5 or \ np.abs(d[Nw2] - 90.2424318491) > 1e-5 :
import numpy as np from ase.structure import bulk from gpaw import GPAW from gpaw.response.df import DF # Part 1: Ground state calculation atoms = bulk('Si', 'diamond', a=5.431) # Generate diamond crystal structure for silicon calc = GPAW(h=0.20, 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 = DF(calc='si.gpw', # Ground state gpw file (with wavefunction) as input q=np.array([0.0, 0.00001, 0.0]), # Momentum transfer, here excites in y-direction w=np.linspace(0,14,141), # The Energies (eV) for spectrum: from 0-14 eV with 0.1 eV spacing optical_limit=True) # Indicates that its a optical spectrum calculation df.get_absorption_spectrum() # By default, a file called 'Absorption.dat' is generated
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")
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')