Symmetry-adapted phonon modes#

This page gives the equations that phonopy/phonon/symmetry_adapted_modes.py implements. The module takes the dynamical matrix at one q-point and returns the phonon frequencies, the eigenvectors and the degenerate sets. The degenerate sets are decided by the symmetry of the q-point, including time reversal. Closeness of frequencies is not used.

The module is used by the irreducible-representation calculation when the IRREPS_SYMMETRY_ADAPTED tag (IRREPS_SYMMETRY_ADAPTED) is .TRUE., the --irreps-symmetry-adapted option is given, or Phonopy.run_irreps is called with symmetry_adapted=True.

Frequencies are a poor guide to degeneracy. The three acoustic modes at \(\Gamma\) of a crystal with space group P2 have frequencies that differ by a small amount after the force constants are symmetrized, and a frequency tolerance can either merge them or split a two-dimensional representation. The representation of the little group of q separates the two cases, because modes that belong to different representations never mix under the symmetry operations.

Notation#

The symbols on this page are defined here and are used only here.

  • \(N\) is the number of atoms in the primitive cell. The dynamical matrix is a \(3N\times3N\) matrix.

  • \(\mathbf{r}(jl)=\mathbf{r}(l)+\mathbf{r}_{j0}\) is the position of atom \(j\) in unit cell \(l\). \(\mathbf{r}(l)\) is the lattice point and \(\mathbf{r}_{j0}\) is the position of the atom relative to the lattice point.

  • \(L=(\mathbf{a}_1\ \mathbf{a}_2\ \mathbf{a}_3)\) is the matrix whose columns are the basis vectors. In phonopy, primitive.cell stores the basis vectors as rows, so \(L\) is primitive.cell.T.

  • \(x_j\) is the position of atom \(j\) in crystallographic coordinates (a column vector), so that \(\mathbf{r}_{j0}=Lx_j\). It is row \(j\) of primitive.scaled_positions.

  • \(\tilde q\) is the q-point in crystallographic coordinates of the reciprocal basis vectors (a row vector). It is the qpoint argument. The reciprocal basis vectors \(\mathbf{b}_k\) satisfy \(\mathbf{a}_i\cdot\mathbf{b}_k=2\pi\delta_{ik}\), and \(\mathbf{q}\cdot\mathbf{r}_{j0}=2\pi\,\tilde q\,x_j\).

  • \(\mathbf{G}\) is a reciprocal lattice vector. Its crystallographic coordinates \(\tilde G\) are integers.

  • \(\mathrm{S}=\{\mathrm{R}|\tau\}\) is a space-group operation, \(\mathbf{r}\mapsto\mathrm{R}\mathbf{r}+\tau\), with the rotation \(\mathrm{R}\) and the translation \(\tau\) in Cartesian coordinates. spglib returns the integer matrix \(\tilde R\) and the translation \(t\) in crystallographic coordinates. They are related by \(\mathrm{R}=L\tilde RL^{-1}\) and \(\tau=Lt\).

  • The rotated q-point \(\mathrm{R}\mathbf{q}\) has the crystallographic coordinates \(\tilde q\tilde R^{-1}\).

  • \(\Delta(\mathbf{L})\) is 1 when \(\mathbf{L}\) is a lattice vector and 0 otherwise.

  • \(\pi_{\mathrm{S}}(j')=j\) is the atom to which \(\mathrm{S}\) sends atom \(j'\), defined by \(\Delta(\mathbf{r}_{j0}-\mathrm{S}\mathbf{r}_{j'0})=1\).

  • \(\Theta\) is complex conjugation.

Phase convention of the dynamical matrix#

phonopy builds the dynamical matrix with a phase that contains the atomic positions. This convention is called C-type:

\[D^{\mathrm{C}}_{\alpha\beta}(jj',\mathbf{q})=\frac{1}{\sqrt{m_jm_{j'}}} \sum_{l'}\Phi_{\alpha\beta}(j0,j'l') \exp\bigl(i\mathbf{q}\cdot[\mathbf{r}(j'l')-\mathbf{r}(j0)]\bigr).\]

The eigenvectors \(\mathbf{e}^{\mathrm{C}}_\nu(\mathbf{q})\) satisfy \(D^{\mathrm{C}}(\mathbf{q})\mathbf{e}^{\mathrm{C}}_\nu(\mathbf{q})=\omega_\nu^2\mathbf{e}^{\mathrm{C}}_\nu(\mathbf{q})\), and the atomic displacements are proportional to \(e^{\mathrm{C}}_\alpha(j,\mathbf{q})\exp(i\mathbf{q}\cdot\mathbf{r}(jl))\). symmetry_adapted_modes.py expects a C-type dynamical matrix and returns C-type eigenvectors.

The other common convention puts only the lattice vectors in the phase. It is called D-type:

\[D^{\mathrm{D}}_{\alpha\beta}(jj',\mathbf{q})=\frac{1}{\sqrt{m_jm_{j'}}} \sum_{l'}\Phi_{\alpha\beta}(j0,j'l') \exp\bigl(i\mathbf{q}\cdot[\mathbf{r}(l')-\mathbf{r}(0)]\bigr).\]

