wannier90 as a post-processing tool¶
This is a description of how to use wannier90 as a post-processing
tool.
The code must be run twice. On the first pass either the logical keyword
postproc_setup must be set to .true. in the input file
seedname.win or the code must be run with the command line option
-pp. Running the code then generates the file seedname.nnkp which
provides the information required to construct the
\(M_{mn}^{(\mathbf{k,b})}\) overlaps (Ref. 1, Eq. (25)) and
\(A_{mn}^{(\mathbf{k})}\) (Ref. 1, Eq. (62);
Ref. 2, Eq. (22)).
Once the overlaps and projections have been computed and written to files
seedname.mmn and seedname.amn, respectively, set postproc_setup to
.false. and run the code. Output is written to the file
seedname.wout.
seedname.nnkp file¶
OUTPUT, if postproc_setup = .true.
The file seedname.nnkp provides the information needed to determine
the required overlap elements \(M_{mn}^{(\mathbf{k,b})}\) and projections
\(A_{mn}^{(\mathbf{k})}\). It is written automatically when the code is
invoked with the -pp command-line option (or when
postproc_setup=.true. in seedname.win). There should be no need for
the user to edit this file.
Much of the information in seedname.nnkp is arranged in blocks
delimited by the strings begin block_name ... end block_name, as
described below.
Keywords¶
The first line of the file is a user comment, e.g., the date and time:
File written on 12Feb2006 at 15:13:12
The only logical keyword is calc_only_A, e.g.,
calc_only_A : F
Real_lattice block¶
begin real_lattice
2.250000 0.000000 0.000000
0.000000 2.250000 0.000000
0.000000 0.000000 2.250000
end real_lattice
The real lattice vectors in units of Angstrom.
Recip_lattice block¶
begin recip_lattice
2.792527 0.000000 0.000000
0.000000 2.792527 0.000000
0.000000 0.000000 2.792527
end recip_lattice
The reciprocal lattice vectors in units of inverse Angstrom.
Kpoints block¶
begin kpoints
8
0.00000 0.00000 0.00000
0.00000 0.50000 0.00000
.
.
.
0.50000 0.50000 0.50000
end kpoints
The first line in the block is the total number of k-points num_kpts.
The subsequent num_kpts lines specify the k-points in crystallographic
coordinates relative to the reciprocal lattice vectors.
Projections block¶
begin projections
n_proj
centre l mr r
z-axis x-axis zona
centre l mr r
z-axis x-axis zona
.
.
end projections
Notes:
n_proj: integer; the number of projection centres, equal to the number
of MLWF num_wann.
centre: three real numbers; projection function centre in
crystallographic coordinates relative to the direct lattice vectors.
l mr r: three integers; \(l\) and \(m_\mathrm{r}\) specify the angular
part \(\Theta_{lm_{\mathrm{r}}}(\theta,\varphi)\), and \(\mathrm{r}\)
specifies the radial part \(R_{\mathrm{r}}(r)\) of the projection function
(see Tables Angular functions,
Hybrids and
Radial functions).
z-axis: three real numbers; default is 0.0 0.0 1.0; defines the axis
from which the polar angle \(\theta\) in spherical polar coordinates is
measured.
x-axis: three real numbers; must be orthogonal to z-axis; default is
1.0 0.0 0.0 or a vector perpendicular to z-axis if z-axis is
given; defines the axis from which the azimuthal angle \(\varphi\) in
spherical polar coordinates is measured.
zona: real number; the value of \(\frac{Z}{a}\) associated with the
radial part of the atomic orbital. Units are in reciprocal Angstrom.
spinor_projections block¶
begin spinor_projections
n_proj
centre l mr r
z-axis x-axis zona
spin spn_quant
centre l mr r
z-axis x-axis zona
spin spn_quant
.
.
end spinor_projections
Notes: Only one of projections and spinor_projections should be defined.
Variables are the same as the projections block with the addition of
spin and spn_quant.
spin: integer. '1' or '-1' to denote projection onto up or down
states.
spn_quant: three real numbers. Defines the spin quantisation axis in
Cartesian coordinates.
nnkpts block¶
First line: nntot, the number of nearest neighbours belonging to each
k-point of the Monkhorst-Pack mesh
Subsequent lines: nntot\(\times\)num_kpts lines, i.e., nntot lines of
data for each k-point of the mesh.
Each line consists of 5 integers. The first is the k-point number
nkp. The second to the fifth specify its nearest neighbours
\(\mathbf{k+b}\): the second integer points to the k-point that is the
periodic image of the \(\mathbf{k+b}\) that we want; the last three
integers give the G-vector, in reciprocal lattice units, that brings the
k-point specified by the second integer (which is in the first BZ) to
the actual \(\mathbf{k+b}\) that we need.
exclude_bands block¶
To exclude bands (independent of k-point) from the calculation of the overlap and projection matrices, for example to ignore shallow-core states. The first line is the number of states to exclude, the following lines give the states to be excluded.
auto_projections block¶
This block is only printed if auto_projections=true in the input. The
choice of an additional block has been made in order to maintain
back-compatibility with codes that interface with wannier90, e.g.
pw2wannier90. The first entry in the block (in the example above, 8)
is the total number of target projections and it is equal to the number
of sought Wannier functions.
The second entry is a reserved flag with the value of zero. The implementations of the interface codes MUST check for this value to be zero and stop otherwise. In the future, one possible extension that we plan is to combine the automatic generation of initial projections with the selection of projections via a projections block. This will allow the user to specify only a subset of initial projections in the projections block and leave the interface code to automatically generate the remaining ones. In that case the constraint on the second entry will be lifted, so that it can take on the meaning of the number of projections that need to be generated automatically.
The selected columns of the density matrix (SCDM)
method 3 is one way of generating the initial
\(A_{mn}^{(\mathbf{k})}\) in an automatic way. This has been implemented
in the pw2wannier90 interface code (you need at least v6.4), see for instance
Tutorial 27 in the wannier90 tutorial
that shows how to use it.
Moreover, also the automatic generation of initial projections with
spinor WFs is implemented in the pw2wannier90 interface. See Tutorial
31 in the wannier90 tutorial that shows
how to use it.
Another automatic projection method is projectability-disentangled Wannier function (PDWF) 4, which uses pseudo-atomic orbitals inside pseudopotentials as initial guesses.
An example of projections¶
As a concrete example: one wishes to have a set of four sp\(^3\)
projection orbitals on, say, a carbon atom at (0.5,0.5,0.5) in
fractional coordinates relative to the direct lattice vectors. In this
case seedname.win will contain the following lines:
and seedname.nnkp, generated on the first pass of wannier90 (with
postproc_setup=T), will contain:
begin projections
4
0.50000 0.50000 0.50000 -1 1 1
0.000 0.000 1.000 1.000 0.000 0.000 2.00
0.50000 0.50000 0.50000 -1 2 1
0.000 0.000 1.000 1.000 0.000 0.000 2.00
0.50000 0.50000 0.50000 -1 3 1
0.000 0.000 1.000 1.000 0.000 0.000 2.00
0.50000 0.50000 0.50000 -1 4 1
0.000 0.000 1.000 1.000 0.000 0.000 2.00
end projections
where the first line tells us that in total four projections are specified, and the subsequent lines provide the projection centre, the angular and radial parts of the orbital (see Section Orbital Definitions for definitions), the \(z\) and \(x\) axes, and the diffusivity and cut-off radius for the projection orbital.
pwscf, or any other ab initio electronic structure code,
then reads seedname.nnkp file, calculates the projections and writes
them to seedname.amn.
seedname.mmn file¶
INPUT.
The file seedname.mmn contains the overlaps \(M_{mn}^{(\mathbf{k,b})}\).
First line: a user comment, e.g., the date and time
Second line: 3 integers: num_bands, num_kpts, nntot
Then: num_kpts * nntot blocks of data:
First line of each block: 5 integers. The first specifies the
\(\mathbf{k}\) (i.e., gives the ordinal corresponding to its position in
the list of k-points in seedname.win). The 2nd to 5th integers specify
\(\mathbf{k+b}\). The 2nd integer, in particular, points to the k-point on
the list that is a periodic image of \(\mathbf{k+b}\), and in particular
is the image that is actually mentioned in the list. The last three
integers specify the \(\mathbf{G}\) vector, in reciprocal lattice units,
that brings the k-point specified by the second integer, and that thus
lives inside the first BZ zone, to the actual \(\mathbf{k+b}\) that we
need.
Subsequent num_bands * num_bands lines of each block:
two real numbers per line. These are the real and imaginary parts,
respectively, of the actual scalar product \(M_{mn}^{(\mathbf{k,b})}\) for
\(m,n \in [1,\texttt{num_bands}]\). The order of these elements is such that
the first index \(m\) is fastest.
seedname.amn file¶
INPUT.
The file seedname.amn contains the projection \(A_{mn}^{(\mathbf{k})}\).
First line: a user comment, e.g., the date and time
Second line: 3 integers: num_bands, num_kpts, num_wann
Subsequently
\(\texttt{num_bands} \times \texttt{num_wann} \times \texttt{num_kpts}\) lines: 3
integers and 2 real numbers on each line. The first two integers are the
band index \(m\) and the projection index \(n\), respectively. The third
integer specifies the \(\mathbf{k}\) by giving the ordinal corresponding
to its position in the list of \(k\)-points in seedname.win. The real
numbers are the real and imaginary parts, respectively, of the actual
\(A_{mn}^{(\mathbf{k})}\).
seedname.dmn file¶
INPUT.
The file seedname.dmn contains the data needed to construct
symmetry-adapted Wannier functions 5. Required if
site_symmetry = .true.
First line: a user comment, e.g., the date and time
Second line: 4 integers: num_bands, nsymmetry, nkptirr,
num_kpts.
nsymmetry: the number of symmetry operationsnkptirr: the number of irreducible k-points
Blank line
num_kpts integers: Mapping between full k- and irreducible k-points.
Each k-point is related to some k-point in the irreducible BZ. The
information of this mapping is written. Each entry corresponds to a
k-point in the full BZ, in the order in which they appear in the k-point
list in seedname.win file. The (integer) value of each entry is the
k-point index in the IBZ to which the k-point maps. The number of unique
values is equal to the number of k-points in the IBZ. The data is
written 10 values per line.
Blank line
nkptirr integers: List of irreducible k-points. Each entry corresponds
to a k-point of the IBZ. The (integer) value of each entry is the
k-point index corresponding to the k-point list in seedname.win file.
The values should be between 1 and num_kpts. The data is written 10
values per line.
Blank line
nkptirr blocks of nsymmetry integer data (each block separated by a
blank line): List of k-points obtained by acting the symmetry operations
on the irreducible k-points. The data is written 10 values per line.
Blank line
\(\texttt{nsymmetry} \times \texttt{nkptirr}\) blocks of data:
The information of \(D\) matrix in Eq. (15) of Ref. 5. Each
block contains \(\texttt{num_wann} \times \texttt{num_wann}\) lines and is
separated by a blank line. The data are stored in
d_matrix_wann(m,n,isym,ikirr) with
\(\texttt{m}, \texttt{n} \in [1,\texttt{num_wann}]\),
\(\texttt{isym} \in [1,\texttt{nsymmetry}]\), and
\(\texttt{ikirr} \in [1,\texttt{nkptirr}]\). The order of the elements is such
that left indices run faster than right indices (m: fastest, ikirr:
slowest).
Blank line
\(\texttt{nsymmetry} \times \texttt{nkptirr}\) blocks of data:\
The information of \(\tilde d\) matrix in Eq. (17) of
Ref. 5. Each block contains
\(\texttt{num_bands} \times \texttt{num_bands}\) lines and is separated by a
blank line. The data are stored in d_matrix_band(m,n,isym,ikirr) with
\(\texttt{m}, \texttt{n} \in [1,\texttt{num_bands}]\),
\(\texttt{isym} \in [1,\texttt{nsymmetry}]\), and
\(\texttt{ikirr} \in [1,\texttt{nkptirr}]\). The order of the elements is such
that left indices run faster than right indices (m: fastest, ikirr:
slowest).
seedname.eig file¶
INPUT.
Required if any of disentanglement, plot_bands, plot_fermi_surface
or write_hr are .true.
The file seedname.eig contains the Kohn-Sham eigenvalues
\(\varepsilon_{n\mathbf{k}}\) (in eV) at each point in the Monkhorst-Pack
mesh.
Each line consist of two integers and a real number. The first integer
is the band index, the second integer gives the ordinal corresponding to
the \(k\)-point in the list of \(k\)-points in seedname.win, and the real
number is the eigenvalue.
E.g.,
Interface with pwscf¶
Interfaces between wannier90 and many ab-initio codes such as
pwscf, abinit (http://www.abinit.org), siesta
(http://www.icmab.es/siesta/), fleur, VASP and Wien2k
(http://www.wien2k.at) are available. Here we describe the seamless
interface between wannier90 and pwscf, a plane-wave DFT
code that comes as part of the Quantum ESPRESSO package (see
http://www.quantum-espresso.org). You will need to download and
compile pwscf (i.e., the pw.x code) and the
post-processing interface pw2wannier90.x. Please refer to
https://www.quantum-espresso.org/Doc/INPUT_pw2wannier90.html
for the documentation that comes with the Quantum ESPRESSO distribution.
-
Run 'scf'/'nscf' calculation(s) with
pw -
Run
wannier90withpostproc_setup=.true.to generateseedname.nnkp -
Run
pw2wannier90. First it reads an input file, e.g.,seedname.pw2wan, which definesprefixandoutdirfor the underlying 'scf' calculation, as well as the name of the fileseedname.nnkp, and does a consistency check between the direct and reciprocal lattice vectors read fromseedname.nnkpand those defined in the files specified byprefix.pw2wannier90generatesseedname.mmn,seedname.amnandseedname.eig.seedname.dmnandseedname.symfiles are additionally created whenwrite_dmn = .true.(see below). -
Run
wannier90withpostproc_setup=.false.to disentangle bands (if required), localise MLWF, and use MLWF for plotting, bandstructures, Fermi surfaces etc.
Examples of how the interface with pwscf works are given
in the wannier90 Tutorial.
seedname.pw2wan¶
For the most up-to-date documentation, see
https://www.quantum-espresso.org/Doc/INPUT_pw2wannier90.html;
for historical reference, we show here a number of keywords may be
specified in the pw2wannier90 input file:
-
outdir-- Location to write output files. Default is`./' -
prefix-- Prefix for thepwscfcalculation. Default is` ' -
seedname-- Seedname for thewannier90calculation. Default is`wannier' -
spin_component-- Spin component. Takes values`up',`down'or`none'(default). -
wan_mode-- Either`standalone'(default) or`library' -
write_unk-- Set to.true.to write the periodic part of the Bloch functions for plotting inwannier90. Default is.false. -
reduce_unk-- Set to.true.to reduce file-size (and resolution) of Bloch functions by a factor of 8. Default is.false.(only relevant ifwrite_unk=.true.) -
wvfn_formatted-- Set to.true.to write formatted wavefunctions. Default is.false.(only relevant ifwrite_unk=.true.) -
write_amn-- Set to.false.if \(A_{mn}^{(\mathbf{k})}\) not required. Default is.true. -
write_mmn-- Set to.false.if \(M_{mn}^{(\mathbf{k,b})}\) not required. Default is.true. -
write_spn-- Set to.true.to write out the matrix elements of \(S\) between Bloch states (non-collinear spin calculation only). Default is.false. -
spn_formatted-- Set to.true.to write spn data as a formatted file. Default is.false.(only relevant ifwrite_spn=.true.) -
write_uHu-- Set to.true.to write out the matrix elements\[ \langle u_{n{\bf k}+{\bf b}_1}\vert H_{\bf k}\vert u_{m{\bf k}+{\bf b}_2}\rangle. \]Default is
.false. -
uHu_formatted-- Set to.true.to write uHu data as a formatted file. Default is.false.(only relevant ifwrite_uHu=.true.) -
write_uIu-- Set to.true.to write out the matrix elements of\[ \langle u_{n{\bf k}+{\bf b}_1}\vert u_{m{\bf k}+{\bf b}_2}\rangle. \]Default is
.false. -
uIu_formatted-- Set to.true.to write uIu data as a formatted file. Default is.false.(only relevant ifwrite_uIu=.true.) -
write_unkg-- Set to.true.to write the first few Fourier components of the periodic parts of the Bloch functions. -
write_dmn-- Set to.true.to construct symmetry-adapted Wannier functions. Default is.false. -
read_sym-- Set to.true.to customize symmetry operations to be used in symmetry-adapted mode. Whenread_sym = .true., an additional inputseedname.symis required. Default is.false.(only relevant ifwrite_dmn=.true.). -
irr_bz-- Set to.true.to use the irreducible BZ calculation (see Section "Irreducible BZ calculation"). -
atom_proj-- Set to.true.to use pseudo-atomic orbitals for computingamn. Default is.false.. -
atom_proj_exclude-- A list of integers specifying the indices of pseudo-atomic projectors to be excluded from computingamn. Used only whenatom_proj = .true.. No default. -
atom_proj_ext-- Set to.true.to use external pseudo-atomic orbitals for computingamn, will read data files from directoryatom_proj_dir. Used only whenatom_proj = .true.. Default is.false.. -
atom_proj_dir-- A string specifying the directory for external pseudo-atomic projectors. Used only whenatom_proj = .true.andatom_proj_ext = .true.. No default.
For examples of use, refer to the wannier90 Tutorial.
seedname.sym¶
If read_sym = .true., then this additional input file is required for
pw2wannier90.x
if read_sym = .false., then this file is written by pw2wannier90.x
(only for reference -- it is not used in subsequent calculations)
The file seedname.sym contains the information of symmetry operations
used to create symmetry-adapted Wannier functions. If
read_sym = .false. (default), pw2wannier90.x uses the full symmetry
recognized by pw.x. If read_sym = .true., you can specify symmetry
operations to be used in symmetry-adapted mode.
First line: an integer: nsymmetry (number of symmetry operations)
Second line: blank
Then: nsymmetry blocks of data. Each block (separated by a blank line)
consists of four lines. The order of the data in each block is as
follows:
Here, \(R\) is the rotational part of symmetry operations (\(3\times3\)
matrix), and \(\bf t\) is the fractional translation in the unit of
"alat" (refer the definition of "alat" to the manual of
pwscf). Both data are given in Cartesian coordinates. The
symmetry operations act on a point \(\bf r\) as \({\bf r} R - {\bf t}\).
Irreducible BZ calculation¶
This section explains how to construct Wannier functions using wavefunctions calculated only in the irreducible BZ (IBZ). Using this option, users only have to calculate wavefunctions, overlap matrices (\(M_{mn}\)) and projection matrices (\(A_{mn}\)) in the IBZ, which will reduce the computational cost. Currently, this feature is implemented only in the interface code with Quantum ESPRESSO and requires an additional python package, symWannier. See also the website of symWannier and Ref. 6.
Note
The symWannier package also has the ability to construct
symmetry-adapted Wannier functions only from the .mmn,.amnand.eig`
files in the IBZ and some symmetry information.
The procedure is as follows.
-
Run
scf/nscfcalculation(s) with Quantum ESPRESSOpw.x. In thenscfcalculation, users only have to calculate k-points in the IBZ.E.g.:
Users also have the option to skip the
nscfcalculation, if the grid of thescfstep is already sufficient. -
Run Wannier90 with
postproc_setup = .true.(or equivalently with the-ppcommand line flag) to generate the fileseedname.nnkp. -
Run
pw2wannier90withirr_bz = .true.in the input file.pw2wannier90then generates the filesseedname.immn,seedname.iamn,seedname.ieigandseedname.isym. -
Run the python code
write_full_data.py, part of thesymWannierpackage. You can first install the package from GitHub and then run the script as(replace
<seedname>with the seedname of your calculation).This python script generates the \(M_{mn}\) and \(A_{mn}\) matrices, and Kohn-Sham eigenvalues in the full BZ (
seedname.mmn,seedname.amn, andseedname.eig) from those in the IBZ (seedname.immn,seedname.iamn, andseedname.ieig) by using the symmetry information (seedname.isym). The relations between these quantities in the IBZ and full BZ are explained in Ref. 6. -
Run
wannier90(withpostproc_setup = .false.or, equivalently, without the-ppcommand line option).
seedname.immn file¶
INPUT
The format is the same as seedname.mmn, except that the number of
kpoints is the number of k-points in the IBZ. See also
the section on the seedname.mmn file.
seedname.iamn file¶
INPUT
The format is the same as seedname.amn, except that the number of
kpoints is the number of k-points in the IBZ. See also
See also the section on the seedname.amn file.
seedname.ieig file¶
INPUT
The format is the same as seedname.eig, except that the number of
kpoints is the number of k-points in the IBZ. See also
See also the section on the seedname.eig file.
seedname.isym file¶
INPUT
The file seedname.isym contains the data needed to construct Wannier
functions from information computed only in the IBZ.
First line: a user comment, e.g., the date and time
Second line: 2 integers: nsymmetry, spinors, where:
nsymmetry: the number of symmetry operationsspinors:1for spinor case or0for non-spinor case
Then: nsymmetry blocks of data. Each block describes a symmetry
operation, \(\hat{g}\), and consists of 7 lines (11 lines for the spinor
case). The order of the data in each block is as follows:
Non-spinor case:
a comment
R(1,1) R(2,1) R(3,1)
R(1,2) R(2,2) R(3,2)
R(1,3) R(2,3) R(3,3)
t(1) t(2) t(3)
T
invs
Spinor case:
a comment
R(1,1) R(2,1) R(3,1)
R(1,2) R(2,2) R(3,2)
R(1,3) R(2,3) R(3,3)
t(1) t(2) t(3)
T
u(1,1).real u(1,1).imag
u(2,1).real u(2,1).imag
u(1,2).real u(1,2).imag
u(2,2).real u(2,2).imag
invs
Here, \(R\) is the rotational part of symmetry operations, (\(3 \times 3\)
integer matrix), and \(\bf t\) is the fractional translation in
crystal coordinates. The symmetry operations act on a point \(\bf r\) in
crystal coordinates as \(\hat{g} {\bf r} = {\bf r} R - {\bf t}\).
\(T=1\) (\(T=0\)) indicates that this symmetry operation includes (does not
include) time-reversal operation, respectively.
\(u\) is the SU(2) rotation matrix for
the spinor part.
invs represents the symmetry operation
corresponding to \(\hat{g}^{-1}\).
2 blank lines
Then: An integer: nk_ibz, the number of k-points in the IBZ.
Then: nk_ibz lines, with 3 real numbers on each line corresponding
to a list of k-points in the IBZ in crystal coordinates.
2 blank lines
Then: 2 integers: num_bands, nblocks
Then: nblocks blocks of data for \(h_{mn}({\bf k})\).
nblocks is a number of symmetry operations, \(\hat{h}({\bf k})\), where
\(\hat{h} \bf k = \bf k\) and \(\bf k \in\) IBZ.
First line of each block: 3 integers. These specify the k-point in the
IBZ (a number from 1 to nk_ibz), the symmetry operation,
\(\hat{h}({\bf k})\), (a number from 1 to nsymmetry) and a number
of non-zero elements of \(\hat{h}({\bf k})\).
Subsequent lines of each block: 2 integers and 2 real numbers per line. These specify band indices, \(m\) and \(n\), and real and imaginary parts of \(h_{mn}({\bf k})\). Only non-zero components of \(h_{mn}({\bf k})\) are written.
2 blank lines
Then: An integer: num_wann: The number of Wannier functions.
Then: nsymmetry blocks of data.
First line of each block: 2 integers. These specify the symmetry operation, \(\hat{g}\), and a number of non-zero elements of the rotation matrix, \(D_{mn}(\hat{g})\).
Subsequent lines of each block: 2 integers and 2 real numbers per line. These specify indices of Wannier functions, \(m\) and \(n\), and real and imaginary parts of \(D_{mn}(\hat{g})\).
-
N. Marzari and D. Vanderbilt. Maximally localized generalized wannier functions for composite energy bands. Phys. Rev. B, 56:12847, 1997. ↩↩
-
I. Souza, N. Marzari, and D. Vanderbilt. Maximally localized wannier functions for entangled energy bands. Phys. Rev. B, 65:035109, 2001. ↩
-
A. Damle and L. Lin. Disentanglement via entanglement: A unified method for Wannier localization. ArXiv e-prints, March 2017. URL: http://adsabs.harvard.edu/abs/2017arXiv170306958D, arXiv:1703.06958. ↩
-
Junfeng Qiao, Giovanni Pizzi, and Nicola Marzari. Projectability disentanglement for accurate and automated electronic-structure Hamiltonians. npj Comput. Mater., 9(1):208, Nov 2023. doi:10.1038/s41524-023-01146-w. ↩
-
R. Sakuma. Symmetry-adapted wannier functions in the maximal localization procedure. Phys. Rev. B, 87:235109, 2013. ↩↩↩
-
Takashi Koretsune. Construction of maximally-localized wannier functions using crystal symmetry. Comp. Phys. Comm., 285:108645, 2023. doi:10.1016/j.cpc.2022.108645. ↩↩