Bandstructure (spectral-function) unfolding
- Author:
Gabriel Constantinescu, University of Cambridge
As described in the Supplementary Information in the work of
Constantinescu and Hine [Constantinescu2015],
spectral function unfolding is the means through which one can study
the bandstructure of the primitive cell from simulations involving
(often complicated) supercells. For details theoretical descriptions,
one should visit the aforementioned article
[Constantinescu2015].
In this documentation, I will give a short explanation of the
procedures required to unfold the bandstructure in a ONETEP
“Properties” calculation. We strongly suggest that one reads the
entire document carefully before attempting any calculations, as there
are some stringent requirements along the way. Essentially,
all one will need is the following group of keywords and blocks:
BSUNFLD_CALCULATE : T
BSUNFLD_TRANSFORMATION : t11 t12 t13 t21 t22 t23 t31 t32 t33
%block SPECIES_BSUNFLD_GROUPS
Species_name-1 Species_name-2 ... Species_name-N
%endblock SPECIES_BSUNFLD_GROUPS
BS_PERTURBATIVE_SOC : F
BSUNFLD_NUM_ATOMS_PRIM : nat_prim
BSUNFLD_RESTART : F
BSUNFLD_NUM_EIGENVALUES : num_eigvl
%block BSUNFLD_KPOINT_PATH
fraction_G1_kpt-1 fraction_G2_kpt-1 fraction_G3_kpt-1
fraction_G1_kpt-2 fraction_G2_kpt-2 fraction_G3_kpt-2
...
fraction_G1_kpt-N fraction_G2_kpt-N fraction_G3_kpt-N
%endblock BSUNFLD_KPOINT_PATH
BSUNFLD_NUM_KPTS_PATH : num_kpts_path
For each in turn:
BSUNFLD_CALCULATE
setting this to True will enable the calculation of the unfolded spectral function. Default: FalseBSUNFLD_TRANSFORMATION
is a list of 9 integers representing the flattened transformation matrix from the primitive cell to the supercell: \(\textbf{T}= \begin{bmatrix} t11 & t12 & t13 \\ t21 & t22 & t23 \\ t31 & t32 & t33 \end{bmatrix}\), where \(\textbf{T} \begin{bmatrix} \mathbf{a_1} \\ \mathbf{a_2} \\ \mathbf{a_3} \end{bmatrix} = \begin{bmatrix} \mathbf{A_1} \\ \mathbf{A_2} \\ \mathbf{A_3} \end{bmatrix}\), with \(\mathbf{a_i}\) (\(\mathbf{A_i}\)) being the lattice vectors of the primitive cell (supercell). For instance,BSUNFLD_TRANSFORMATION
: 4 0 0 0 4 0 0 0 1 would correspond to an implicit 4x4x1 supercell. Default: 1 0 0 0 1 0 0 0 1, corresponding to a 1x1x1 supercell.- The block
SPECIES_BSUNFLD_GROUPS
contains the atoms on which we are projecting; one needs to specify the of the atoms species (can be different from the chemical symbol) on which the spectral function is projected. Currently, only one group at a time is allowed. Example:%block SPECIES_BSUNFLD_GROUPS Mo Se1 %endblock SPECIES_BSUNFLD_GROUPS
this projects onto the MoSe\(_2\) monolayer in a MoSe\(_2\)/WSe\(_2\) heterostructure, where the Se atoms belonging to the MoSe\(_2\) monolayer have been denoted as Se1.
- The logical keyword
BS_PERTURBATIVE_SOC
controls the inclusion (True) or exclusion (False) of perturbative spin-orbit coupling in our calculation. Note that if set to True, the eigenvalues are no longer spin-degenerate and one will have twice the number of states. Since this option essentially quadruples the size of the Hamiltonian and overlap matrix, the calculation will be significantly slower. Default: False. - The integer keyword
BSUNFLD_NUM_ATOMS_PRIM
indicates the number of atoms in the primitive cell onto which you are unfolding. This brings us to a major requirement of the code: while the projected atoms can be split across the list of all input atoms, the former must be grouped by primitive cells, always maintaining the same order of the atoms in the primitive cells! Example: if atoms At1 and At2 form a primitive cell, the input ordering “At3 At1 At2 At4 At1 At2 A3” is correct, while “At3 At1 At2 At4 At2 At3 At1” or “At3 At1 At2 At4 At2 At1 At3” are incorrect. - The logical keyword
BSUNFLD_RESTART
controls whether one wishes to reuse previously calculated values for the spectral function. The restart procedure works as follows: the code writes a restart file (“unfolded\(\_\)specfunc\(\_\)red.dat”) where it stores the calculated values for the unfolded spectral function at unique k-points of the monolayer - the values that have not been calculated yet are filled with zeros. If this file is present and the restart keyword is set to true, the code will read in the previously calculated values and skip them in the current computations. The final output file (“unfolded\(\_\)specfunc.dat”) will only be written once all the k-points have been dealt with.Each line in final output file or the restart file contains 8 numbers: the eigenvalue (in eV), the real part of the unfolded spectral function (at that k-point and eigenvalue), the imaginary part of the unfolded spectral function, the eigenvalue count (from 1 to \(2\cdot\) BSUNFLD\(\_\)NUM\(\_\)EIGENVALUES, the x, y, and z component of the current primitive-cell k-point (\(\AA^{-1}\)), and the index of the k-point (from 1 to the total number of considered k-points).After the final output file has been obtained, one can use a discretisation script (should be found on the ONETEP webside, in the utilities section), in order to obtain a file that is ready to plot with gnuplot. - The integer keyword
BSUNFLD_NUM_EIGENVALUES
controls the number of eigenvalues (above and below the Fermi level) for which the spectral function is calculated. If set to negative values,BSUNFLD_NUM_EIGENVALUES
will internally be set to the number of nondegenerate occupied eigenstates. Thus, in total, for each k-point, the spectral function will be calculated at \(2\cdot\)BSUNFLD_NUM_EIGENVALUES
. - The block
BSUNFLD_KPOINT_PATH
indicates the fractional coordinates of the different k-points that mark endpoints of desired paths through the primitive-cell Brillouin zone. The fractional coordinates are with respect to the implied reciprocal lattice vectors of the primitive cell, not the simulation cell (supercell). BSUNFLD_NUM_KPTS_PATH
represents the number of k-points calculated along each path from theBSUNFLD_KPOINT_PATH
block. This number includes the endpoints of each path. Default: 2 (the endpoints only)
[Constantinescu2015] Constantinescu, G. C.; Hine, N. D. M. Phys. Rev. B 2015, 91, 195416