symmetry_adapted_modes.py does not use the D-type matrix. The D-type matrix is defined here because RandomDisplacements uses it internally, and a D-type matrix must not be passed to symmetry_adapted_modes.py.

Let \(V(\mathbf{q})\) be the \(3N\times3N\) diagonal matrix

\[V(\mathbf{q})=\operatorname{diag}\bigl( e^{i\mathbf{q}\cdot\mathbf{r}_{10}},e^{i\mathbf{q}\cdot\mathbf{r}_{10}},e^{i\mathbf{q}\cdot\mathbf{r}_{10}}, \ldots, e^{i\mathbf{q}\cdot\mathbf{r}_{N0}},e^{i\mathbf{q}\cdot\mathbf{r}_{N0}},e^{i\mathbf{q}\cdot\mathbf{r}_{N0}} \bigr), \qquad V_{j\alpha,j'\beta}(\mathbf{q})=e^{i\mathbf{q}\cdot\mathbf{r}_{j0}}\,\delta_{jj'}\delta_{\alpha\beta}.\]

Each atom \(j\) has the same factor on its three Cartesian components. The two types are related by

\[D^{\mathrm{C}}(\mathbf{q})=V^\dagger(\mathbf{q})\,D^{\mathrm{D}}(\mathbf{q})\,V(\mathbf{q}), \qquad \mathbf{e}^{\mathrm{D}}_\nu(\mathbf{q})=V(\mathbf{q})\,\mathbf{e}^{\mathrm{C}}_\nu(\mathbf{q}).\]

