PAOFLOW.hamiltonian.do_spin_orbit#

Functions#

build_generic_soc(theta, phi, shells_list, norb[, ...])

Build per-l SOC contributions for an arbitrary shells layout.

do_spin_orbit_H(data_controller)

Construct the tight-binding spin-orbit Hamiltonian in real space.

soc_p_ps(theta, phi, norb)

Build the p-orbital spin-orbit coupling matrix for the PS pseudopotential type.

soc_p_sp(theta, phi, norb)

Build the p-orbital spin-orbit coupling matrix for the SP pseudopotential type.

soc_p_spd(theta, phi, norb)

Build the p-orbital spin-orbit coupling matrix for the SPD pseudopotential type.

soc_d_spd(theta, phi, norb)

Build the d-orbital spin-orbit coupling matrix for the SPD pseudopotential type.

soc_p_sspd(theta, phi, norb)

Build the p-orbital spin-orbit coupling matrix for the SSPD pseudopotential type.

soc_d_sspd(theta, phi, norb)

Build the d-orbital spin-orbit coupling matrix for the SSPD pseudopotential type.

soc_p_spds(theta, phi, norb)

p-orbital SOC matrix for the SPDS layout (s, p, d, s_semicore).

soc_d_spds(theta, phi, norb)

d-orbital SOC matrix for the SPDS layout (d at indices 4..8).

soc_p_ssppd(theta, phi, norb)

Build the p-orbital spin-orbit coupling matrix for the SSPPD pseudopotential type.

soc_d_ssppd(theta, phi, norb)

Build the d-orbital spin-orbit coupling matrix for the SSPPD pseudopotential type.

Module Contents#

PAOFLOW.hamiltonian.do_spin_orbit.build_generic_soc(theta, phi, shells_list, norb, active_shells=None)[source]#

Build per-l SOC contributions for an arbitrary shells layout.

Parameters:
  • theta (float) – Quantisation-axis angles (radians).

  • phi (float) – Quantisation-axis angles (radians).

  • shells_list (sequence of int) – Per-shell angular momenta in the order they appear in the atom’s orbital basis (e.g. [0, 1, 2] for spd, [0, 1, 2, 0] for spds, [0, 1, 2, 0, 0, 0, 1, 1, 1, 2, 2] for an extended Pt basis).

  • norb (int) – Total number of orbitals per atom (must equal sum(2l+1)).

  • active_shells (sequence of bool or float, optional) – Per-shell weight applied to the SOC kernel of each shell. Booleans are interpreted as 0/1. None (default) uses a hydrogenic-style 1/k**2 falloff over the occurrence index of each l > 0 channel: the valence shell (k=1) gets weight 1, the first augmentation (k=2) gets 0.25, the second (k=3) gets ~0.111, etc. l=0 shells always get 0.

Returns:

(HR_soc_p, HR_soc_d) – SOC blocks restricted to l=1 and l=2 shells respectively. Caller weights them by lambda_p and lambda_d.

Return type:

tuple of two (2*norb, 2*norb) complex arrays

Notes

The per-element lambda_p / lambda_d are fit (or read from tables) for the valence p/d shell. Applying the same lambda to every shell of the same l in an extended/augmented basis triple-counts SOC on unoccupied polarisation channels and corrupts response functions (e.g. spin Hall conductivity). Conversely, zeroing the augmentation shells entirely under-broadens the conduction-side response. The default 1/k**2 heuristic is a compromise that preserves the valence kernel exactly (matching the hardcoded minimal-basis kernels soc_p_spd, soc_p_spds, …) while leaving a small residual weight on the augmentation channels. Pass an explicit active_shells (bool or float per shell) to override.

PAOFLOW.hamiltonian.do_spin_orbit.do_spin_orbit_H(data_controller)[source]#

Construct the tight-binding spin-orbit Hamiltonian in real space.

Follows the formalism of Abate and Asdente, Phys. Rev. 140, A1303 (1965).

Parameters:

data_controller (DataController) – Object providing data_arrays and data_attributes. Required arrays: HRs (shape (nawf, nawf, nk1, nk2, nk3, nspin)), naw, orb_pseudo, lambda_p, lambda_d. Required attributes: natoms, theta, phi.

Returns:

Modifies data_arrays in place:

  • HRs : replaced by the spin-orbit-coupled Hamiltonian of shape (2*nawf, 2*nawf, nk1, nk2, nk3, 1).

  • naw : extended by appending a copy of itself.

Updates data_attributes:

  • nawf : set to 2 * nawf.

Return type:

None

Notes

For a non-magnetic system the spin-degenerate block is \(H_{\uparrow\uparrow} = H_{\downarrow\downarrow} = H_0\). For a magnetic system the two spin channels are taken from the two spin components of HRs. The SOC term is added only at the \(\mathbf{R}=(0,0,0)\) site; p- and d-channel couplings are weighted by lambda_p and lambda_d, respectively.

PAOFLOW.hamiltonian.do_spin_orbit.soc_p_ps(theta, phi, norb)[source]#

Build the p-orbital spin-orbit coupling matrix for the PS pseudopotential type.

Parameters:
  • theta (float) – Polar angle (radians) of the quantisation axis.

  • phi (float) – Azimuthal angle (radians) of the quantisation axis.

  • norb (int) – Total number of orbitals per atom (spin-up block size).

Returns:

