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 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
예제 #3
0
calc = GPAW(mode=PW(200),
            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()
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='RPA', filename='EELS_Al', q_c=q)
#df.check_sum_rule()
#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'

world.barrier()
d = np.loadtxt('EELS_Al',delimiter=',')

# New results are compared with test values
wpeak1,Ipeak1 = findpeak(d[:,0],d[:,1])
atoms.get_potential_energy()

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()
from gpaw.test import equal, findpeak

a = 6.75 * Bohr
atoms = bulk('C', 'diamond', a=a)

calc = GPAW(mode='pw',
            kpts=(3, 3, 3),
            eigensolver='rmm-diis',
            occupations=FermiDirac(0.001))

atoms.set_calculator(calc)
atoms.get_potential_energy()
calc.write('C.gpw', 'all')

# 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)
예제 #6
0
            xc='LDA',
            occupations=FermiDirac(0.001))  # Use small FD smearing

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
            eigensolver=RMM_DIIS(),
            mixer=Mixer(0.1,3),
            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')
예제 #8
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')
예제 #9
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()
예제 #10
0
calc = GPAW(mode=PW(200),
            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()
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='RPA', filename='EELS_Al', q_c=q)
#df.check_sum_rule()
#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')

world.barrier()
d = np.loadtxt('EELS_Al',delimiter=',')

# New results are compared with test values
wpeak1,Ipeak1 = findpeak(d[:,0],d[:,1])
예제 #11
0
           cell=(a, a, a),
           pbc=True)

a1.calc = GPAW(gpts=(10, 10, 10),
               mode=PW(300),
               kpts={'size': (10, 10, 10), '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=2,
                         ecut=400,
                         txt='2block.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')
예제 #12
0
from gpaw.test import equal, findpeak

a = 6.75 * Bohr
atoms = bulk('C', 'diamond', a=a)

calc = GPAW(mode='pw',
            kpts=(3, 3, 3),
            eigensolver='rmm-diis',
            occupations=FermiDirac(0.001))

atoms.set_calculator(calc)
atoms.get_potential_energy()
calc.write('C.gpw', 'all')

# 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)
예제 #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
파일: eels.py 프로젝트: thonmaker/gpaw
from gpaw import GPAW
from gpaw.response.df import DielectricFunction

calc = GPAW('Ag_GLLBSC.gpw', parallel={'domain': 1})
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()
예제 #15
0
calc = GPAW(mode=PW(200),
            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()
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])
wpeak2,Ipeak2 = findpeak(d[:,0],d[:,2])
예제 #16
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", domega0=0.05)  # Ground state input  # 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()
예제 #17
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()
예제 #18
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')
    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,
예제 #20
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')
    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
예제 #21
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

예제 #22
0
import numpy as np
from ase.build 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