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
contourBrillouinZone

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.

subNone or list of int, optional

selected bands to calculate the Berry phase of

eigvalsbool, optional

return the eigenvalues of the product of the overlap matrices

closedbool, 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)