Spin-orbit coupling matrix in the \(|\uparrow\rangle \oplus |\downarrow\rangle\) basis. The p-state block occupies indices 0–2 (up) and norbnorb+2 (down).

Return type:

np.ndarray, shape (2*norb, 2*norb), complex

PAOFLOW.hamiltonian.do_spin_orbit.soc_p_sp(theta, phi, norb)[source]#

Build the p-orbital spin-orbit coupling matrix for the SP pseudopotential type.

Parameters:
  • theta (float) – Polar angle (radians) of the quantisation axis.

  • phi (float) – Azimuthal angle (radians) of the quantisation axis.

  • norb (int) – Total number of orbitals per atom (spin-up block size).

Returns:

Spin-orbit coupling matrix; the p-state block occupies indices 1–3 (s precedes p in the SP basis).

Return type:

np.ndarray, shape (2*norb, 2*norb), complex

PAOFLOW.hamiltonian.do_spin_orbit.soc_p_spd(theta, phi, norb)[source]#

Build the p-orbital spin-orbit coupling matrix for the SPD pseudopotential type.

Parameters:
  • theta (float) – Polar angle (radians) of the quantisation axis.

  • phi (float) – Azimuthal angle (radians) of the quantisation axis.

  • norb (int) – Total number of orbitals per atom (spin-up block size).

Returns:

p-channel spin-orbit coupling matrix in the SPD orbital ordering.

Return type:

np.ndarray, shape (2*norb, 2*norb), complex

PAOFLOW.hamiltonian.do_spin_orbit.soc_d_spd(theta, phi, norb)[source]#

Build the d-orbital spin-orbit coupling matrix for the SPD pseudopotential type.

Parameters:
  • theta (float) – Polar angle (radians) of the quantisation axis.

  • phi (float) – Azimuthal angle (radians) of the quantisation axis.

  • norb (int) – Total number of orbitals per atom (spin-up block size).

Returns:

d-channel spin-orbit coupling matrix in the SPD orbital ordering (d-states occupy indices 4–8).

Return type:

np.ndarray, shape (2*norb, 2*norb), complex

PAOFLOW.hamiltonian.do_spin_orbit.soc_p_sspd(theta, phi, norb)[source]#

Build the p-orbital spin-orbit coupling matrix for the SSPD pseudopotential type.

Parameters:
  • theta (float) – Polar angle (radians) of the quantisation axis.

  • phi (float) – Azimuthal angle (radians) of the quantisation axis.

  • norb (int) – Total number of orbitals per atom (spin-up block size).

Returns:

p-channel spin-orbit coupling matrix in the SSPD orbital ordering (p-states occupy indices 2–4).

Return type:

np.ndarray, shape (2*norb, 2*norb), complex

Notes

Orbital layout is hardcoded to the s, s*, p, d basis.

PAOFLOW.hamiltonian.do_spin_orbit.soc_d_sspd(theta, phi, norb)[source]#

Build the d-orbital spin-orbit coupling matrix for the SSPD pseudopotential type.

Parameters:
  • theta (float) – Polar angle (radians) of the quantisation axis.

  • phi (float) – Azimuthal angle (radians) of the quantisation axis.

  • norb (int) – Total number of orbitals per atom (spin-up block size).

Returns:

d-channel spin-orbit coupling matrix in the SSPD orbital ordering (d-states occupy indices 5–9).

Return type:

np.ndarray, shape (2*norb, 2*norb), complex

Notes

Orbital layout is hardcoded to the s, s*, p, d basis.

PAOFLOW.hamiltonian.do_spin_orbit.soc_p_spds(theta, phi, norb)[source]#

p-orbital SOC matrix for the SPDS layout (s, p, d, s_semicore).

Identical to soc_p_spd() except the down-spin block offset is parametrised on norb (=10 here) instead of the hard-coded 9. The trailing semicore-s orbital at index 9 is left untouched (the SOC operator vanishes on l=0).

PAOFLOW.hamiltonian.do_spin_orbit.soc_d_spds(theta, phi, norb)[source]#

d-orbital SOC matrix for the SPDS layout (d at indices 4..8).

PAOFLOW.hamiltonian.do_spin_orbit.soc_p_ssppd(theta, phi, norb)[source]#

Build the p-orbital spin-orbit coupling matrix for the SSPPD pseudopotential type.

Parameters:
  • theta (float) – Polar angle (radians) of the quantisation axis.

  • phi (float) – Azimuthal angle (radians) of the quantisation axis.

  • norb (int) – Total number of orbitals per atom (spin-up block size).

Returns:

p-channel spin-orbit coupling matrix in the SSPPD orbital ordering (p-states occupy indices 5–7).

Return type:

np.ndarray, shape (2*norb, 2*norb), complex

PAOFLOW.hamiltonian.do_spin_orbit.soc_d_ssppd(theta, phi, norb)[source]#

Build the d-orbital spin-orbit coupling matrix for the SSPPD pseudopotential type.

Parameters:
  • theta (float) – Polar angle (radians) of the quantisation axis.

  • phi (float) – Azimuthal angle (radians) of the quantisation axis.

  • norb (int) – Total number of orbitals per atom (spin-up block size).

Returns:

d-channel spin-orbit coupling matrix in the SSPPD orbital ordering.

Return type:

np.ndarray, shape (2*norb, 2*norb), complex