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)