コード例 #1
0
ファイル: graphene_EELS.py プロジェクト: thonmaker/gpaw
def check_df(name, ref_energy, ref_loss, ref_energy_lfe, ref_loss_lfe,
             **kwargs_override):
    kwargs = dict(calc=calc, frequencies=w.copy(), eta=0.5, ecut=30,
                  txt='df.%s.txt' % name)
    kwargs.update(kwargs_override)
    df = DielectricFunction(**kwargs)
    fname = 'dfdump.%s.dat' % name
    df.get_eels_spectrum('RPA',q_c=q,filename=fname)
    world.barrier()
    d = np.loadtxt(fname,delimiter=',')

    loss = d[:, 1]
    loss_lfe = d[:, 2]
    energies = d[:, 0]

    #import pylab as pl
    #fig = pl.figure()
    #ax1 = fig.add_subplot(111)
    #ax1.plot(d[:, 0], d[:, 1]/np.max(d[:, 1]))
    #ax1.plot(d[:, 0], d[:, 2]/np.max(d[:, 2]))
    #ax1.axis(ymin=0, ymax=1)
    #fig.savefig('fig.%s.pdf' % name)

    energy, peakloss = getpeak(energies, loss)
    energy_lfe , peakloss_lfe = getpeak(energies, loss_lfe)

    check(name, energy, peakloss, ref_energy, ref_loss)
    check('%s-lfe' % name, energy_lfe, peakloss_lfe, ref_energy_lfe,
          ref_loss_lfe)

    line = template % (name, energy, peakloss, energy_lfe, peakloss_lfe,
                       repr(kwargs_override))
    scriptlines.append(line)
コード例 #2
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)
コード例 #3
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)
コード例 #4
0
def bb_file(mater):
    f_name = os.path.join(os.path.curdir, "{}-chi.npz".format(mater))
    if os.path.exists(f_name):
        return f_name
    else:  # Calculate the BB
        parprint("Chi matrix not calculated, build for now!")
        df = DielectricFunction(calc=es_wfs(mater),
                                eta=0.1,
                                intraband=False,
                                truncation="2D")
        bb = BuildingBlock(mater, df, qmax=3)
        bb.calculate_building_block()
        return f_name
コード例 #5
0
ファイル: hyd_chain_response.py プロジェクト: thonmaker/gpaw
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
コード例 #6
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))
コード例 #7
0
ファイル: eps_Si.py プロジェクト: Huaguiyuan/gpawDFT
import numpy as np
from gpaw.response.bse import BSE
from gpaw.response.df import DielectricFunction

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',
コード例 #8
0
ファイル: MoS2.py プロジェクト: alchem0x2A/GPAW_learn
                      gamma=True),
            occupations=FermiDirac(0.001),
            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")


コード例 #9
0
from gpaw import GPAW
from gpaw.response.df import DielectricFunction

calc = GPAW('Ag_GLLBSC.gpw')
calc.diagonalize_full_hamiltonian(nbands=30)
calc.write('Ag_GLLBSC_full.gpw', 'all')

# Set up dielectric function:
df = DielectricFunction(calc='Ag_GLLBSC_full.gpw',  # Ground state input
                        domega0=0.05)  # energy grid spacing at omega=0

# Momentum transfer, must be the difference between two kpoints!
q_c = [1.0 / 10, 0, 0]
df.get_eels_spectrum(q_c=q_c)  # a file called 'eels.csv' is generated

# Plot spectrum
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('eels.csv', delimiter=',')
omega = data[:, 0]
eels = data[:, 2]
plt.plot(omega, eels)
plt.xlabel('Energy (eV)')
plt.ylabel('Loss spectrum')
plt.xlim(0, 20)
plt.show()
コード例 #10
0
ファイル: diamond_absorption.py プロジェクト: thonmaker/gpaw
atoms.set_calculator(calc)
atoms.get_potential_energy()
calc.write('C.gpw', 'all')

eM1_ = 9.727
eM2_ = 9.548
w0_ = 10.7782
I0_ = 5.5472
w_ = 10.7532
I_ = 6.0686

