PAOFLOW.spectrum.do_band_curvature#

Functions#

do_band_curvature(data_controller)

Compute the full band curvature (inverse effective mass) tensor \(d^2E/dk_i dk_j\).

Module Contents#

PAOFLOW.spectrum.do_band_curvature.do_band_curvature(data_controller)[source]#

Compute the full band curvature (inverse effective mass) tensor \(d^2E/dk_i dk_j\).

Parameters:

data_controller (DataController) – Object providing data_arrays and data_attributes. Required arrays: Hksp, Rfft, E_k, dHksp, v_k, degen. Required attributes: bnd, nawf, alat, npool.

Returns:

Adds the following key to data_controller.data_arrays:

  • d2Ed2k : np.ndarray, shape (6, nkpnts, bnd, nspin) — the six unique components of the curvature tensor (in units of \(\hbar^2 / (\text{eV} \cdot \text{Bohr}^2)\)). Component ordering: xx, yy, zz, xy, xz, yz.

Return type:

None

Notes

The curvature tensor is computed in two steps.

First, the diagonal matrix elements of \(d^2H/dk_i dk_j\) in the Bloch eigenstate basis are obtained by calling do_d2Hd2k_ij().

Second, the second-order energy correction due to off-diagonal (inter-band) coupling is added via second-order perturbation theory:

\[\frac{d^2 E_n}{dk_i dk_j} = \langle n | \partial^2_{k_i k_j} H | n \rangle + \sum_{m \neq n} \frac{\langle n | \partial_{k_i} H | m \rangle \langle m | \partial_{k_j} H | n \rangle + (i \leftrightarrow j)} {E_n - E_m}\]

Degenerate subspaces are handled by perturb_split() and the modified eigenvector set returned in dvec_list is reused here. Pairs with \(|E_n - E_m| < 10^{-5}\) eV are excluded to avoid numerical divergences.