pythtb.TBModel.axion_angle#

TBModel.axion_angle(nks=(20, 20, 20), occ_idxs=None, return_second_chern=False, *, param_periods=None, diff_scheme='central', diff_order=4, use_tensorflow=False, **params)[source]#

Axion angle change via the second Chern form.

Computes the change in the axion angle for a 3D periodic model that depends on a single swept adiabatic parameter \(\lambda\). This is computed using the gauge-invariant 4-curvature formulation:

\[\theta(\lambda) - \theta(0) = \frac{1}{16\pi} \int_0^{\lambda} d\lambda' \int_{\text{BZ}} d^3k \, \epsilon^{\mu\nu\rho\sigma} \mathrm{Tr} \left[ \Omega_{\mu\nu}(\mathbf{k}, \lambda') \Omega_{\rho\sigma}(\mathbf{k}, \lambda') \right]\]

where \(\mu, \nu, \rho, \sigma\) run over the three reciprocal-space directions and the adiabatic parameter \(\lambda\), and \(\Omega_{\mu\nu}\) is the non-Abelian Berry curvature tensor over the occupied states.

When the parameter \(\lambda\) is cyclic (e.g., an angle variable), the change in \(\theta\) over one full cycle is quantized in units of \(2\pi\), with the integer multiple given by the second Chern number \(C_2\):

\[\Delta \theta = \theta(\lambda + P) - \theta(\lambda) = 2\pi C_2,\]

where \(P\) is the period of \(\lambda\).

Added in version 2.0.0.

Parameters:
nkstuple[int, int, int], optional

Number of reduced k-points along each reciprocal axis. All axes are treated as periodic and sampled uniformly in [0, 1).

occ_idxsarray_like, optional

Explicit list of occupied band indices. If omitted, all bands below the gap are used, consistent with other bulk invariants.

return_second_chernbool, optional

If True, return the second Chern number \(C_2\) alongside \(\theta(\lambda)\). This corresponds to the integer winding number of the axion angle over a full cycle of the adiabatic parameter.

param_periodsdict[str, float], optional

Optional map {param_name: period} for swept parameters. When supplied, assumes the parameter is cyclic and trims any duplicated endpoints, or endpoints equal to the start plus the given period, before building finite-difference stencils. This can improve numerical accuracy by using centered differences throughout the parameter range. Otherwise, the function will use a backward difference at the endpoint and a forward difference at the start.

diff_scheme{“central”, “forward”}, optional

Finite-difference stencil for the adiabatic derivative passed to berry_curvature(). Defaults to "central".

diff_orderint, optional

Order of the finite-difference scheme (must be even for "central" stencils).

use_tensorflowbool, optional

Forwarded to berry_curvature(); set True to accelerate large grids on GPU if TensorFlow is installed.

**params

Keyword arguments mapping parameter names to value(s). Exactly one parameter must be supplied with an array of values to sweep the adiabatic parameter \(\lambda\). All other parameters must be scalar-valued.

Returns:
lambdasnp.ndarray

The \(\lambda\) samples (including the closing point).

thetafloat

Axion angle \(\theta(\lambda)\) wrapped into \([0, 2\pi)\).

c2float, optional

Second Chern number. Only returned when return_second_chern=True.

See also

berry_curvature

Computes the Berry curvature tensor used in the integrand.

Axion angle of the Fu-Kane-Mele pump

Example notebook demonstrating axion angle calculation.

Notes

  • Requires a fully periodic three-dimensional model (dim_k == 3).

  • The adiabatic parameter sweep must be one-dimensional (exactly one parameter supplied with an array of values).

  • The k-grid is constructed uniformly in reduced coordinates over the full Brillouin zone.

  • The axion angle is computed using the gauge-invariant 4-curvature formulation, which doesn’t require fixing a smooth gauge like the Chern-Simons 3-form approach.

  • The plane indices use the combined coordinate ordering of k-space dimensions followed by swept parameters \([k_0, ..., k_{\text{dim_k}}, \lambda_0, \lambda_1, ...]\). For example, in a 2D model with one swept parameter, the valid plane indices are 0, 1, and 2, where 0 and 1 refer to the two k-space dimensions, and 2 refers to the swept parameter axis. Swept parameters are those provided as array-like values in **params. The order of swept parameters is determined by the order in which they appear in the **params keyword arguments.