# Macroscopic dielectric constant calculation
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)
コード例 #11
0
    calc = GPAW(mode=PW(ecut=400),
                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:],
コード例 #12
0
ファイル: alpha_MoS2.py プロジェクト: thonmaker/gpaw
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')
コード例 #13
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
コード例 #14
0
ファイル: graphene.py プロジェクト: thonmaker/gpaw
              
for GSkwargs in GSsettings:
    calc = GPAW(h=0.18,
                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])
コード例 #15
0
calc.set(kpts=(20, 20, 7), fixdensity=True)
# atoms.get_potential_energy()

# The result should also be converged with respect to bands:
calc.diagonalize_full_hamiltonian(nbands=60)
calc.write('caf2.gpw', 'all')

# Part 2: Spectra calculations
f = paropen(output_folder + '/caf2_q_list', 'w')  # write q

for i in range(1, 6):  # loop over different q
    df = DielectricFunction(
        calc='caf2.gpw',
        domega0=0.01,
        eta=0.2,  # Broadening parameter.
        ecut=100,
        # write different output for different q:
        txt='%s/out_df_%d.txt' % (output_folder, i))

    q_c = [i / 20.0, 0.0, 0.0]  # Gamma - M excitation

    df.get_eels_spectrum(q_c=q_c,
                         filename='%s/caf2_EELS_%d' % (output_folder, i))

    # Calculate cartesian momentum vector:
    cell_cv = atoms.get_cell()
    bcell_cv = 2 * np.pi * np.linalg.inv(cell_cv).T
    q_v = np.dot(q_c, bcell_cv)
    print(sqrt(np.inner(q_v, q_v)), file=f)
コード例 #16
0
from ase.build import bulk
from gpaw import GPAW
from gpaw.response.df import DielectricFunction

# Part 1: Ground state calculation
atoms = bulk('Al', 'fcc', a=4.043)  # generate fcc crystal structure
# GPAW calculator initialization:
k = 13
calc = GPAW(mode='pw', kpts=(k, k, k))

atoms.set_calculator(calc)
atoms.get_potential_energy()  # ground state calculation is performed
calc.write('Al.gpw', 'all')  # use 'all' option to write wavefunctions

# Part 2: Spectrum calculation
df = DielectricFunction(calc='Al.gpw')  # ground state gpw file as input

# Momentum transfer, must be the difference between two kpoints:
q_c = [1.0 / k, 0, 0]
df.get_eels_spectrum(q_c=q_c)  # by default, an 'eels.csv' file is generated
コード例 #17
0
a1.calc = GPAW(gpts=(10, 10, 10),
               mode=PW(300),
               kpts={
                   'size': (30, 30, 30),
                   'gamma': True
               },
               parallel={'band': 1},
               txt='small.txt')

a1.get_potential_energy()
a1.calc.diagonalize_full_hamiltonian(nbands=20)
a1.calc.write('gs_Na.gpw', 'all')

# Calculate the dielectric functions
df1 = DielectricFunction('gs_Na.gpw', nblocks=1, ecut=400, txt='1block.txt')

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.gpw', nblocks=4, ecut=400, txt='4block.txt')

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
w1, I1 = findpeak(w_w, -(1. / df1LFCx).imag)
w2, I2 = findpeak(w_w, -(1. / df2LFCx).imag)
コード例 #18
0
               mode=PW(300),
               kpts={
                   'size': (30, 30, 30),
                   'gamma': True
               },
               parallel={'band': 1},
               txt='small.txt')

a1.get_potential_energy()
a1.calc.diagonalize_full_hamiltonian(nbands=20)
a1.calc.write('gs_Na.gpw', 'all')

kwargs = {'integrationmode': 'tetrahedron integration', 'ecut': 400}

# Calculate the dielectric functions
df1 = DielectricFunction('gs_Na.gpw', nblocks=1, txt='1block.txt', **kwargs)

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.gpw', nblocks=4, txt='4block.txt', **kwargs)

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

w1, I1 = findpeak(w_w, -(1. / df1LFCx).imag)
コード例 #19
0
from __future__ import print_function, division
import numpy as np
from gpaw.response.df import DielectricFunction

