easyunfold Documentation#

build docs codecov PyPI Downloads

This package is intended for obtaining the effective band structure of a supercell for a certain k-point path of the primitive cell. It was originally based on PyVaspwfc for reading VASP wavefunction outputs, with a notable improvement being that symmetry-breaking is properly accounted for by sampling necessary additional k-points and averaging accordingly. Typical applications of band structure unfolding are the electronic structure analysis of defects, disorder, alloys, surfaces (and more), as illustrated in the example outputs below and docs examples.

Our goal is to implement the band structure unfolding workflow in a robust and user-friendly software package.

For the methodology of supercell band unfolding, see here.

Example Outputs#

Cs₂(Sn/Ti)Br₆ Vacancy-Ordered Perovskite Alloys

Oxygen Vacancy (Vₒ⁰) in MgO




To generate an unfolded band structure, one typically needs to perform the following steps:

  1. Create a primitive unit cell, and generate a band structure k-point path corresponding to this primitive cell.

  2. Create a supercell (e.g. disordered, defective, surface slab etc.), and obtain its optimised structure.

  3. Generate a series of k-points for the supercell to be calculated.

  4. Perform a band structure calculation with the supercell, and save its wavefunction output to file.

  5. Post-process the supercell wavefunction to obtain the unfolded band structure in the k-point path of the primitive unit cell.

These generation and analysis steps are automated in easyunfold, with only the primitive unit cell and supercell structures required as inputs from the user.

Typically, the supercell comprises some form of symmetry-breaking relative to the primitive cell, such as defects, disorder (e.g. special quasi-random structures (SQS) for site disorder – other forms of disorder such as magnetic, dynamic/vibrational, polar, elastic etc. also possible), or a surface/interface slab. In all cases, the supercell symmetry is lowered compared to the pristine primitive cell. Hence, for a given k-point path in the primitive cell Brillouin Zone, additional k-points are required to be sampled for the supercell, and the extracted spectral weights need to be appropriately averaged to obtain the correct effective band structure (EBS). See the docs Theory page for more details.

Studies using easyunfold#

We’ll add papers that use easyunfold to this list as they come out!

DFT code support#

At the moment, easyunfold supports VASP and CASTEP, but most of the routines are abstracted from the code specific details. In principle, support for other plane wave DFT code can be added by:

  • Implementing a subclass of WaveFunction that handles reading the wave function output.

  • Implementing functions for reading/writing k-points.

  • Adding branches for dispatching based on the dft_code attribute of the UnfoldKSet object in various places within the code.

The Atomic Simulation Environment (ASE) is used by easyunfold for reading in structures, so structure file IO is natively supported for essentially all public DFT codes.

Code Compatibility Notes#

  • Atom-projected band structures are currently only supported for VASP calculation outputs.

  • Gamma-only and non-collinear spin calculations are not supported for CASTEP.


And those who helped in the development:


Bugs reports and feature requests#

Bug reports and feature requests are well come. If you found any bug or missing features please report it on the Issue Tracker.

Code contributions#

We welcome your help in improving and extending the package with your own contributions. This is managed through GitHub pull requests; for external contributions, we prefer the fork and pull workflow while core developers use branches in the main repository:

  1. First open an Issue to discuss the proposed contribution. This discussion might include how the changes fit easyunfold’s scope and a general technical approach.

  2. Make your own project fork and implement the changes there. Please keep your code style compliant and use the pre-commit hooks.

  3. Open a pull request to merge the changes into the main project. A more detailed discussion can take place there before the changes are accepted.