shc

sisl.physics.electron.shc(bz: BrillouinZone, k_average: bool = True, sigma: CartesianAxisStrLiteral | npt.ArrayLike = 'z', *, J_axes: CartesianAxisStrLiteral | Sequence[CartesianAxisStrLiteral] = 'xyz', distribution: _TDist = 'step', eigenstate_kwargs={}, apply_kwargs={}, **berry_kwargs) np.ndarray[source]

Electronic spin Hall conductivity for a given BrillouinZone integral

\[\sigma^\gamma_{\alpha\beta} = \frac{-e^2}{\hbar}\int\,\mathrm d\mathbf k \sum_i f_i\boldsymbol\Omega^\gamma_{i,\alpha\beta}(\mathbf k)\]

where \(\boldsymbol\Omega^\gamma_{i,\alpha\beta}\) and \(f_i\) are the spin Berry curvature and occupation for state \(i\).

The conductivity will be averaged by volume of the periodic unit cell. See Lattice.volumef for details.

See [9] and [4] for details on the implementation.

Parameters:
  • bz – containing the integration grid and has the bz.parent as an instance of Hamiltonian.

  • k_average – if True, the returned quantity is averaged over bz, else all k-point contributions will be collected. Note, for large bz integrations this may explode the memory usage.

  • sigma – which Pauli matrix is used, alternatively one can pass a custom spin matrix, or the full sigma.

  • J_axes – the direction(s) where the \(J\) operator will be applied (defaults to all).

  • distribution – An optional distribution enabling one to automatically sum states across occupied/unoccupied states. Defaults to the step function.

  • eigenstate_kwargs – keyword arguments passed directly to the bz.eigenstate method. One should not pass a k or a wrap keyword argument as they are already used.

  • apply_kwargs – keyword arguments passed directly to bz.apply(**apply_kwargs).

  • **berry_kwargs (dict, optional) – arguments passed directly to the berry_curvature method.

    Here one can pass derivative_kwargs to pass flags to the derivative method. In particular axes can be used to speedup the calculation (by omitting certain directions).

Examples

For instance, sigma = 'x', J_axes = 'y' will result in \(J^{\sigma^x}_y=\dfrac12\{\hat{\sigma}^x, \hat{v}_y\}\), and the rest will be the AHC.

>>> cond = shc(bz, J_axes="y")
>>> shc_y_xyz = cond[1]
>>> ahc_xz_xyz = cond[[0, 2]]

Passing an explicit \(\sigma\) matrix is also allowed:

>>> cond = shc(bz)
>>> assert np.allclose(cond, shc(bz, sigma=Spin.Z))

For further examples, please see ahc which is equivalent to this method.

Notes

Original implementation by Armando Pezo.

See also

derivative

method for calculating the exact derivatives

berry_curvature

the actual method used internally

spin_berry_curvature

method used to calculate the Berry-flux for calculating the spin conductivity

Lattice.volumef

volume calculation of the primary unit cell.

ahc

anomalous Hall conductivity, this is the equivalent method for the SHC.

Returns:

shc (numpy.ndarray) – Spin Hall conductivity returned in certain dimensions shc[J_axes, :]. Anomalous Hall conductivity returned in the remaining dimensions shc[!J_axes, :]. If sum is False, it will be at least a 3D array with the 3rd dimension having the contribution from state i. If k_average is False, it will have a dimension prepended with k-point resolved AHC/SHC. If one passes axes to the derivative_kwargs argument one will get dimensions according to the number of axes requested, by default all axes will be used (even if they are non-periodic). The dtype will be imaginary. When \(D\) is the dimensionality we find the unit to be

  • AHC: shc[!J_axes, :] \(S/\mathrm{Ang}^{D-2}\).

  • SHC: shc[J_axes, :] \(\hbar/e S/\mathrm{Ang}^{D-2}\).