df = DielectricFunction('gs_MoS2.gpw',
                        frequencies=[0.5],
                        txt='eps_GG.txt',
                        hilbert=False,
                        ecut=50,
                        nbands=50)
df_t = DielectricFunction('gs_MoS2.gpw',
                          frequencies=[0.5],
                          txt='eps_GG.txt',
                          hilbert=False,
                          ecut=50,
                          nbands=50,
                          truncation='2D')

for iq in range(22):
    pd, eps_wGG, chi_wGG = df.get_dielectric_matrix(q_c=[iq / 42, iq / 42, 0],
                                                    symmetric=False,
                                                    calculate_chi=True)
    Gvec_Gv = pd.get_reciprocal_vectors(add_q=False)
    epsinv_GG = np.linalg.inv(eps_wGG[0])
    z0 = pd.gd.cell_cv[2, 2] / 2  # Center of layer

    eps_t_wGG = df_t.get_dielectric_matrix(q_c=[iq / 42, iq / 42, 0],
                                           symmetric=False)
    epsinv_t_GG = np.linalg.inv(eps_t_wGG[0])

    epsinv = 0.0
コード例 #20
0
ファイル: na_plasmon.py プロジェクト: thonmaker/gpaw
# Calculate the dielectric functions
dfs0 = []  # Arrays to check for self-consistency
dfs1 = []
dfs2 = []
dfs3 = []
dfs4 = []
dfs5 = []
for kwargs in settings:
    try:
        os.remove('chi0+0+0+0.pckl')
    except OSError:
        pass

    df1 = DielectricFunction('gs_Na_small.gpw',
                             domega0=0.03,
                             omegamax=10,
                             ecut=150,
                             name='chi0',
                             **kwargs)

    df1NLFCx, df1LFCx = df1.get_dielectric_function(direction='x')
    df1NLFCy, df1LFCy = df1.get_dielectric_function(direction='y')
    df1NLFCz, df1LFCz = df1.get_dielectric_function(direction='z')

    try:
        os.remove('chi1+0+0+0.pckl')
    except OSError:
        pass
    
    df2 = DielectricFunction('gs_Na_large.gpw',
                             domega0=0.03,
                             omegamax=10,
コード例 #21
0
ファイル: graphite_EELS.py プロジェクト: thonmaker/gpaw
calc.set(kpts=(20, 20, 7), fixdensity=True)
atoms.get_potential_energy()

# The result should also be converged with respect to bands:
calc.diagonalize_full_hamiltonian(nbands=60)
calc.write('graphite.gpw', 'all')

# Part 2: Spectra calculations
f = paropen('graphite_q_list', 'w')  # write q

for i in range(1, 6):  # loop over different q
    df = DielectricFunction(
        calc='graphite.gpw',
        domega0=0.01,
        eta=0.2,  # Broadening parameter.
        ecut=100,
        # write different output for different q:
        txt='out_df_%d.txt' % i)

    q_c = [i / 20.0, 0.0, 0.0]  # Gamma - M excitation

    df.get_eels_spectrum(q_c=q_c, filename='graphite_EELS_%d' % i)

    # Calculate cartesian momentum vector:
    cell_cv = atoms.get_cell()
    bcell_cv = 2 * np.pi * np.linalg.inv(cell_cv).T
    q_v = np.dot(q_c, bcell_cv)
    print(sqrt(np.inner(q_v, q_v)), file=f)

f.close()
コード例 #22
0
              valence_bands=range(4),
              conduction_bands=range(4),
              mode='RPA',
              nbands=4,
              ecut=ecut,
              write_h=False,
              write_v=False,
              )
    bse_w = bse.get_eels_spectrum(filename=None,
                                  q_c=q_c,
                                  w_w=w_w,
                                  eta=eta)[1]
    
if df:
    df = DielectricFunction(calc='Al.gpw',
                            frequencies=w_w,
                            eta=eta,
                            ecut=ecut,
                            hilbert=False)
    df_w = df.get_eels_spectrum(q_c=q_c, filename=None)[1]

