How to plot band structure?

Solution 1:

Although there isn't a direct plot function, the band structure can be plot using the eigenvalue matrix

import matplotlib.pylab as plt
plt.plot(vasp.get_electronic_structure().eigenvalue_matrix);

Solution 2:

Or to plot it manually you could use:

# The trace is system dependent, in this example we use:
trace = np.array([[0, 0, 0], # Gamma
        [1, 0, 0], # X
        [1, 1, 0], # M
        [0, 0, 0], # Gamma
        [0, 0, 1], # Z
        [1, 0, 1], # R
        [1, 1, 1], # A
        [0, 0, 1]]) # Z
label_ticks = ['$\Gamma$', 'X', 'M', '$\Gamma$', 'Z', 'R', 'A', 'Z']

energy = ham['output/electronic_structure/eig_matrix']
E_f = ham_chg['output/electronic_structure/efermi']

energy -= E_f
n_kpoints = len(energy) 
n_trace = int(n_kpoints / (len(trace)-1))
normal_ticks = [i*n_trace for i in range(len(trace))] 

plt.axhline(y=0, ls='--', color='k')
plt.plot(energy, 'r-')

plt.xlim(normal_ticks[0], normal_ticks[-1])
plt.xticks(normal_ticks, label_ticks)
plt.grid(axis='x')
plt.ylabel("Energy - $E_F$ [eV]")

plt.ylim(-1, 1);

This requires two VASP calculation, first you calculate the charge density:

ham_1.write_charge_density = True 

And after this job is executed you use the charge density to calculate the band structure by restarting from the previous job:

ham_2 = ham.restart_from_charge_density(job_name="job_band", icharg=11)

But to my knowledge we currently have no automated functionality for this.