berry_phase

sisl.physics.electron.berry_phase(contour, sub=None, eigvals=False, closed=True, method='berry', *, eigenstate_kwargs=None, ret_overlap=False)[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 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 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 [12]. 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”.

  • eigenstate_kwargs (dict, optional) – keyword arguments passed directly to the contour.eigenstate method. One should not pass k as that is already used.

  • ret_overlap (bool, optional) – optionally return the overlap matrix \(\mathbf S\)

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 pull request #131.

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 [8].

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]
>>> bz = BrillouinZone.param_circle(H, N, kR, normal, origin)
>>> phase = berry_phase(bz, sub=0)

Calculate the multi-band Berry-phase using the SVD method, thus ensuring removal of singular vectors.

>>> N = 30
>>> kR = 0.01
>>> normal = [0, 0, 1]
>>> origin = [1/3, 2/3, 0]
>>> bz = BrillouinZone.param_circle(H, N, kR, normal, origin)
>>> phase = berry_phase(bz, method="berry:svd")