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(); 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.
- 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, and2, where0and1refer to the two k-space dimensions, and2refers 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**paramskeyword arguments.