def permittivity(base_dir="./", mode="df"): curr_dir = os.path.dirname(os.path.abspath(__file__)) es_gpw = os.path.join(base_dir, "es.gpw") param_file = os.path.join(curr_dir, "../parameters.json") if os.path.exists(param_file): params = json.load(open(param_file, "r")) else: raise FileNotFoundError("no parameter file!") if not os.path.exists(es_gpw): raise FileNotFoundError("Excited state not calculated!") if mode not in ("df", "tetra"): raise ValueError("Mode should be df or tetra") data_file = os.path.join(base_dir, "polarizability_{}.npz".format(mode)) if os.path.exists(data_file): parprint("Polarizability file exists!") return 0 df = DielectricFunction(calc=es_gpw, **params[mode]) eps0x, epsx = df.get_dielectric_function( q_c=[0, 0, 0], direction="x", #pbc=[True, True, False], filename=None) eps0y, epsy = df.get_dielectric_function( q_c=[0, 0, 0], direction="y", #pbc=[True, True, False], filename=None) eps0z, epsz = df.get_dielectric_function( q_c=[0, 0, 0], direction="z", #pbc=[True, True, False], filename=None) freq = df.get_frequencies() data = dict( frequencies=freq, eps_x=epsx, eps_y=epsy, eps_z=epsz, eps_x0=eps0x, eps_y0=eps0y, eps_z0=eps0z, ) from ase.parallel import world import numpy if world.rank == 0: numpy.savez_compressed(data_file, **data)
def dielectric(self, method="rpa"): method = method.lower() if method not in ("rpa", "gw"): raise ValueError("Dielectric Method not known!") if not os.path.exists(self.__es_file): raise FileNotFoundError("Ground state not calculated!") self.__eps_file = self.__eps_file_template.format(method) if os.path.exists(self.__eps_file): parprint(("Dielectricfunction using" " method {} already calculated!").format(method)) return True if os.path.exists(self.__es_file): parprint("Excited state done, will use directly!") if method == "rpa": df = DielectricFunction(calc=self.__es_file, **self.params[method]) epsx0, epsx = df.get_dielectric_function(direction="x", filename=None) epsy0, epsy = df.get_dielectric_function(direction="y", filename=None) epsz0, epsz = df.get_dielectric_function(direction="z", filename=None) freq = df.get_frequencies() data = dict(frequencies=freq, eps_x=epsx, eps_x0=epsx0, eps_y=epsy, eps_y0=epsy0, eps_z=epsz, eps_z0=epsz) # write result if rank == 0: numpy.savez(self.__eps_file, **data) parprint("Dielectric function using {} calculated!".format(method)) return True else: raise NotImplementedError("{} not implemented".format(method))
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
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, force_complex_dtype=True), kpts={'size': (1, 1, NK), 'gamma': True}, parallel={'band': 1}, 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
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
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') print('For excited state calc, it took', (t3 - t2) / 60, 'minutes')
df = DielectricFunction('C.gpw', frequencies=(0., ), eta=0.001, ecut=50, hilbert=False) eM1, eM2 = df.get_macroscopic_dielectric_constant() equal(eM1, eM1_, 0.01) equal(eM2, eM2_, 0.01) # Absorption spectrum calculation RPA df = DielectricFunction('C.gpw', eta=0.25, ecut=50, frequencies=np.linspace(0, 24., 241), hilbert=False) a0, a = df.get_dielectric_function(filename=None) df.check_sum_rule(a.imag) equal(a0[0].real, eM1_, 0.01) equal(a[0].real, eM2_, 0.01) w, I = findpeak(np.linspace(0, 24., 241), a0.imag) equal(w, w0_, 0.01) equal(I / (4 * np.pi), I0_, 0.05) w, I = findpeak(np.linspace(0, 24., 241), a.imag) equal(w, w_, 0.01) equal(I / (4 * np.pi), I_, 0.05) a0, a = df.get_polarizability(filename=None) w, I = findpeak(np.linspace(0, 24., 241), a0.imag) equal(w, w0_, 0.01)
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 epsrefLF = 12.66 # From [1] in top
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, direction='z') w0_ = 5.60491055 I0_ = 244.693028 w_ = 5.696528390
# 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') df2NLFCz, df2LFCz = df2.get_dielectric_function(direction='z') # Compare plasmon frequencies and intensities w_w = df1.chi0.omega_w
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
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()
ecut = 50 eshift = 0.8 eta = 0.2 df = DielectricFunction('gs_Si.gpw', ecut=ecut, frequencies=np.linspace(0., 10., 1001), nbands=8, intraband=False, hilbert=False, eta=eta, eshift=eshift, txt='rpa_Si.txt') df.get_dielectric_function(filename='eps_rpa_Si.csv') bse = BSE('gs_Si.gpw', ecut=ecut, valence_bands=range(0, 4), conduction_bands=range(4, 8), nbands=50, eshift=eshift, mode='BSE', integrate_gamma=0, txt='bse_Si.txt') bse.get_dielectric_function(filename='eps_bse_Si.csv', eta=eta, write_eig='bse_Si_eig.dat', w_w=np.linspace(0.0, 10.0, 10001))
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()
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 epsrefLF = 12.66 # From [1] in top
kpts=kpts, parallel={'band': 1}, nbands=60, convergence={'bands': 50}) responseGS.get_potential_energy() responseGS.write('TaS2-gsresponse.gpw', 'all') # 3) Dielectric function df = DielectricFunction('TaS2-gsresponse.gpw', eta=25e-3, domega0=0.01, integrationmode='tetrahedron integration') df1tetra_w, df2tetra_w = df.get_dielectric_function(direction='x') df = DielectricFunction('TaS2-gsresponse.gpw', eta=25e-3, domega0=0.01) df1_w, df2_w = df.get_dielectric_function(direction='x') omega_w = df.get_frequencies() if world.rank == 0: plt.figure(figsize=(6, 6)) plt.plot(omega_w, df2tetra_w.real, label='tetra Re') plt.plot(omega_w, df2tetra_w.imag, label='tetra Im') plt.plot(omega_w, df2_w.real, label='Re') plt.plot(omega_w, df2_w.imag, label='Im') plt.xlabel('Frequency (eV)') plt.ylabel('$\\varepsilon$') plt.xlim(0, 10) plt.ylim(-20, 20)
pbc=pbc) responseGS = GPAW('gs.gpw', fixdensity=True, kpts=kpts, parallel={'band': 1}, nbands=30, occupations=FermiDirac(0.001), convergence={'bands': 20}) responseGS.get_potential_energy() responseGS.write('gsresponse.gpw', 'all') df = DielectricFunction('gsresponse.gpw', eta=25e-3, pbc=pbc, domega0=0.01, integrationmode='tetrahedron integration') df1tetra, df2tetra = df.get_dielectric_function(q_c=[0, 0, 0]) df = DielectricFunction('gsresponse.gpw', domega0=0.01, eta=25e-3) df1, df2 = df.get_dielectric_function(q_c=[0, 0, 0]) omega_w = df.get_frequencies() if world.rank == 0: plt.figure(figsize=(6, 6)) plt.plot(omega_w, df2.imag * 2, label='Point sampling') plt.plot(omega_w, df2tetra.imag * 2, label='Tetrahedron') # Analytical result for graphene sigmainter = 1 / 4. # The surface conductivity of graphene with seterr(divide='ignore', invalid='ignore'): dfanalytic = 1 + (4 * np.pi * 1j / (omega_w / Hartree) *
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, direction='z') w0_ = 5.60491055 I0_ = 244.693028 w_ = 5.696528390 I_ = 207.8
# 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) equal(b[0].real, eM2_, 0.01) a0, a = df.get_polarizability(filename=None) df_ws = DielectricFunction('C.gpw', eta=0.25, ecut=200, frequencies=np.linspace(0, 24., 241), hilbert=False, truncation='wigner-seitz') a0_ws, a_ws = df_ws.get_polarizability(filename=None) w0_ = 10.778232265664668 I0_ = 5.5467658790816268
mode=PW(600), occupations=FermiDirac(0.2), **GSkwargs) atoms.set_calculator(calc) atoms.get_potential_energy() calc.write('gr.gpw', 'all') dfs = [] for kwargs in DFsettings: DF = DielectricFunction(calc='gr.gpw', domega0=0.2, eta=0.2, ecut=40.0, **kwargs) df1, df2 = DF.get_dielectric_function() if world.rank == 0: dfs.append(df1) # Check the calculated dielectric functions against # each other. while len(dfs): df = dfs.pop() for DFkwargs, df2 in zip(DFsettings[-len(dfs):], dfs): try: assert np.allclose(df, df2) print('Ground state settings:', GSkwargs) print('DFkwargs1:', DFsettings[-len(dfs) - 1]) print('DFkwargs2:', DFkwargs) print(np.max(np.abs((df - df2) / df))) except AssertionError: