pythtb.WFArray.berry_flux#

WFArray.berry_flux(plane=None, state_idx=None, non_abelian=False, *, use_tensorflow=False)[source]#

Berry flux tensor using the Fukui-Hatsugai-Suzuki plaquette method.

The Berry flux tensor \(\mathcal{F}_{\mu\nu}(\boldsymbol{\kappa})\) on a reduced mesh point \(\boldsymbol{\kappa}\) is evaluated by forming the ordered product of parallel-transport link unitaries around an elementary plaquette in directions \((\mu,\nu)\) [1]:

\[\mathcal{F}_{\mu\nu}(\boldsymbol{\kappa}) = -\,\operatorname{Im}\, \ln\!\Big[ U_{\mu}(\boldsymbol{\kappa})\, U_{\nu}(\boldsymbol{\kappa}+\hat{\mu})\, U_{\mu}^{\dagger}(\boldsymbol{\kappa}+\hat{\nu})\, U_{\nu}^{\dagger}(\boldsymbol{\kappa}) \Big],\]

where \(U_{\mu}(\boldsymbol{\kappa})\) is the unitary link obtained from the overlap between states at \(\boldsymbol{\kappa}\) and its forward neighbor along direction \(\mu\) (see links()). When a multiband subspace is supplied, this expression yields the non-Abelian matrix-valued flux; taking the matrix determinant gives the usual Abelian (band-traced) flux.

Removed in version 2.0.0: The individual_phases parameter has been removed.

Parameters:
plane(2,) array_like, optional

Array or tuple of two mesh-axis indices over which the flux is computed. By default, all index pairs are evaluated.

Changed in version 2.0.0: Renamed from dirs.

state_idxint or array_like of int, optional

Indices of the states spanning the subspace. If None, all states are used.

Changed in version 2.0.0: Renamed from occ. The band indices are not required to be occupied bands only. The default behavior is to include all bands, and the "all" option has been removed.

non_abelianbool, optional

If True, return the matrix-valued non-Abelian flux. If False (default), return the Abelian (band-traced) flux.

Added in version 2.0.0.

use_tensorflowbool, optional

If True, use TensorFlow for speedup on large calculations. Default is False.

Returns:
fluxndarray

The Berry flux tensor, which is an array of shape

  • non_abelian=True, plane=None: (naxes, naxes, *mesh_shape, nstates, nstates),

  • non_abelian=True, plane=(mu, nu): (*mesh_shape, nstates, nstates),

  • non_abelian=False, plane=None: (naxes, naxes, *mesh_shape),

  • non_abelian=False, plane=(mu, nu): (*mesh_shape,),

where nstates = len(state_idx) (or WFArray.nstates if state_idx=None).

Notes

  • For a given \((\mathbf{k}, \boldsymbol{\lambda})\)-point \(\boldsymbol{\kappa}\) and pair of mesh directions \((\mu, \nu)\), the plaquette is formed by the points:

    \[\begin{split}\begin{pmatrix} \boldsymbol{\kappa} \\ \boldsymbol{\kappa} + \hat{\mu} \\ \boldsymbol{\kappa} + \hat{\mu} + \hat{\nu} \\ \boldsymbol{\kappa} + \hat{\nu} \end{pmatrix}\end{split}\]

    where \(\hat{\mu}\) and \(\hat{\nu}\) are the vectors connecting neighboring points along directions \(\mu\) and \(\nu\) in the reduced mesh.

  • Let \(U_{\mu}(\boldsymbol{\kappa})\) denote the unitary link matrix (unitary part of overlap matrix between states) from \(\boldsymbol{\kappa}\) to \(\boldsymbol{\kappa} + \hat{\mu}\):

    \[U_{\mu}(\boldsymbol{\kappa}) \equiv \mathcal{U} \,\Big[ M_\mu (\boldsymbol{\kappa}) \Big]\]

    where \(\mathcal{U}\) denotes the unitary part of (polar decomposition, see links()), and \(M_\mu (\boldsymbol{\kappa})_{mn} = \langle u_{m}(\boldsymbol{\kappa}) \,|\, u_{n}(\boldsymbol{\kappa} + \hat{\mu}) \rangle\) is the overlap matrix of the states in the subspace defined by state_idx.

    When non_abelian=True, the (non-Abelian) Berry flux tensor is computed by taking the imaginary part of the matrix logarithm of the product of the link matrices around the plaquettes. It is defined as,

    \[\mathcal{F}_{\mu\nu}(\boldsymbol{\kappa}) = -\mathrm{Im} \,\ln \Big[ U_{\mu}(\boldsymbol{\kappa}) \; U_{\nu}(\boldsymbol{\kappa} + \hat{\mu}) \; U_{\mu}^\dagger(\boldsymbol{\kappa} + \hat{\nu}) \; U_{\nu}^\dagger(\boldsymbol{\kappa}) \Big].\]

    This definition holds for multi-band subspaces, where the link matrices are square and unitary in the occupied-band space.

    When non_abelian=False, the (Abelian) Berry flux tensor is computed by taking the imaginary part of the logarithm of the determinant of the product of the link matrices around the plaquettes. This is equivalently the band-trace of the non-Abelian Berry flux tensor. It is defined as,

    \[\mathcal{F}_{\mu\nu}(\boldsymbol{\kappa}) = -\mathrm{Im} \,\ln \,\det \Big[ U_{\mu}(\boldsymbol{\kappa}) U_{\nu}(\boldsymbol{\kappa} + \hat{\mu}) U_{\mu}^{\dagger}(\boldsymbol{\kappa} + \hat{\nu}) U_{\nu}^{\dagger}(\boldsymbol{\kappa}) \Big].\]
  • This method requires at least a two-dimensional mesh in the combined adiabatic space (momentum + adiabatic parameters). Thus, WFArray.naxes >= 2.

  • The last point along closed or non-periodic axes is trimmed from the flux array to avoid overcounting, since it is equivalent to the first point.

References

[1]

T. Fukui, Y. Hatsugai, and H. Suzuki, J. Phys. Soc. Jpn. 74, 1674 (2005).

Examples

Consider the case where we have a mesh with naxes axes in the combined adiabatic space (momentum + adiabatic parameters). The Berry flux can be computed over all 2D planes of the mesh,

>>> flux = wf.berry_flux(
... state_idx = [0, 1, 2]
... ) # shape: (naxes, naxes, *mesh_shape) 

or over a specific plane,

>>> flux = wf.berry_flux(
... plane = (0, 1), 
... state_idx = [0, 1, 2]
... ) # shape: (*mesh_shape)

We can also compute the non-Abelian Berry flux tensor over a specific plane:

>>> flux = wf.berry_flux(
... plane = (0,1), 
... state_idx = [0, 1, 2], 
... non_abelian = True
... ) # shape: (*mesh_shape, nstates, nstates)