Skip to content

[wien2k] rotate the symmetry matrices into the local solver frame (dft_tools#148)#18

Draft
krystophny wants to merge 1 commit into
TRIQS:unstablefrom
krystophny:fix/dmftproj-soc-symmetrize
Draft

[wien2k] rotate the symmetry matrices into the local solver frame (dft_tools#148)#18
krystophny wants to merge 1 commit into
TRIQS:unstablefrom
krystophny:fix/dmftproj-soc-symmetrize

Conversation

@krystophny

Copy link
Copy Markdown

Fixes the spin-orbit symmetrization error in TRIQS/dft_tools#148. Independent of the dmftproj Python port, so it can be reviewed and merged on its own.

case.symqmc / case.sympar store the symmetry representation matrices that relate equivalent atoms in the global frame. Symmetry.symmetrize, however, is applied to the impurity quantity in the rot_mat-equalized local solver frame (the frame eff_atomic_levels returns). The two coincide only when rot_mat is trivial, i.e. for centrosymmetric cells, so the existing centrosymmetric tests never exposed it; for a non-centrosymmetric cell the symmetrization is wrong and shifts the local-Hamiltonian eigenvalues.

convert_symmetry_input now rotates each matrix into the local frame, rot_mat[j]^dag . mat . rot_mat[i], where j is the atom i maps to under the operation (rot_mat[i] conjugated for a time-inversion operation, matching the conjugation symmetrize applies). It uses rot_mat for case.symqmc and rot_mat_all for case.sympar. Centrosymmetric output is unchanged because rot_mat is trivial there.

Verification

Non-centrosymmetric SP+SO case, tellurium (P3_1 21, no inversion, full BZ): symmetrizing the already-symmetric full-BZ local Hamiltonian must be a no-op (zero eigenvalue shift).

Before (unstable):

WORST eigenvalue shift = 1.302e-01   REPRODUCED (#148)

After (this branch):

symmetrize drift = 2.483e-08

Centrosymmetric CaOs2 (no regression): 1.998e-15 before, 2.887e-15 after.

Fixes the spin-orbit symmetrization error reported in TRIQS/dft_tools#148.

case.symqmc / case.sympar store the symmetry representation matrices that relate
equivalent atoms in the global frame. Symmetry.symmetrize, however, is applied to
the impurity quantity in the rot_mat-equalized local solver frame (the frame
eff_atomic_levels returns). The two agree only when rot_mat is trivial, i.e. for
centrosymmetric cells, so the bug stayed hidden; for a non-centrosymmetric cell
the symmetrization is wrong and shifts the local-Hamiltonian eigenvalues.

convert_symmetry_input now rotates each matrix into the local frame,
rot_mat[j]^dag . mat . rot_mat[i] with j the atom i maps to under the operation
(rot_mat[i] conjugated for a time-inversion operation, matching the conjugation
symmetrize applies). rot_mat is the correlated-shell rotation for case.symqmc and
rot_mat_all for case.sympar.

Verified on a non-centrosymmetric SP+SO case (tellurium, P3_1 21): the
symmetrization of the already-symmetric full-BZ local Hamiltonian goes from a
0.130 Ry eigenvalue drift to 2.5e-8 (a no-op), while centrosymmetric CaOs2 stays
at ~1e-15 (unchanged).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant