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)