Suppose I want to calculate the band structure of a material system along a specific high symmetry path in the Brillouin Zone. If the point group of the system is given, how can I easily compute the fractional coordinates of the high symmetry points U, G, W, etc.? Can Pymatgen compute these points? I guess this should be automated. Thanks.
-
1$\begingroup$ I assume that you are using the VASP package. The simplest way is to use VASPKIT. $\endgroup$– JackJul 13, 2021 at 0:01
-
$\begingroup$ @Jack Thanks for moving that to a comment! Usually I recommend that if the answer fits in a single comment box (600 characters or less), then it's better left as a comment than an answer. $\endgroup$– Nike DattaniJul 13, 2021 at 0:29
4 Answers
If you are really interested in learning how to generate the path, I strongly advice you to avoid using any automatic tool like suggested in previous answers.
In the Wiki page entitle Brillouin zone you can find the first Brillouin zone for each one of the Bravais lattice. This Wiki is based on the following paper:
Setyawan, Wahyu; Curtarolo, Stefano (2010). "High-throughput electronic band structure calculations: Challenges and tools". Computational Materials Science. 49 (2): 299–312 (DOI: 10.1016/j.commatsci.2010.05.010). arXiv:1004.2974.
Of course that you also need to go through solid state books like:
- Kittel, Charles (1996). Introduction to Solid State Physics. New York: Wiley. ISBN 978-0-471-14286-7.
- Ashcroft, Neil W.; Mermin, N. David (1976). Solid State Physics. Orlando: Harcourt. ISBN 978-0-03-049346-1.
After you know the Bravais lattice of your system, you look for the Brillouin zone, then look for the corresponding table with the high symmetry points and then you create your own path. Normally we start from the $\Gamma$ point that is the center of the Brillouin zone. The subsequent points are selected maintaining the continuity of the path.
For example, if your system has tetragonal symmetry (lets said, it is primitive tetragonal), then the first Brillouin zone will be:

In the caption of the figure, there is a suggestion for the path. If you look carefully, there are three branch: the first one between $\Gamma$ and Z, a second one between X and R; and finally, a third one between M and A. As you can see, there is a discontinuity between Z and X and between R and M as you have to jump to reach them.
Now, that you know the high symmetry points and created the path, you need to know how to generate it. The table bellow has the values of each point (in the reciprocal space) according the cell parameters.
Finally, you go to your program and add the path in accordance with its own format.
-
$\begingroup$ After checking out the high symmetry points of my lattice from the Wiki site you mentioned, can I choose my k-path in any sequence I like? For example, can I choose the my k-path for the above TET lattice as Gamma-Z-A-M-Gamma-X-R-Z-Gamma-X-M and still get the correct band structure? $\endgroup$– WonderSep 2, 2021 at 17:13
If the crystal unit cell is in a format readable by ASE, then you can use code that looks approximately like so:
from ase.io import read
atoms = read("myfilename.xyz")
bandpath = atoms.cell.bandpath()
This bandpath
object will have the relevant attributes to play with (kpoint coordinates, special point labels, special point coordinates, etc). This is a nice intro tutorial on the above process in a bit more detail than my rather minimal code block.
-
$\begingroup$ This could probably be extended by some information about using the standardized primitive cell so that the band path is correct. I do not know that ASE ensures this. $\endgroup$ Jul 11, 2021 at 15:21
-
$\begingroup$ I believe ASE's spacegroup submodule (depending on spglib), or using spglib directly can actually get you primitive cells, and the relevant atoms in the primitive cell. But unfortunately I've never used that part of ASE/spglib. $\endgroup$ Jul 11, 2021 at 23:24
Pymatgen can definitely do what you are asking for. You can find several algorithms under the pymatgen.symmetry.kpath
module here. I include a minimal example below using the new method from Munro et al. implemented in Pymatgen:
from pymatgen.core import Structure
from pymatgen.symmetry.kpath import KPathLatimerMunro
struc = Structure.from_file('myfilename.cif')
kpath = KPathLatimerMunro(struc)
kpts = kpath.get_kpoints()
Here are a couple of extra links that might be helpful in your (now 5months old) quest: [1], [2].
It would be helpful for all of us if you could put up that green chekmarck on the answers you found helpful and maybe tell us how you ended up resolving your issue, if you already have that is ...