Phase conventions in symmetry_eigenvalues: reconciling with Crystalline.jl
This document explains the phase convention mismatch between the Convention 1 derivation in theory.md and Crystalline.jl's calc_bandreps and lgirreps and how symmetry_eigenvalues in SymmetricTightBinding.jl corrects for it, to align with Crystalline.jl's convention.
Background: what theory.md derives
The derivation in theory.md (§ "Transformation properties under symmetry operations") gives the Convention 1 symmetry eigenvalue for band $n$ at $\mathbf{k}$ under a little-group operation $g = \{R|\mathbf{v}\}$:
\[\chi_{n\mathbf{k}}(g) = (\Theta_\mathbf{G} \, \mathbf{w}_{n\mathbf{k}})^\dagger \, \mathbf{D}_\mathbf{k}(g) \, \mathbf{w}_{n\mathbf{k}}\]
where:
\[\mathbf{w}_{n\mathbf{k}}\]
is the eigenvector of $H(\mathbf{k})$ in the Convention 1 coefficient basis\[\mathbf{G} = g\mathbf{k} - \mathbf{k}\]
is a reciprocal lattice vector (since $g$ is in the little group $G_\mathbf{k}$)\[[\Theta_\mathbf{G}]_{II} = e^{-i\mathbf{G}\cdot\mathbf{q}_I}\]
(so $\Theta_\mathbf{G}^\dagger = \Theta_{-\mathbf{G}}$ contributes $e^{+i\mathbf{G}\cdot\mathbf{q}_I}$ upon conjugation)\[\mathbf{D}_\mathbf{k}(g) = e^{-i(g\mathbf{k})\cdot\mathbf{v}} \, \rho(h)\]
is the site-induced space group representation (Convention 1)
The SiteInducedSGRepElement functor in site_representations.jl faithfully implements $\mathbf{D}_\mathbf{k}(g)$:
Dₖ = cispi(-2dot(gk, v)) * sgrep.ρ # = e^{-2πi(gk)·v} ρ(h)What Crystalline.jl's calc_bandreps computes
In Crystalline/src/calc_bandreps.jl (line 179):
χᴳₖ += cis(2π*dot(kv′, tα′α′)) * χs[site_symmetry_index]The phase uses cis(+2π...) where the Cano/Elcoro paper[1] uses cis(-2π...). A comment in the source (lines 180–185) explicitly acknowledges this:
"The sign in this
cis(...)above is different from in Elcoro's. I think this is consistent with our overall sign convention (see #12), however, and flipping the sign causes problems for the calculation of some subductions toLGIrreps."
L. Elcoro et al., "Double crystallographic groups [...]," J. Appl. Cryst. 50, 1457 (2017).
This means the band representation characters computed by calc_bandreps use conjugated phase signs for both the $\Theta_\mathbf{G}$ factor and the $\mathbf{D}_\mathbf{k}$ global phase, relative to the Convention 1 derivation. Crystalline.jl is internally consistent: its LGIrrep matrices also use these conjugated signs, so subduction (decomposing characters into irreps) works correctly within Crystalline — the conjugations cancel when matching characters against irreps, because both sides are conjugated identically.
The net effect: complex conjugation
The two sign flips (one in $\Theta_\mathbf{G}$, one in $\mathbf{D}_\mathbf{k}$) both individually conjugate phases in the character formula, and together they give:
\[\chi_\text{Crystalline}(g) = \overline{\chi_\text{Convention 1}(g)}\]
That is, the Crystalline.jl convention returns characters that are the complex conjugate of the Convention 1 result.
To see this concretely: the Convention 1 character is $\chi_\text{Convention 1} = (\Theta_\mathbf{G} \mathbf{w})^\dagger \mathbf{D}_\mathbf{k} \mathbf{w}$. Under the Crystalline sign convention, $\Theta_\mathbf{G} \to \Theta_{-\mathbf{G}}$ and $e^{-i(g\mathbf{k})\cdot\mathbf{v}} \to e^{+i(g\mathbf{k})\cdot\mathbf{v}}$, which individually conjugates both scalar factors in the formula, so the overall character is conjugated.
Where the mismatch occurs
The mismatch arises at the interface between the two packages:
- SymmetricTightBinding.jl computes symmetry eigenvalues from Hamiltonian eigenvectors in Convention 1
- Crystalline.jl expects characters in its conjugated convention (to match its
LGIrreps)
When collect_compatible calls symmetry_eigenvalues and passes the result to Crystalline's collect_compatible(symeigsv, cbr.brs), the conventions must agree. This mismatch was the root cause of the incorrect irrep labels reported in PR #89.
The fix
Since $\chi_\text{Crystalline} = \overline{\chi_\text{Convention 1}}$, the correction is simply to take the complex conjugate of the Convention 1 formula. In symmetry_eigenvalues:
Θᴳ = reciprocal_translation_phase(orbital_positions(ptbm), G) # = Θ_G (positive G)
ρ = sgrep(k) # = D_k(g) = e^{-2πi(gk)·v} ρ(h) (Convention 1)
for (n, v) in enumerate(eachcol(vs))
v_kpG = Θᴳ * v
χ = dot(v_kpG, ρ, v) # Convention 1: (Θ_G w)† D_k w
χ_Crystalline = conj(χ) # [⚠️ phase]: convert to Crystalline.jl's convention
symeigs[j, n] = χ_Crystalline
endNote: the eigenvectors vs are from solve(ptbm, k; bloch_phase=Val(false)), i.e., they are eigenvectors of $H(\mathbf{k})$ in the Convention 1 coefficient basis. The Hamiltonian phase convention affects the eigenvectors (particularly at non-TRIM $\mathbf{k}$-points where $\mathbf{k} \neq -\mathbf{k}$), so the symmetry eigenvalue result is coupled to the Hamiltonian phase convention. The code uses the Convention 1 Hamiltonian phase ($e^{+i\mathbf{k}\cdot\boldsymbol{\delta}}$, i.e., cispi(-2k·δ) in types.jl); changing this sign would require re-deriving the correction here.
Should this be fixed in Crystalline.jl instead?
There are three options, each with different trade-offs:
Option A: Complex-conjugate in symmetry_eigenvalues (current approach)
symmetry_eigenvalues computes the Convention 1 character and conjugates it before returning.
- Pro: Minimal blast radius; no Crystalline.jl changes needed; the correction ($\overline{\chi_\text{Convention 1}} = \chi_\text{Crystalline}$) is concise and easy to understand
- Con: The returned characters differ by a global complex conjugation from what
theory.mdderives; downstream callers must be aware of this convention
Option B: Fix the root cause in Crystalline.jl (best, but harder)
Change Crystalline.jl to use the conventional minus sign in its exponential phase factors (fixing https://github.com/thchr/Crystalline.jl/issues/12), then remove the conjugation correction here entirely.
- Pro: Both packages use Convention 1 throughout; the code matches the literature
- Con: It is not clear what fixing issue #12 means for irrep label assignments across Crystalline.jl.
- 1B. Bradlyn et al., "Topological quantum chemistry," Nature 547, 298 (2017);