# Automatic computation of k-point paths¶

AiiDA provides a number of tools and wrappers to automatically compute k-point paths given a cell or a crystal structure.

The main interface is provided by the two methods `aiida.tools.data.array.kpoints.get_kpoints_path()`

and `aiida.tools.data.array.kpoints.get_explicit_kpoints_path()`

.

These methods are also conveniently exported directly as, e.g., `aiida.tools.get_kpoints_path`

.

The difference between the two methods is the following:

`get_kpoints_path()`

returns a dictionary of k-point coordinates (e.g.`{'GAMMA': [0. ,0. ,0. ], 'X': [0.5, 0., 0.], 'L': [0.5, 0.5, 0.5]}`

, and then a list of tuples of endpoints of each segment, e.g.`[('GAMMA', 'X'), ('X', 'L'), ('L', 'GAMMA')]`

for the path.`get_explicit_kpoints_path()`

, instead, returns a list of kpoints that follow that path, with some predefined (but user-customizable) distance between points, e.g. something like`[[0., 0., 0.], [0.05, 0., 0.], [0.1, 0., 0.], ...]`

.

Depending on how the underlying code works, one method might be preferred on the other.

The docstring of the methods describes the expected parameters. The general interface requires always a StructureData
as the first parameter `structure`

, as well as a string for the method to use (by default this is
seekpath, but also the `legacy`

method implemented in earlier versions
of AiiDA is available; see description below).

Additional parameters are passed as `kwargs`

to the underlying implementation, that ofen accepts a different number
of parameters.

## Seekpath implementation¶

When specifying `method='seekpath'`

, the seekpath library is used
to generate the path. Note that this requires that `seekpath`

is installed (this is not available by default, in
order to reduce the dependencies of AiiDA core, but can be easily installed using `pip install seekpath`

).

For a full description of the accepted parameters, we refer to the docstring of the underlying methods
`aiida.tools.data.array.kpoints.seekpath.get_explicit_kpoints_path()`

and
`aiida.tools.data.array.kpoints.seekpath.get_kpoints_path()`

, and for more general information
to the seekpath documentation.

If you use this implementation, please cite the Hinuma paper:

```
Y. Hinuma, G. Pizzi, Y. Kumagai, F. Oba, I. Tanaka,
Band structure diagram paths based on crystallography,
Comp. Mat. Sci. 128, 140 (2017)
DOI: 10.1016/j.commatsci.2016.10.015
```

## Legacy implementation¶

This refers to the implementation that has been available since the early versions of AiiDA.

Note

In the 3D case (all three directions have periodic boundary conditions), this implementation expects that the structure is already standardized according to the Setyawan paper. If this is not the case, the kpoints and band structure returned will be incorrect. The only case that is dealt correctly by the library is the case when axes are swapped, where the library correctly takes this swapping/rotation into account to assign kpoint labels and coordinates.

We therefore suggest that you use the seekpath implementation, that is able to automatically correctly identify the standardized crystal structure (primitive and conventional) as described in the Hinuma paper.

For a full description of the accepted parameters, we refer to the docstring of the underlying methods
`aiida.tools.data.array.kpoints.legacy.get_explicit_kpoints_path()`

and
`aiida.tools.data.array.kpoints.legacy.get_kpoints_path()`

, and for more general information
to the seekpath documentation.

If you use this implementation, please cite the correct reference from the following ones:

The 3D implementation is based on the Setyawan paper:

W. Setyawan, S. Curtarolo, High-throughput electronic band structure calculations: Challenges and tools, Comp. Mat. Sci. 49, 299 (2010) DOI: 10.1016/j.commatsci.2010.05.010

The 2D implementation is based on the Ramirez paper:

R. Ramirez and M. C. Bohm, Simple geometric generation of special points in brillouin-zone integrations. Two-dimensional bravais lattices Int. J. Quant. Chem., XXX, 391-411 (1986) DOI: 10.1002/qua.560300306

### Deprecated methods¶

Originally, the `legacy`

implementation was implemented directly into the
`KpointsData`

class.

In order to implement more than one method, and
to simplify the `KpointsData`

class,
and to decouple the underlying logic from AiiDA, we have deprecated those methods, factored out the logic into
the legacy module. The methods are currently still available
but will be removed in future versions of AiiDA; plese use directly the wrappers
`aiida.tools.data.array.kpoints.get_kpoints_path()`

and `aiida.tools.data.array.kpoints.get_explicit_kpoints_path()`

instead, passing as option `method='legacy'`

.

The list of deprecated methods include:

`bravais_lattice()`

`_get_or_create_bravais_lattice()`

`set_kpoints_path()`

`_find_bravais_info()`

`find_bravais_lattice()`

`get_special_points()`