berry_phase
- sisl.physics.electron.berry_phase(contour, sub=None, eigvals: bool = False, closed: bool = True, method='berry', *, ret_overlap: bool = False, eigenstate_kwargs=None, apply_kwargs=None)[source]
Calculate the Berry-phase on a loop path
The Berry phase for a single Bloch state is calculated using the discretized formula:
\[\begin{split}\mathbf S = \prod_\alpha^{N-1} \langle \psi_{\mathbf k_\alpha} | \psi_{\mathbf k_{\alpha+1}} \rangle \\ \phi = - \Im\ln \mathrm{det} \mathbf S\end{split}\]where \(\langle \psi_{\mathbf k_\alpha} | \psi_{\mathbf k_{\alpha+1}} \rangle\) may be exchanged with an overlap matrix of the investigated bands. I.e. \(\psi\) is a manifold set of wavefunctions. The overlap matrix \(\mathbf S\) is also known as the global unitary rotation matrix corresponding to the maximally localized Wannier centers.
If closed is true the overlap matrix will also include the circular inner product:
\[\mathbf S^{\mathcal C} = \mathbf S \langle \psi_{\mathbf k_N} | \psi_{\mathbf k_1} \rangle\]- Parameters:
contour (
BrillouinZone
) – containing the closed contour and has thecontour.parent
as an instance of Hamiltonian. The first and last k-point must not be the same.sub (
None
orlist
ofint
, optional) – selected bands to calculate the Berry phase ofeigvals – return the eigenvalues of the product of the overlap matrices
closed – whether or not to include the connection of the last and first points in the loop Forced true for Zak-phase calculations.
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, see [15]. Additionally, one may do the Berry-phase calculation using the SVD method of the overlap matrices. Simply append “:svd” to the chosen method, e.g. “berry:svd”.ret_overlap – optionally return the overlap matrix \(\mathbf S\)
eigenstate_kwargs (
dict
, optional) – keyword arguments passed directly to thecontour.eigenstate
method. One should not passk
as that is already used.eigenstate_kwargs (
dict
, optional) – keyword arguments passed directly to thecontour.eigenstate
method. One should not passk
as that is already used.apply_kwargs (
dict
, optional) – keyword arguments passed directly tocontour.apply(**apply_kwargs)
.
Notes
The Brillouin zone object need not contain a closed discretized contour by doubling the first point.
The implementation is very similar to PythTB, except we are here using the \(\mathbf R\) gauge (convention II according to PythTB), see discussion in PR131.
For systems with band-crossings or degenerate states there is an arbitrariness to the definition of the Berry phase for individual bands. However, the total phase (i.e., sum over filled bands) is invariant and unaffected by this arbitrariness as long as the filled and empty bands do not intersect, see [11].
For non-orthogonal basis sets it is not fully known how important the \(\delta\mathbf k\) spacing is since it relies on the Lowdin transformation of the states. However, one should be careful about choosing the correct bands for examination.
The returned angles are _not_ placed in the interval \(]-\pi;\pi]\) as what
numpy.angle
would do. This is to allow users to examine the quantities as is.For more understanding of the Berry-phase and its calculation [2] is a good reference.
Examples
Calculate Berry-phase for first band but using the SVD method
>>> N = 30 >>> kR = 0.01 >>> normal = [0, 0, 1] >>> origin = [1/3, 2/3, 0] >>> contour = BrillouinZone.param_circle(H, N, kR, normal, origin) >>> phase = berry_phase(contour, sub=0)
Calculate the multi-band Berry-phase using the SVD method, thus ensuring removal of singular vectors.
>>> phase = berry_phase(contour, method="berry:svd")