Band unfolding tutorial


Software components

  • nanotools

  • RESCU+


I will need the following pseudopotentials.

  • Au_AtomicData.mat

  • Cu_AtomicData.mat

Let’s copy them from the pseudo database to the current working directory and export RESCUPLUS_PSEUDO=$PWD.



In this tutorial, I show how to unfold the band structure of a copper supercell with a gold defect onto a copper primitive cell.


Create the Python script with the following content (see the tutorial on TotalEnergy)

from nanotools import Atoms, Cell, System, TotalEnergy
import numpy as np
a = 3.74
cell = Cell(avec=a*np.eye(3), resolution=0.12)
fxyz = [[0.0, 0.0, 0.0],[0.0, 0.5, 0.5],[0.5, 0.0, 0.5],[0.5, 0.5, 0.0]]
atoms = Atoms(fractional_positions=fxyz, formula="AuCu(3)")
sys = System(cell=cell, atoms=atoms)
calc = TotalEnergy(sys)


from nanotools.bandunfolding import BandUnfolding as BU
import numpy as np
calc = BU.from_totalenergy("nano_scf_out.json")
calc.set_primitive_cell(avec=3.74/2.*(np.ones((3,3)) - np.eye(3)))
calc.set_kpoint_path(special_points=["L", "G", "X"])


Band structures are a useful analysis tool. Because of lattice mismatch, impurity concentration, disorder and other structural constraints, DFT calculations are routinely performed on supercells. This leads to so-called band folding which tends to obfuscate the band structure and make it difficult to analyse and compare to experimental results like ARPES data. Band unfolding is a way to recover a primitive-cell like band structure which is more readable.

The technique basically works as follows. The supercell band structure is calculated for a given path across the primitive cell band structure. The eigenstates of the supercells can be partitioned in k-space into several primitive cell states with different crystal momenta. In a perfect crystal, these states are normalized with respect to a reciprocal space cell such that their integral is 1. In general, integration over the reciprocal space cell yields a factor between 0 and 1, yielding a spectral function $A(\mathbf{k}, \epsilon)$. In other words, instead of having pure Bloch states with definite energies, we obtain a band structure where each Block states has a weight.

Here is a high level view of the calculation workflow:

  1. Initialize the BandUnfolding calculator from a ground state calculation (TotalEnergy).

  2. Perform a band unfolding calculation (non-self-consistently).

  3. Use the BandUnfolding calculator’s method to plot the band spectral function.

Initialize the BandUnfolding calculator

Upon completing the total energy calculation, the results are saved in nano_scf_out.json. I will initialize a BandUnfolding calculator using the class method from_totalenergy.

calc = BU.from_totalenergy("nano_scf_out.json")
calc.set_primitive_cell(avec=3.74/2.*(np.ones((3,3)) - np.eye(3)))

The method from_totalenergy will copy the system information and initialize the BU calculator. I need to specify which cell I would like to unfold to. This is typically a primitive cell commensurate with the supercell, but it could also be a smaller supercell. Here, I’m using a face-centered cubic cell with lattice parameter 3.74 ang. Note that this is not the equilibrium lattice constant of copper, but that of AuCu$_3$ such that the primitive cell is commensurate with the supercell. The k-point path is automatically generated from the cell shape. It can be changed using the system.set_kpoint_path method, for example


Band unfolding calculation

RESCU+’s solvers are invoked calling the solve method


The method writes all parameters to a JSON file, then calls the relevant (Fortran) program, then loads the data back into the calculator. The output of rescuplusu goes to nano_bsu_out.h5 and nano_bsu_out.json.

Plot the spectral function

I use the plot_spectral_function method to plot the spectral function.

from nanotools.bandunfolding import BandUnfolding as BU
calc ="nano_bsu_out.json")
calc.plot_spectral_function(filename="AuCu3_bsu.png", show=False)

plot_spectral_function is a function that returns a Pyplot figure handle. You can use the handle to modify the figure or save it to a file. You should see something similar to

AuCu3 spectral function