convergence={'bands':60}, # It's better NOT to converge all bands. eigensolver='cg', # It's preferable to use 'cg' to calculate unoccupied states. occupations=FermiDirac(0.05), txt='out_gs.txt') atoms.set_calculator(calc) atoms.get_potential_energy() calc.write('graphite.gpw','all') # Part 2: Spectra calculations f = paropen('graphite_q_list', 'w') # Write down q. for i in range(1,8): # Loop over different q. df = DF(calc='graphite.gpw', nbands=60, # Use only bands that are converged in the gs calculation. q=np.array([i/20., 0., 0.]), # Gamma - M excitation #q=np.array([i/20., -i/20., 0.]) # Gamma - K excitation w=np.linspace(0, 40, 401), # Spectra from 0-40 eV with 0.1 eV spacing. eta=0.2, # Broadening parameter. ecut=40+(i-1)*10, # In general, larger q requires larger planewave cutoff energy. # txt='out_df_%d.txt' %(i)) # Write differnt output for different q. df1, df2 = df.get_dielectric_function() df.get_EELS_spectrum(df1, df2, filename='graphite_EELS_%d' %(i)) # Use different filenames for different q df.check_sum_rule(df1, df2) # Check f-sum rule. print >> f, sqrt(np.inner(df.qq_v / Bohr, df.qq_v / Bohr))
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 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')
eigensolver= 'cg', # It's preferable to use 'cg' to calculate unoccupied states. occupations=FermiDirac(0.05), txt='out_gs.txt') atoms.set_calculator(calc) atoms.get_potential_energy() calc.write('graphite.gpw', 'all') # Part 2: Spectra calculations f = paropen('graphite_q_list', 'w') # Write down q. for i in range(1, 8): # Loop over different q. df = DF( calc='graphite.gpw', nbands=60, # Use only bands that are converged in the gs calculation. q=np.array([i / 20., 0., 0.]), # Gamma - M excitation #q=np.array([i/20., -i/20., 0.]) # Gamma - K excitation w=np.linspace(0, 40, 401), # Spectra from 0-40 eV with 0.1 eV spacing. eta=0.2, # Broadening parameter. ecut=40 + (i - 1) * 10, # In general, larger q requires larger planewave cutoff energy. # txt='out_df_%d.txt' % (i)) # Write differnt output for different q. df1, df2 = df.get_dielectric_function() df.get_EELS_spectrum(df1, df2, filename='graphite_EELS_%d' % (i)) # Use different filenames for different q df.check_sum_rule(df1, df2) # Check f-sum rule. print >> f, sqrt(np.inner(df.qq_v / Bohr, df.qq_v / Bohr))
idiotproof=False, # allow uneven distribution of k-points xc='LDA') atoms.set_calculator(calc) atoms.get_potential_energy() #calc.write('Al.gpw','all') t2 = time.time() # Excited state calculation q = np.array([1 / 4., 0., 0.]) w = np.linspace(0, 24, 241) df = DF(calc=calc, q=q, w=w, eta=0.2, ecut=50) df1, df2 = df.get_dielectric_function() df.get_EELS_spectrum(df1, df2, filename='EELS_Al') df.check_sum_rule() 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' d = np.loadtxt('EELS_Al') wpeak = 15.7 # eV Nw = 157 if d[Nw, 1] > d[Nw - 1, 1] and d[Nw, 2] > d[Nw + 1, 2]: pass else: raise ValueError('Plasmon peak not correct ! ') if (np.abs(d[Nw, 1] - 28.8932274034) > 1e-5
nbands=70, # The result should also be converged with respect to bands. convergence={'bands':60}, # It's better NOT to converge all bands. eigensolver='cg', # It's preferable to use 'cg' to calculate unoccupied states. occupations=FermiDirac(0.05), txt='out_gs.txt') atoms.set_calculator(calc) atoms.get_potential_energy() calc.write('graphite.gpw','all') # Part 2: Spectra calculations f = paropen('graphite_q_list', 'w') # Write down q. for i in range(1,8): # Loop over different q. df = DF(calc='graphite.gpw', nbands=60, # Use only bands that are converged in the gs calculation. q=np.array([i/20., 0., 0.]), # Gamma - M excitation #q=np.array([i/20., -i/20., 0.]) # Gamma - K excitation w=np.linspace(0, 40, 401), # Spectra from 0-40 eV with 0.1 eV spacing. eta=0.2, # Broadening parameter. ecut=40+(i-1)*10, # In general, larger q requires larger planewave cutoff energy. # txt='out_df_%d.txt' %(i)) # Write differnt output for different q. df.get_EELS_spectrum(filename='graphite_EELS_%d' %(i)) # Use different filenames for different q df.check_sum_rule() # Check f-sum rule. print >> f, sqrt(np.inner(df.qq_v / Bohr, df.qq_v / Bohr))