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]#
Chern-Simons axion angle.
Computes the Chern-Simons contribution to the axion angle for a 3D bulk model that depends on a single adiabatic parameter \(\lambda\). This is computed using the gauge-invariant 4-curvature formulation:
\[\theta(\lambda) = \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 periodic (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(); setTrueto 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_curvatureComputes the Berry curvature tensor used in the integrand.
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 is numerically more stable than the Chern-Simons 3-form approach.