The D-type matrix is periodic in \(\mathbf{q}\), \(D^{\mathrm{D}}(\mathbf{q}+\mathbf{G})=D^{\mathrm{D}}(\mathbf{q})\), because \(e^{i\mathbf{G}\cdot\mathbf{r}(l')}=1\). The C-type matrix is not periodic. Writing the same displacement pattern with the label \(\mathbf{q}+\mathbf{G}\) or with the label \(\mathbf{q}\) gives

(1)#\[\mathbf{e}^{\mathrm{C}}_\nu(\mathbf{q}) =V(\mathbf{G})\,\mathbf{e}^{\mathrm{C}}_\nu(\mathbf{q}+\mathbf{G}), \qquad D^{\mathrm{C}}(\mathbf{q}) =V(\mathbf{G})\,D^{\mathrm{C}}(\mathbf{q}+\mathbf{G})\,V^\dagger(\mathbf{G}).\]

The factor \(e^{i\mathbf{G}\cdot\mathbf{r}_{j0}}\) differs from atom to atom, so it is not an overall phase.

The force constants are real. Therefore the dynamical matrix satisfies

(2)#\[D^{\mathrm{C}}(\mathbf{q})^*=D^{\mathrm{C}}(-\mathbf{q}),\]

and the complex conjugate of an eigenvector at \(\mathbf{q}\) is an eigenvector at \(-\mathbf{q}\). This is time-reversal symmetry.

Little group of q#

The little group of \(\mathbf{q}\) is the set of space-group operations \(\mathrm{S}\) with \(\mathrm{R}\mathbf{q}=\mathbf{q}+\mathbf{G}\). The module keeps one operation for each rotation, as spglib returns them for the primitive cell. Lattice translations act on an eigenvector only as an overall phase, so these representative operations are enough.

Time reversal adds operations. When \(\mathrm{R}(-\mathbf{q})=\mathbf{q}+\mathbf{G}\), the product \(\mathrm{S}\Theta\) also leaves \(\mathbf{q}\) unchanged. \(\mathrm{S}\Theta\) is antiunitary: it acts on an eigenvector as a matrix times the complex conjugate.

Both kinds are written with a sign \(\eta\). \(\eta=+1\) for a unitary operation and \(\eta=-1\) for an antiunitary one. An operation belongs to the little group when

(3)#\[\mathrm{R}(\eta\mathbf{q})=\mathbf{q}+\mathbf{G}_{\mathrm{S}}, \qquad\text{or}\qquad \eta\,\tilde q\tilde R^{-1}-\tilde q\in\mathbb{Z}^3.\]

\(G_{\mathbf{q}}\) denotes the unitary operations and \(A_{\mathbf{q}}\) the antiunitary ones. get_little_group_operations returns \(G_{\mathbf{q}}\) first and then \(A_{\mathbf{q}}\).

\(G_{\mathbf{q}}\) has one operation per rotation, so \(|G_{\mathbf{q}}|\) is the order of the point group of the little group. It divides the order of the point group of the crystal, which is at most 48. At a general q-point, \(G_{\mathbf{q}}\) has only the identity.

\(|A_{\mathbf{q}}|\) is either zero or \(|G_{\mathbf{q}}|\). When one operation \(\mathrm{S}_0\) sends \(\mathbf{q}\) to \(-\mathbf{q}+\mathbf{G}\), the antiunitary operations are exactly \(\mathrm{S}_0\mathrm{S}\Theta\) with \(\mathrm{S}\in G_{\mathbf{q}}\). For any \(\mathrm{S}'\Theta\) in \(A_{\mathbf{q}}\), the product \(\mathrm{S}_0^{-1}\mathrm{S}'\) leaves \(\mathbf{q}\) unchanged and is therefore in \(G_{\mathbf{q}}\). When no such \(\mathrm{S}_0\) exists, \(A_{\mathbf{q}}\) is empty.

  • In a crystal with inversion, the inversion is such an \(\mathrm{S}_0\) at every q-point, and \(|A_{\mathbf{q}}|=|G_{\mathbf{q}}|\).

  • At a q-point with \(-\mathbf{q}=\mathbf{q}+\mathbf{G}\), such as \(\Gamma\) and the points with half-integer coordinates, the identity is such an \(\mathrm{S}_0\), and \(|A_{\mathbf{q}}|=|G_{\mathbf{q}}|\).

  • In a crystal without inversion, at a q-point where \(\mathbf{q}\) and \(-\mathbf{q}\) are not equivalent, \(A_{\mathbf{q}}\) is empty.

The table lists values from the structures in test/phonon/test_symmetry_adapted_modes.py.

Space group

q-point

\(|G_{\mathbf{q}}|\)

\(|A_{\mathbf{q}}|\)

P-43m

\(\Gamma\)

24

24

P-43m

(0.1, 0.1, 0.1)

6

0

Pa-3

\(\Gamma\)

24

24

P-3m1

(1/3, 1/3, 0)

6

6

P222_1

(0.2, 0.3, 0.5)

1

1

P222_1

(0.2, 0.3, 0.4)

1

0

P-43m has no inversion, and along (0.1, 0.1, 0.1) the directions \([111]\) and \([\bar1\bar1\bar1]\) are not equivalent under its point group. At (0.2, 0.3, 0.5) of P222_1, the only unitary operation is the identity, and the one antiunitary operation makes every band doubly degenerate.

Representation matrix#

A space-group operation sends a C-type eigenvector at \(\mathbf{q}\) to an eigenvector at \(\mathrm{R}\mathbf{q}\) by the \(3N\times3N\) matrix

(4)#\[\Gamma^{\mathrm{C},\mathbf{q}}_{j\alpha,j'\beta}(\mathrm{S}) =\mathrm{R}_{\alpha\beta}\exp(-i\,\mathrm{R}\mathbf{q}\cdot\tau)\, \Delta(\mathbf{r}_{j0}-\mathrm{S}\mathbf{r}_{j'0}), \qquad D^{\mathrm{C}}(\mathrm{R}\mathbf{q}) =\Gamma^{\mathrm{C},\mathbf{q}}(\mathrm{S})\,D^{\mathrm{C}}(\mathbf{q})\, \Gamma^{\mathrm{C},\mathbf{q}}(\mathrm{S})^\dagger.\]

The vector \(\Gamma^{\mathrm{C},\mathbf{q}}(\mathrm{S})\mathbf{e}^{\mathrm{C}}_\nu(\mathbf{q})\) is an eigenvector of \(D^{\mathrm{C}}(\mathrm{R}\mathbf{q})\) with the same eigenvalue \(\omega_\nu^2\). It can differ from the eigenvector that a diagonalization at \(\mathrm{R}\mathbf{q}\) returns by an overall phase, or by a unitary rotation inside a degenerate subspace.

For an operation of the little group, \(\mathrm{R}(\eta\mathbf{q})\) is \(\mathbf{q}+\mathbf{G}_{\mathrm{S}}\), and Eq. (1) brings the label back to \(\mathbf{q}\). The representation matrix used in the module is

(5)#\[T(\mathrm{S})=V(\mathbf{G}_{\mathrm{S}})\,\Gamma^{\mathrm{C},\eta\mathbf{q}}(\mathrm{S}).\]

It acts on eigenvectors and on matrices as follows.

Operation

Eigenvector

Matrix

Unitary

\(\mathbf{e}\mapsto T\mathbf{e}\)

\(M\mapsto TMT^\dagger\)

Antiunitary

\(\mathbf{e}\mapsto T\mathbf{e}^*\)

\(M\mapsto TM^*T^\dagger\)

For an antiunitary operation, the complex conjugate moves the eigenvector from \(\mathbf{q}\) to \(-\mathbf{q}\) by Eq. (2), \(\Gamma^{\mathrm{C},-\mathbf{q}}(\mathrm{S})\) moves it to \(\mathbf{q}+\mathbf{G}_{\mathrm{S}}\), and \(V(\mathbf{G}_{\mathrm{S}})\) brings the label back to \(\mathbf{q}\). In both cases the dynamical matrix is unchanged: \(D^{\mathrm{C}}(\mathbf{q})=TD^{\mathrm{C}}(\mathbf{q})T^\dagger\) or \(D^{\mathrm{C}}(\mathbf{q})=TD^{\mathrm{C}}(\mathbf{q})^*T^\dagger\).

The matrix elements of \(T\) are

\[T_{j\alpha,j'\beta}=\mathrm{R}_{\alpha\beta}\, \exp\bigl(i\,[\mathbf{G}_{\mathrm{S}}\cdot\mathbf{r}_{j0}-\mathbf{q}'\cdot\tau]\bigr)\, \Delta(\mathbf{r}_{j0}-\mathrm{S}\mathbf{r}_{j'0}), \qquad \mathbf{q}'=\mathrm{R}(\eta\mathbf{q})=\mathbf{q}+\mathbf{G}_{\mathrm{S}}.\]

In crystallographic coordinates, \(\tilde q'=\eta\,\tilde q\tilde R^{-1}\), and the phase of the element that moves atom \(j'\) to atom \(j=\pi_{\mathrm{S}}(j')\) is

(6)#\[\exp\bigl(2\pi i\,[(\tilde q'-\tilde q)\,x_j-\tilde q'\,t]\bigr).\]

This is LittleGroupOperation.phases[j']. The same phase can be written without \(\tau\). With \(\mathrm{S}\mathbf{r}_{j'0}=\mathbf{r}_{j0}+\mathbf{L}\), where \(\mathbf{L}\) is the lattice vector that brings the image back into the unit cell,

\[T_{j\alpha,j'\beta}=\mathrm{R}_{\alpha\beta}\, \exp\bigl(-i\,\mathbf{q}\cdot(\mathrm{S}\mathbf{r}_{j'0}-\eta\,\mathbf{r}_{j'0})\bigr)\, \Delta(\mathbf{r}_{j0}-\mathrm{S}\mathbf{r}_{j'0}).\]

For a unitary operation, \(\mathrm{S}\mathbf{r}_{j'0}-\mathbf{r}_{j'0}\) is the whole vector by which \(\mathrm{S}\) moves atom \(j'\), including the lattice vector.

LittleGroupOperation stores \(T\) without building the dense matrix.

Field

Content

permutation[j']

\(\pi_{\mathrm{S}}(j')\)

phases[j']

Eq. (6)

rotation_cartesian

\(\mathrm{R}\)

rotation

\(\tilde R\)

translation

\(t\)

is_antiunitary

True for \(\eta=-1\)

Symmetrized geometry#

The matrices \(T\) must form a group to round-off. Positions in an input file are rounded, for example a coordinate of one third written with eight digits, and the rounding breaks the group closure by a small amount. That amount can exceed the tolerance used to find degenerate eigenvalues in the next section, so the lattice and the positions are symmetrized before \(T\) is built. The sums below run over all \(n_{\mathrm{op}}\) operations of the space group, not only over the little group.

The lattice is symmetrized through its metric tensor \(g=L^{\mathsf{T}}L\), whose elements are \(g_{ik}=\mathbf{a}_i\cdot\mathbf{a}_k\). The Cartesian rotation \(\mathrm{R}=L\tilde RL^{-1}\) is orthogonal exactly when \(\tilde R^{\mathsf{T}}g\tilde R=g\), so the metric tensor is averaged over the rotations:

\[g_{\mathrm{sym}}=\frac{1}{n_{\mathrm{op}}}\sum_s\tilde R_s^{\mathsf{T}}\,g\,\tilde R_s.\]

The basis vectors are then changed through the polar decomposition of \(L\). The polar decomposition writes \(L=QP\) with an orthogonal matrix \(Q\) and the symmetric positive-definite matrix \(P=(L^{\mathsf{T}}L)^{1/2}=g^{1/2}\), so \(Q=Lg^{-1/2}\). The rotation part \(Q\) is kept, and the stretch part \(g^{1/2}\) is replaced by \(g_{\mathrm{sym}}^{1/2}\):

\[L_{\mathrm{sym}}=Q\,g_{\mathrm{sym}}^{1/2}=L\,g^{-1/2}\,g_{\mathrm{sym}}^{1/2}.\]

The metric tensor of \(L_{\mathrm{sym}}\) is \(g_{\mathrm{sym}}\), and \(L_{\mathrm{sym}}\) differs from \(L\) by an amount of the order of \(g_{\mathrm{sym}}-g\). It is not in general the basis closest to \(L\) among those with the metric tensor \(g_{\mathrm{sym}}\); that basis is given by the orthogonal Procrustes problem and differs from \(L_{\mathrm{sym}}\) when \(g\) and \(g_{\mathrm{sym}}\) do not commute. The difference does not matter here, because only the orthogonality of the rotations is needed. With \(L_{\mathrm{sym}}\), the Cartesian rotation \(\mathrm{R}=L_{\mathrm{sym}}\tilde RL_{\mathrm{sym}}^{-1}\) is orthogonal to round-off.

Each position is replaced by the average of its images over the space group, which is the projection onto the totally symmetric part:

\[\bar x_j=\frac{1}{n_{\mathrm{op}}}\sum_s \bigl[\tilde R_sx_{j'}+t_s+n_s\bigr],\qquad j'=\pi_s^{-1}(j),\]

where the integer vector \(n_s=\operatorname{rint}(x_j-\tilde R_sx_{j'}-t_s)\) moves each image next to \(x_j\). The translations \(t_s\) returned by spglib are used as they are. The dynamical matrix is computed from the original structure, and the difference is removed by the symmetrization of the dynamical matrix described below.

Decomposition into degenerate sets#

SymmetryAdaptedModes finds the degenerate sets from the representation, then diagonalizes the dynamical matrix inside each of them.

The group average of a \(3N\times3N\) matrix \(M\) is

\[\langle M\rangle=\frac{1}{|G_{\mathbf{q}}|+|A_{\mathbf{q}}|} \Bigl(\sum_{G_{\mathbf{q}}}T\,M\,T^\dagger+\sum_{A_{\mathbf{q}}}T\,M^*\,T^\dagger\Bigr).\]

Since \(|A_{\mathbf{q}}|\) is either \(|G_{\mathbf{q}}|\) or zero (see Little group of q), the denominator \(|G_{\mathbf{q}}|+|A_{\mathbf{q}}|\) is \(2|G_{\mathbf{q}}|\) or \(|G_{\mathbf{q}}|\). When \(A_{\mathbf{q}}\) is empty, the second sum is absent and time reversal adds no condition.

\(\langle M\rangle\) is the projection of \(M\) onto its totally symmetric part, that is, the Wigner projection operator for the totally symmetric irreducible representation, whose characters are 1 for all operations. This group average is also called the Reynolds operator. Unlike the projection operators for other irreducible representations, it needs no character table, and it can include the antiunitary operations. \(\langle M\rangle\) commutes with every operation of the little group. The steps are listed below.

  1. A random Hermitian matrix \(Y\) is drawn with a fixed seed, and \(X=\langle Y\rangle\) is formed. The dynamical matrix is averaged in the same way, \(D_{\mathrm{sym}}=\langle D^{\mathrm{C}}(\mathbf{q})\rangle\).

  2. \(X\) is diagonalized. Eigenvalues that differ by less than a relative tolerance are grouped, and each group of eigenvectors spans one subspace \(U_k\) (\(3N\times d_k\)). \(X\) commutes with the operations, so each subspace is invariant under them. For a random \(Y\), each subspace carries one irreducible representation of the little group, or one pair of representations joined by time reversal. The reason is given in Why the eigenspaces of X are irreducible.

  3. The character of subspace \(k\) is computed for the unitary operations, \(\chi_k(\mathrm{S})=\operatorname{Tr}(U_k^\dagger T(\mathrm{S})U_k)\). Subspaces with the same dimension and the same characters carry the same representation and are collected into one type \(\mu\). The type has \(m_\mu\) subspaces of dimension \(d_\mu\).

  4. For each type, the subspaces are joined into \(B_\mu=(U_{k_1},\ldots,U_{k_{m_\mu}})\) (\(3N\times m_\mu d_\mu\)), and \(B_\mu^\dagger D_{\mathrm{sym}}B_\mu\) is diagonalized. Its eigenvalues come in runs of \(d_\mu\) equal values. Each run of \(d_\mu\) consecutive eigenvalues is one degenerate set.

  5. The sets of all types are sorted by eigenvalue, and the frequencies are \(\operatorname{sgn}(\omega^2)\sqrt{|\omega^2|}\) times the unit conversion factor.

Why the eigenspaces of X are irreducible#

The goal of steps 1 and 2 is to split the \(3N\)-dimensional space of eigenvectors into subspaces that each carry one irreducible representation. A projection operator for each irreducible representation would do this, but it needs the character table of the little group. The random matrix \(X\) does the same without a character table.

\(X\) commutes with every operation, \(TXT^\dagger=X\). If \(X\mathbf{u}=\lambda\mathbf{u}\), then

\[X(T\mathbf{u})=TX\mathbf{u}=\lambda\,T\mathbf{u},\]

so \(T\mathbf{u}\) is an eigenvector with the same eigenvalue. Each eigenspace of \(X\) is therefore closed under all the operations.

The eigenspaces are also irreducible when \(X\) is generic. By Schur’s lemma, a matrix that commutes with a unitary representation has the block form

\[X=\bigoplus_\mu X_\mu\otimes I_{d_\mu},\]

where \(\mu\) runs over the irreducible representations, \(d_\mu\) is the dimension of \(\mu\), and \(X_\mu\) is a Hermitian \(m_\mu\times m_\mu\) matrix, with \(m_\mu\) the number of times \(\mu\) appears in the \(3N\)-dimensional space. Each eigenvalue of \(X_\mu\) appears \(d_\mu\) times in \(X\), and its eigenspace is one copy of \(\mu\). Two copies merge into one eigenspace only when two eigenvalues coincide, either inside one \(X_\mu\) or between \(X_\mu\) and \(X_\nu\). For a random \(X\) this happens with probability zero.

The group average makes a random \(X\) of this form. Every matrix \(X'\) that commutes with the operations satisfies \(\langle X'\rangle=X'\), so the average maps a random Hermitian \(Y\) onto a random element among all the commuting matrices.

A small case shows the result. Two atoms on a line are exchanged by inversion, and \(T\) is the matrix that swaps them. The Hermitian matrices that commute with the swap have the form \(\begin{pmatrix}a&b\\b&a\end{pmatrix}\). For any \(a\) and any \(b\neq0\), the eigenvectors are \((1,1)/\sqrt2\) and \((1,-1)/\sqrt2\), the mode symmetric under inversion and the mode antisymmetric under it. Each of them carries one irreducible representation.

The dynamical matrix also commutes with the operations, but it is not generic. Accidental degeneracies, near-degeneracies close to a band crossing, and the small symmetry breaking from numerical noise in the force constants all make coincidences in its eigenvalues. The random \(X\) has none of these, so the subspaces are taken from \(X\), and the dynamical matrix is diagonalized inside them in step 4.

\(X\) also commutes with the antiunitary operations, \(TX^*T^\dagger=X\). When time reversal joins two unitary irreducible representations into one pair, \(X\) has equal eigenvalues on the two, and both lie in one eigenspace of dimension \(2d_\mu\). The two bands that stick together on a Brillouin-zone boundary plane of a nonsymmorphic space group are found as one subspace in this way.

Schur’s lemma covers the unitary operations. For the antiunitary ones, the statement that each eigenspace carries one pair was checked for the structures in test/phonon/test_symmetry_adapted_modes.py and is not proven here.

Remarks#

The size of a degenerate set is the dimension of a subspace, so no frequency tolerance enters. Characters are computed for the unitary operations only. An antiunitary operation multiplies a scalar by its complex conjugate, so the trace of its matrix depends on the basis and is not a character.

The dynamical matrix must be C-type. A D-type matrix, as used internally by RandomDisplacements, is in general not left unchanged by \(T\) at a q-point other than \(\Gamma\), and the module does not check this. Pass the matrix that DynamicalMatrix.run produces.