pythtb.WFArray.chern_number#

WFArray.chern_number(plane=(0, 1), state_idx=None)[source]#

Computes the Chern number in the specified plane.

The Chern number is computed as the integral of the Berry flux over the specified plane, divided by \(2 \pi\).

\[C = \frac{1}{2\pi} \sum_{\mathbf{k}_{\mu}, \mathbf{k}_{\nu}} F_{\mu\nu}(\mathbf{k}).\]

The plane \((\mu, \nu)\) is specified by plane, a tuple of two indices.

Added in version 2.0.0.

Parameters:
planetuple

A tuple of two indices specifying the plane in which the Chern number is computed. The indices should be between 0 and the number of mesh dimensions minus 1. If None, the Chern number is computed for the first two dimensions of the mesh.

state_idxarray-like, optional array

Indices of states to be included in the Chern number calculation. If None, all states are included. None by default.

Returns:
chernnp.ndarray, float

In the two-dimensional case, the result will be a floating point approximation of the integer Chern number for that plane. In a higher-dimensional space, the Chern number is computed for each 2D slice of the higher-dimensional space. E.g., the shape of the returned array is (nk3, …, nkd) if the plane is (0, 1), where (nk3, …, nkd) are the sizes of the mesh in the remaining dimensions.

See also

berry_flux()

For details and formalism on the Berry flux tensor.

Notes

  • The Chern number gives an integer value in the limit of an infinitely dense mesh only when the plane forms a closed manifold.

  • The 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 Chern number array to avoid overcounting, since it is equivalent to the first point.

Examples

Suppose we have a WFArray mesh in three-dimensional space of shape (nk1, nk2, nk3). We can compute the Chern number for the (0, 1) plane as follows:

>>> wfs = WFArray(model, [10, 11, 12])
>>> wfs.solve_on_grid()
>>> chern = wfs.chern_number(plane=(0, 1), state_idx=np.arange(n_occ))
>>> print(chern.shape)
(12,)  # shape of the Chern number array