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)(orWFArray.nstatesifstate_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 bystate_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
naxesaxes 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)