Ejemplo n.º 1
0
            convergence={'bands':60}, # It's better NOT to converge all bands. 
            eigensolver='cg',         # It's preferable to use 'cg' to calculate unoccupied states.
            occupations=FermiDirac(0.05),
            txt='out_gs.txt')

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

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

for i in range(1,8):                    # Loop over different q.   
    df = DF(calc='graphite.gpw',       
            nbands=60,                  # Use only bands that are converged in the gs calculation.
            q=np.array([i/20., 0., 0.]),      # Gamma - M excitation
            #q=np.array([i/20., -i/20., 0.])  # Gamma - K excitation
            w=np.linspace(0, 40, 401),  # Spectra from 0-40 eV with 0.1 eV spacing.
            eta=0.2,                    # Broadening parameter.
            ecut=40+(i-1)*10,           # In general, larger q requires larger planewave cutoff energy.       # 
            txt='out_df_%d.txt' %(i))   # Write differnt output for different q.

    df1, df2 = df.get_dielectric_function()
    df.get_EELS_spectrum(df1, df2, filename='graphite_EELS_%d' %(i)) # Use different filenames for different q
    df.check_sum_rule(df1, df2)         # Check f-sum rule.

    print >> f, sqrt(np.inner(df.qq_v / Bohr, df.qq_v / Bohr))



Ejemplo n.º 2
0
    w = np.linspace(0, 24, 481)
    q = np.array([0.0, 0.00001, 0.])

    # getting macroscopic constant
    df = DF(calc='si.gpw', q=q, w=(0.,), eta=0.0001, 
        hilbert_trans=False, txt='df_1.out',
        ecut=150, optical_limit=True)

    df1, df2 = df.get_dielectric_function()
    eM1, eM2 = df.get_macroscopic_dielectric_constant(df1, df2)

    df.write('df_1.pckl')

    if np.abs(eM1 - 13.992277) > 1e-4 or np.abs(eM2 - 12.589596) > 1e-4:
        print eM1, eM2
        raise ValueError('Pls check dielectric constant !')

    #getting absorption spectrum
    df = DF(calc='si.gpw', q=q, w=w, eta=0.1,
        ecut=150, optical_limit=True, txt='df_2.out')

    df1, df2 = df.get_dielectric_function()
    df.get_absorption_spectrum(df1, df2, filename='si_abs')
    df.check_sum_rule(df1, df2)
    
    df.write('df_2.pckl')

    if rank == 0 :
        os.remove('si.gpw')

Ejemplo n.º 3
0
import numpy as np
from gpaw import GPAW
from gpaw.response.df import DF

w = np.linspace(0, 24., 481)    # 0-24 eV with 0.05 eV spacing
q = np.array([0.0, 0.00001, 0.])

df = DF(calc='si.gpw',
        q=q,
        w=w,
        eta=0.1,           # Broadening parameter 
        ecut=150,          # Energy cutoff for planewaves
        optical_limit=True,
        txt='df_2.out')    # Output text

df1, df2 = df.get_dielectric_function()
df.get_absorption_spectrum(df1, df2, filename='si_abs.dat')
df.check_sum_rule(df1, df2)
df.write('df_2.pckl')      # Save important parameters and data 
Ejemplo n.º 4
0
            hilbert_trans=False,
            ecut=150,
            optical_limit=True,
            txt='df_1.out')

    eM1, eM2 = df.get_macroscopic_dielectric_constant()

    df.write('df_1.pckl')

    if np.abs(eM1 - 13.991793) > 1e-3 or np.abs(eM2 - 12.589129) > 1e-3:
        print eM1, eM2
        raise ValueError('Please check dielectric constant !')

    #getting absorption spectrum
    df = DF(calc='si.gpw',
            q=q,
            w=w,
            eta=0.1,
            ecut=150,
            optical_limit=True,
            txt='df_2.out')

    df.get_absorption_spectrum(filename='si_abs')
    df.check_sum_rule()
    
    df.write('df_2.pckl')

    if rank == 0 :
        os.remove('si.gpw')

Ejemplo n.º 5
0
    eigensolver=
    'cg',  # It's preferable to use 'cg' to calculate unoccupied states.
    occupations=FermiDirac(0.05),
    txt='out_gs.txt')

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

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

for i in range(1, 8):  # Loop over different q.
    df = DF(
        calc='graphite.gpw',
        nbands=60,  # Use only bands that are converged in the gs calculation.
        q=np.array([i / 20., 0., 0.]),  # Gamma - M excitation
        #q=np.array([i/20., -i/20., 0.])  # Gamma - K excitation
        w=np.linspace(0, 40, 401),  # Spectra from 0-40 eV with 0.1 eV spacing.
        eta=0.2,  # Broadening parameter.
        ecut=40 + (i - 1) *
        10,  # In general, larger q requires larger planewave cutoff energy.       # 
        txt='out_df_%d.txt' % (i))  # Write differnt output for different q.

    df1, df2 = df.get_dielectric_function()
    df.get_EELS_spectrum(df1, df2, filename='graphite_EELS_%d' %
                         (i))  # Use different filenames for different q
    df.check_sum_rule(df1, df2)  # Check f-sum rule.

    print >> f, sqrt(np.inner(df.qq_v / Bohr, df.qq_v / Bohr))
Ejemplo n.º 6
0
    idiotproof=False,  # allow uneven distribution of k-points
    xc='LDA')

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

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

df = DF(calc=calc, q=q, w=w, eta=0.2, ecut=50)
df1, df2 = df.get_dielectric_function()
df.get_EELS_spectrum(df1, df2, filename='EELS_Al')
df.check_sum_rule()

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'

d = np.loadtxt('EELS_Al')
wpeak = 15.7  # eV
Nw = 157
if d[Nw, 1] > d[Nw - 1, 1] and d[Nw, 2] > d[Nw + 1, 2]:
    pass
else:
    raise ValueError('Plasmon peak not correct ! ')

if (np.abs(d[Nw, 1] - 28.8932274034) > 1e-5
Ejemplo n.º 7
0
            nbands=70,                # The result should also be converged with respect to bands.
            convergence={'bands':60}, # It's better NOT to converge all bands. 
            eigensolver='cg',         # It's preferable to use 'cg' to calculate unoccupied states.
            occupations=FermiDirac(0.05),
            txt='out_gs.txt')

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

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

for i in range(1,8):                    # Loop over different q.   
    df = DF(calc='graphite.gpw',       
            nbands=60,                  # Use only bands that are converged in the gs calculation.
            q=np.array([i/20., 0., 0.]),      # Gamma - M excitation
            #q=np.array([i/20., -i/20., 0.])  # Gamma - K excitation
            w=np.linspace(0, 40, 401),  # Spectra from 0-40 eV with 0.1 eV spacing.
            eta=0.2,                    # Broadening parameter.
            ecut=40+(i-1)*10,           # In general, larger q requires larger planewave cutoff energy.       # 
            txt='out_df_%d.txt' %(i))   # Write differnt output for different q.

    df.get_EELS_spectrum(filename='graphite_EELS_%d' %(i)) # Use different filenames for different q
    df.check_sum_rule()         # Check f-sum rule.

    print >> f, sqrt(np.inner(df.qq_v / Bohr, df.qq_v / Bohr))