PAOFLOW.utils.perturb_split#

Functions#

perturb_split(rot_op1, rot_op2, v_k, degen[, return_v_k])

Project two operators onto the Bloch eigenstate basis with degenerate-subspace diagonalisation.

Module Contents#

PAOFLOW.utils.perturb_split.perturb_split(rot_op1, rot_op2, v_k, degen, return_v_k=False)[source]#

Project two operators onto the Bloch eigenstate basis with degenerate-subspace diagonalisation.

Parameters:
  • rot_op1 (np.ndarray, shape (nawf, nawf)) – First operator matrix in the original PAO basis. The degenerate subspaces are diagonalised with respect to this operator.

  • rot_op2 (np.ndarray, shape (nawf, nawf)) – Second operator matrix in the original PAO basis. Projected using the eigenvectors obtained by diagonalising rot_op1.

  • v_k (np.ndarray, shape (nawf, bnd)) – Bloch eigenvector matrix at a single k-point (columns are eigenstates).

  • degen (list of array_like) – List of degenerate subspace index sets at this k-point. Each element is an array of indices corresponding to a degenerate manifold. An empty list indicates no degeneracies.

  • return_v_k (bool, optional) – If True, also return the modified eigenvector matrix after degenerate-subspace rotations. Default is False.

Returns:

  • op1 (np.ndarray, shape (nawf, nawf)) – rot_op1 projected onto the (modified) Bloch eigenstate basis.

  • op2 (np.ndarray, shape (nawf, nawf)) – rot_op2 projected onto the (modified) Bloch eigenstate basis.

  • v_k_temp (np.ndarray, shape (nawf, bnd)) – Modified eigenvector matrix (returned only when return_v_k=True).

Notes

When no degenerate subspaces are present (len(degen) == 0), the projection is a straightforward unitary transformation:

\[O = V^\dagger A V\]

where \(V\) = v_k and \(A\) is either operator.

For each degenerate manifold \(\mathcal{D}\) (indices ll to ul), the function diagonalises op1 restricted to that block:

\[\text{eigh}\left( O_1[\mathcal{D}, \mathcal{D}] \right) \rightarrow \text{eigenvalues},\; W_{\mathcal{D}}\]

and applies the rotation \(V_{\mathcal{D}} \leftarrow V_{\mathcal{D}} W_{\mathcal{D}}\) to lift the degeneracy. Both operators are then projected using the updated eigenvectors. This approach is used throughout PAOFLOW to obtain well-defined momentum and curvature matrix elements at degenerate k-points.