Exemplo n.º 1
0
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)
Exemplo n.º 2
0
    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))
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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')
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
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
Exemplo n.º 10
0
# 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
Exemplo n.º 11
0
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
Exemplo n.º 12
0
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()
Exemplo n.º 13
0
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))
Exemplo n.º 14
0
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()
Exemplo n.º 15
0
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
Exemplo n.º 16
0
                  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)
Exemplo n.º 17
0
                                         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) *
Exemplo n.º 18
0
                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
Exemplo n.º 20
0
                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: