예제 #1
0
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)
예제 #2
0
                        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
    
예제 #4
0
            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
예제 #8
0
    
    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)
예제 #9
0
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',
예제 #10
0
                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,
예제 #11
0
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')
예제 #12
0
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)