berry_phase

sisl.physics.electron.berry_phase(bz_loop, sub=None, eigvals=False, _gauge='r')[source]

Calculate the Berry-phase on a loop using a predefined path

The Berry phase for a single Bloch state is calculated using the discretized formula:

\[\phi = - \Im\ln \prod_i^{N-1} \mathrm{det} \langle \psi_{k_i} | \psi_{k_{i+1}} \rangle\]

where \(\langle \psi_{k_i} | \psi_{k_{i+1}} \rangle\) may be exchanged with an overlap matrix of the investigated bands.

Parameters:
bz_loop : BrillouinZone

containing the closed contour and has the bz_loop.parent as an instance of Hamiltonian. The first and last k-point must not be the same.

sub : None or list of int, optional

selected bands to calculate the Berry phase of

eigvals : bool, optional

return the eigenvalues of the product of the overlap matrices

Notes

The Brillouin zone object must contain a closed discretized contour without any double points. It is the users responsibility to assert this.

The implementation is very similar to PythTB and refer to the details outlined in PythTB for additional details.

This implementation does not work for band-crossings or degenerate states. It is thus important that eigenstates are corresponding to the same states for the loop contained in bz.

Examples

Calculate the multi-band Berry-phase

>>> N = 30
>>> kR = 0.01
>>> normal = [0, 0, 1]
>>> origo = [1/3, 2/3, 0]
>>> bz = BrillouinZone.param_circle(H, N, kR, normal, origo)
>>> phase = berry_phase(bz)

Calculate Berry-phase for first band

>>> N = 30
>>> kR = 0.01
>>> normal = [0, 0, 1]
>>> origo = [1/3, 2/3, 0]
>>> bz = BrillouinZone.param_circle(H, N, kR, normal, origo)
>>> phase = berry_phase(bz, sub=0)