berry_phase

sisl.physics.electron.berry_phase(contour, sub=None, eigvals=False, closed=True, method='berry')[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 \mathrm{det} \prod_i^{N-1} \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
  • contour (BrillouinZone) – containing the closed contour and has the contour.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

  • closed (bool, optional) – whether or not to include the connection of the last and first points in the loop

  • method ({'berry', 'zak'}) – ‘berry’ will return the usual integral of the Berry connection over the specified contour ‘zak’ will compute the Zak phase for 1D systems by performing a closed loop integration but taking into account the Bloch factor \(e^{-i2\pi/a x}\) accumulated over a Brillouin zone, see J. Zak, “Berry’s phase for energy bands in solids” PRL 62, 2747 (1989).

Notes

The Brillouin zone object need not contain a closed discretized contour by doubling the first point.

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)