def polarizability(base_dir="./", mode="df", fermi_shift=None): 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") if fermi_shift is None: data_file = os.path.join(base_dir, "polarizability_{}.npz".format(mode)) else: data_file = os.path.join(base_dir, "polarizability_{}_{:.2f}.npz".format(mode, fermi_shift)) params[mode]["intraband"] = True if os.path.exists(data_file): parprint("Polarizability file exists!") return 0 df = DielectricFunction(calc=es_gpw, **params[mode], gate_voltage=fermi_shift) # add energy shift alpha0x, alphax = df.get_polarizability(q_c=[0, 0, 0], direction="x", pbc=[True, True, False], filename=None) alpha0y, alphay = df.get_polarizability(q_c=[0, 0, 0], direction="y", pbc=[True, True, False], filename=None) alpha0z, alphaz = df.get_polarizability(q_c=[0, 0, 0], direction="z", pbc=[True, True, False], filename=None) freq = df.get_frequencies() data = dict(frequencies=freq, alpha_x=alphax, alpha_y=alphay, alpha_z=alphaz, alpha_x0=alpha0x, alpha_y0=alpha0y, alpha_z0=alpha0z,) from ase.parallel import world import numpy if world.rank == 0: numpy.savez_compressed(data_file, **data)
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) equal(I, I0_, 0.01) w, I = findpeak(np.linspace(0, 24., 241), a.imag) equal(w, w_, 0.01) equal(I, I_, 0.01) # Absorption spectrum calculation ALDA w0_ = 10.7931 I0_ = 5.4131 w_ = 10.7562 I_ = 5.8803 a0, a = df.get_polarizability(filename=None, xc='ALDA')
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
xc="PBE", basis="dzp", poissonsolver=dict(dipolelayer="xy")) mol.set_calculator(calc) # Get ground state mol.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=30) # Full diagonalization calc.write("MoS2_gs.gpw", mode="all") # Dielectric Response df = DielectricFunction(calc="MoS2_gs.gpw", eta=0.05, domega0=0.02, truncation="2D", # truncation ecut=50) alpha0x, alphax = df.get_polarizability(q_c=[0, 0, 0], direction='x', pbc=[True, True, False], filename="MoS2_alpha_x.csv") alpha0z, alphaz = df.get_polarizability(q_c=[0, 0, 0], direction='z', pbc=[True, True, False], filename="MoS2_alpha_z.csv")
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 w, I = findpeak(np.linspace(0, 14., 141), b0.imag)
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 w_ = 10.9530497246 I_ = 6.09704008088 w, I = findpeak(np.linspace(0, 24., 241), b0.imag) equal(w, w0_, 0.05) equal(I / (4 * np.pi), I0_, 0.05)
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 w_ = 10.9530497246 I_ = 6.09704008088
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 w, I = findpeak(np.linspace(0, 14., 141), b0.imag) equal(w, w0_, 0.05) equal(6**3 * I / (4 * np.pi), I0_, 0.5) w, I = findpeak(np.linspace(0, 14., 141), a0.imag) equal(w, w0_, 0.05) equal(I, I0_, 0.5)
ecut = 50 eshift = 0.8 eta = 0.05 df = DielectricFunction('gs_MoS2.gpw', ecut=ecut, frequencies=np.linspace(0, 5, 1001), nbands=50, intraband=False, hilbert=False, eta=eta, eshift=eshift, txt='rpa_MoS2.txt') df.get_polarizability(filename='pol_rpa_MoS2.csv', pbc=[True, True, False]) bse = BSE('gs_MoS2.gpw', spinors=True, ecut=ecut, valence_bands=[8], conduction_bands=[9], nbands=50, eshift=eshift, mode='BSE', txt='bse_MoS2.txt') bse.get_polarizability(filename='pol_bse_MoS2.csv', eta=eta, pbc=[True, True, False], write_eig='bse_MoS2_eig.dat',
nbands=8, xc='PBE', kpts={ 'size': [nk, nk, 1], 'gamma': True }, experimental={'kpt_refine': kpt_refine}, occupations=FermiDirac(0.026)) system.set_calculator(calc) system.get_potential_energy() calc.write('graphene.gpw', 'all') pbc = system.pbc df = DielectricFunction('graphene.gpw', eta=25e-3, domega0=0.01) alpha0x_w, alphax_w = df.get_polarizability(q_c=[1 / (nk * nkrefine), 0, 0]) omega_w = df.get_frequencies() analyticalalpha_w = 1j / (8 * omega_w[1:] / Hartree) # Just some hardcoded test for alpha at omega=0 equal(alphax_w[0].real, 6.705, tolerance=0.02, msg='Polarizability at omega=0 is wrong') if 0: from matplotlib import pyplot as plt plt.plot(omega_w, alphax_w.real, label='GPAW real part') plt.plot(omega_w, alphax_w.imag, '--', label='GPAW imag part') plt.plot(omega_w[1:], analyticalalpha_w.imag,
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')
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(wigner_seitz_truncation=False, filename=None) a0_ws, a_ws = df.get_polarizability(wigner_seitz_truncation=True, filename=None) w0_ = 10.778232265664668 I0_ = 5.5467658790816268 w_ = 10.9530497246 I_ = 6.09704008088 w, I = findpeak(np.linspace(0, 24., 241), b0.imag) equal(w, w0_, 0.05) equal(I / (4 * np.pi), I0_, 0.05) w, I = findpeak(np.linspace(0, 24., 241), a0.imag) equal(w, w0_, 0.05) equal(I, I0_, 0.05) w, I = findpeak(np.linspace(0, 24., 241), a0_ws.imag) equal(w, w0_, 0.05)