if check_spectrum:
    w_ = 15.1423
    I_ = 25.4359
    wbse, Ibse = findpeak(w_w, bse_w)
    wdf, Idf = findpeak(w_w, df_w)
    equal(wbse, w_, 0.01)
    equal(wdf, w_, 0.01)
    equal(Ibse, I_, 0.1)
    equal(Idf, I_, 0.1)
コード例 #23
0
               txt='large.txt')

a1.get_potential_energy()
a2.get_potential_energy()

# 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')
コード例 #24
0
    calc = GPAW(mode='pw',
                dtype=complex,
                xc='RPBE',
                nbands=16,
                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
コード例 #25
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
コード例 #26
0
ファイル: bb_WSe2.py プロジェクト: Huaguiyuan/gpawDFT
from gpaw.response.df import DielectricFunction
from gpaw.response.qeh import BuildingBlock

df = DielectricFunction(calc='WSe2_gs_fulldiag.gpw',
                        eta=0.001,
                        domega0=0.05,
                        omega2=10.0,
                        nblocks=8,
                        ecut=150,
                        name='WSe2_response_',
                        truncation='2D')

buildingblock = BuildingBlock('WSe2', df)

buildingblock.calculate_building_block()
コード例 #27
0
ファイル: bb_MoS2.py プロジェクト: thonmaker/gpaw
from pathlib import Path
from gpaw.mpi import world
from gpaw.response.df import DielectricFunction
from gpaw.response.qeh import BuildingBlock

df = DielectricFunction(calc='MoS2_gs_fulldiag.gpw',
                        eta=0.001,
                        domega0=0.05,
                        omega2=10.0,
                        nblocks=8,
                        ecut=150,
                        truncation='2D')

buildingblock = BuildingBlock('MoS2', df, qmax=3.0)

buildingblock.calculate_building_block()

if world.rank == 0:
    Path('MoS2_gs_fulldiag.gpw').unlink()
コード例 #28
0
kpts = find_high_symmetry_monkhorst_pack('TaS2-gs.gpw', density=5.0)

responseGS = GPAW('TaS2-gs.gpw',
                  fixdensity=True,
                  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)')
コード例 #29
0
    parallel={'band': 1},
    idiotproof=False,  # allow uneven distribution of k-points
    xc='LDA')

atoms.set_calculator(calc)
atoms.get_potential_energy()
calc.write('Al', 'all')
t2 = time.time()

# Excited state calculation
q = np.array([1 / 4., 0., 0.])
w = np.linspace(0, 24, 241)

df = DielectricFunction(calc='Al',
                        frequencies=w,
                        eta=0.2,
                        ecut=50,
                        hilbert=False)
df.get_eels_spectrum(xc='ALDA', filename='EELS_Al_ALDA', q_c=q)
#df.check_sum_rule()
#df.write('Al.pckl')

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')

world.barrier()
d = np.loadtxt('EELS_Al_ALDA', delimiter=',')
# New results are compared with test values
wpeak1, Ipeak1 = findpeak(d[:, 0], d[:, 1])
コード例 #30
0
a2.calc.diagonalize_full_hamiltonian(nbands=20)

a1.calc.write('intraband_spinpaired.gpw', 'all')
a2.calc.write('intraband_spinpolarized.gpw', 'all')

# Calculate the dielectric functions
if world.rank == 0:
    try:
        os.remove('intraband_spinpaired+0+0+0.pckl')
    except OSError:
        pass

df1 = DielectricFunction('intraband_spinpaired.gpw',
                         domega0=0.03,
                         ecut=10,
                         rate=0.1,
                         integrationmode='tetrahedron integration',
                         name='intraband_spinpaired',
                         txt='intraband_spinpaired_df.txt')

df1NLFCx, df1LFCx = df1.get_dielectric_function(direction='x')
df1NLFCy, df1LFCy = df1.get_dielectric_function(direction='y')
df1NLFCz, df1LFCz = df1.get_dielectric_function(direction='z')
wp1_vv = df1.chi0.plasmafreq_vv**0.5
wp1 = wp1_vv[0, 0]
if world.rank == 0:
    try:
        os.remove('intraband_spinpolarized+0+0+0.pckl')
    except OSError:
        pass