Band gap & Impurity level in eigenvalues


I am recently doing calculations with doping element in structure and found than band gap given by eigenvalue_band_properties() method from Vasprun for structure with impurity can give surprising results.

For example : for 3 doping elements in structure, the output of band_properties is :

(0.3373999999999999, 1.603, 1.2656, True)

while for 4 doping elements :

(3.2411, 4.5538, 1.3127, True)

By checking the eigenvalues, I found the band gap for first case if given from impurity level :

[1.2315, 1. ],
[1.2354, 1. ],
[1.2499, 1. ],
[1.25 , 1. ],
> [1.2656, 1. ],
> [1.603 , 0. ],
[1.604 , 0. ],
[1.6045, 0. ],
[1.637 , 0. ],
[1.6604, 0. ],
> [1.6613, 0. ],
> [4.6174, 0. ],
[4.6174, 0. ],
[4.6239, 0. ],
[4.6356, 0. ],
[4.6583, 0. ],

I think the correct band gap is the ‘second’ gap is the eigenvalues. Is there a way to avoid this ?
Thank you very much for your help !

Essentially, all that eigenvalue_band_properties() does is find the largest eigenvalue that is still occupied (up to numerical tolerance) and assign it be VBM. CBM is analogous. When you have dopants/impurities, new states are introduced in the gap that by definition will make this analysis not applicable. To know the “true” band gap, vbm, and cbm, you should use a separate bulk calculation and treat those values as fixed. Then in your dopant calculation you can simply look for states that are greater than vbm and less than cbm. A word of warning about this, though, is that finite size effects in DFT can cause your bulk eigenstate to shift when you add a dopant, and so this could make the analysis more challenging. For more info about how to deal with defects, please check out the code that is part of pymatgen.analysis.defects (code described in, theory described in You can feel free to ask about that code here as well.

Now, I’m not 100% sure why you say that the second gap is the “real” band gap. All I can see is that you have an energy band between 1.604eV and 1.6604eV that is unoccupied abd another energy band between 4.6174eV and 4.6583eV that are also unoccupied states. For the second gap to be “correct”, then your dopants would have to be introducing the entire band of empty states from 1.604eV to 1.6694eV. Is that what you think is happening?

1 Like

You can also get a band gap from the Vasprun.get_bandstructure() band structure object – they work in slightly different ways, with the latter using the Fermi level given by VASP to calculate implicit occupancies. I wonder how they compare in this case.