Skip to main content

Module response

Module response 

Source
Expand description

§Response functions via simplex quadrature

This module provides the full set of linear, nonlinear, and optical response functions for tight‑binding models. Both direct k‑mesh summation and simplex quadrature paths are available for most quantities.

§Theoretical background

§Velocity operator

The velocity operator in direction $\alpha$ is

$$v_\alpha(\mathbf{k}) = \frac{\partial H(\mathbf{k})}{\partial k_\alpha}$$

In the band eigenbasis ${|\psi_{n\mathbf{k}}\rangle}$, its matrix elements are

$$v^\alpha_{nm}(\mathbf{k}) = \langle\psi_{n\mathbf{k}}| \partial_\alpha H(\mathbf{k}) |\psi_{m\mathbf{k}}\rangle$$

Diagonal elements $v^\alpha_{nn} = \partial E_n/\partial k_\alpha$ give the band velocity; off‑diagonal elements enter response formulas.

§Gauge‑invariant velocity kernel

Individual matrix elements $v^\alpha_{nm}$ are not smooth across the Brillouin zone because eigenstates carry arbitrary U(1) phases. The product

$$K^{ab}{nm}(\mathbf{k}) \equiv v^a{nm}(\mathbf{k})v^b_{mn}(\mathbf{k})$$

is invariant under independent phase rotations of bands $n$ and $m$ (when the bands are isolated), making it safe to interpolate inside each simplex.

§Simplex quadrature (vs. old Blochl method)

The simplex path interpolates the gauge‑invariant primitives $K_{nm}(\mathbf{k})$ and $E_n(\mathbf{k})$ linearly inside each simplex (triangle in 2D, tetrahedron in 3D), then evaluates the singular denominator at symmetric quadrature points:

$$\int_{\text{simplex}} f(K(\mathbf{k}), E(\mathbf{k}))d\mathbf{k} \approx V_{\text{simplex}} \sum_q w_qf(K(\mathbf{k}_q), E(\mathbf{k}_q))$$

This correctly preserves the $1/(E_n-E_m)^p$ singularity structure near small gaps, unlike the old Blochl method which linearly interpolated the final scalar integrand at simplex vertices.

§Band tracking

Interpolating $K_{nm}$ requires consistent band labels across simplex vertices. Energy ordering fails near crossings. We use eigenvector overlap maximisation: for each vertex $r$, find the permutation $P_r$ maximising $\sum_n |\langle u_n(\text{ref})|u_{P_r(n)}(r)\rangle|^2$.

§Sub‑modules

ModuleQuantityFormula
linearBerry curvature $\Omega^{ab}$, quantum metric $g^{ab}$$\sum_n \int \Omega_n^{ab}d\mathbf{k}$
nonlinearBerry dipole $D^{ab;c}$, intrinsic/extrinsic NLH$\sum_n \int (-\partial f/\partial E_n) v^c_n \Omega_n^{ab}d\mathbf{k}$
opticalOptical conductivity $\sigma^{ab}(\omega)$$\sum_{n=\not m} \int \frac{(f_n-f_m)K^{ab}_{nm}}{(E_n-E_m)^2-(\omega+i\eta)^2}d\mathbf{k}$
energy cut2D Berry dipole line cuts$\int A_n(k)\delta(E_n-\mu)d^2k$ with finite-T convolution
traitsBerryCurvature trait (per‑k‑point Berry curvature)

§Quick start

use ndarray::Array1;
use Rustb::*;

let chemical_potentials = Array1::linspace(-1.0, 1.0, 201);

let mut hall = Parameters::rank2([101, 101], [1.0, 0.0], [0.0, 1.0], chemical_potentials)
    .with_temperature(20.0);
hall.integration = Integration::EnergyCut;
let hall_result = model.hall_conductivity(&hall)?;

let mut optical = Parameters::rank2([101, 101], [1.0, 0.0], [0.0, 1.0], Array1::zeros(1))
    .with_frequency(0.0);
optical.omega = Array1::linspace(0.0, 4.0, 401);
optical.integration = Integration::Simplex;
let optical_result = model.optical_conductivity(&optical)?;

Re-exports§

pub use config::FieldSymmetry;
pub use config::Integration;
pub use config::IntegrationDiagnostics;
pub use config::Parameters;
pub use linear::HallConductivityResult;
pub use nonlinear::NonlinearHallResult;
pub use optical::OpticalConductivityResult;
pub use traits::BandBerryCurvature;
pub use traits::BerryCurvature;

Modules§

config
Shared configuration types for response calculations.
linear
Linear response: Berry curvature and quantum metric
nonlinear
Nonlinear response: Berry dipole, intrinsic & extrinsic NLH
optical
Optical conductivity from gauge-invariant velocity kernels.
traits
Reusable band-resolved Berry-curvature interface.