Representation
Representation classes are the foundation of our group theory analysis, where we build the representation of the groups and compute various properties of the group. In this section, we demonstrate the usage of the representation classes for group theory analysis.
Symmetry of atoms in a molecule
We continue with the example of the \(\textrm{CO}_2\) molecule from Cluster Class. As shown in Fig. 2, if we categorize the symmetry operations the same way we categorized the atomic displacements (i.e. along-the-axis and perpendicular-to-axis), we can observe an identity operation and an inversion (or mirror) operation perpendicular to the rotational axis at the position of the C atom.
Therefore we can construct the representation of the atoms in the molecule with \(C_i\) point group.
>>> cluster_rep = ClusterRep(cluster=cluster, pg="Ci")
>>> cluster_rep.irrep_counter
OrderedDict([('A', 2), ('B', 1)])
>>> cluster_rep.construct_irreducible_basis()
>>> cluster_rep.irrvec_dict
OrderedDict([(('A', 0), array([[1., 0., 0.]])),
(('A', 1), array([[0. , 0.70710678, 0.70710678]])),
(('B', 0), array([[ 0. , 0.70710678, -0.70710678]]))])
Here we found the decomposition the representation of the atoms into irreducible representations:
as well as the basis of the irreducible representations:
Symmetry of displacements of a molecule
In addition to representation of the atoms, we can analyze the representation of the displacements of the atoms of the \(\textrm{CO}_2\) molecule.
>>> disp_cluster_rep = DispClusterRep(cluster=cluster, pg="Ci")
>>> disp_cluster_rep.irrep_counter
OrderedDict([('A', 2), ('B', 4)])
>>> disp_cluster_rep.construct_irreducible_basis()
>>> disp_cluster_rep.irrvec_dict
OrderedDict([(('A', 0),
array([[ 0. , 0. , 0.70710678, 0. , -0.70710678, 0. ]])),
(('A', 1),
array([[ 0. , 0. , 0. , 0.70710678, 0. , -0.70710678]])),
(('B', 0), array([[1., 0., 0., 0., 0., 0.]])),
(('B', 1), array([[0., 1., 0., 0., 0., 0.]])),
(('B', 2),
array([[0. , 0. , 0.70710678, 0. , 0.70710678, 0. ]])),
(('B', 3),
array([[0. , 0. , 0. , 0.70710678, 0. , 0.70710678]]))])
With the same point group, we found the decomposition of the representation of the displacements of the atoms into irreducible representations:
and the irreducible basis:
Symmetry of Displacements of a Crystal
WIth a crystal that translates across space, the symmetry operators could rotate the atoms away from the primitive cell, resulting in a translation operator that sometimes carries a complex phase.
We will be using NaCl crystal as an example material.
>>> vec = np.array([
[0.0, 0.5, 0.5],
[0.5, 0.0, 0.5],
[0.5, 0.5, 0.0],
])
>>> atoms = {
"Na": np.array([
[0.0, 0.0, 0.0]
]),
"Cl": np.array([
[0.5, 0.5, 0.5],
])
}
>>> orbitals = "p"
>>> structure = CrystalFTG(vec=vec, atoms=atoms, orbitals=orbitals)
Here we take a look at the displacements at \(\Gamma\) point (i.e. \(\textbf{q} = \left( 0, 0, 0 \right)\)). For a crystal at \(\Gamma\) point, there are \(d\) modes where all the atoms shift along the same direction. These shift modes do not change the energy of the crystal, and we usually ommit them when studying lattice dynamics.
>>> cbr = CharmBlochRep(
structure=structure,
pg="Oh",
qpoint=np.array(parse_array("0 0 0", dtype=Fraction)),
)
>>> cbr.construct_irreducible_basis()
>>> cbr.orthogonalize_shift_modes(remove=True)
>>> cbr.irrep_counter
OrderedDict([('T1u', 1)])
>>> for key, val in cbr.irrvec_dict.items():
>>> print(key)
>>> print(np.round(val, 6))
('T1u', 0)
[[ 0.707107+0.j 0. +0.j 0. +0.j -0.707107+0.j 0. +0.j 0. +0.j]
[ 0. +0.j 0.707107+0.j 0. +0.j 0. +0.j -0.707107+0.j 0. +0.j]
[ 0. +0.j 0. +0.j 0.707107+0.j 0. +0.j 0. +0.j -0.707107+0.j]]
In NaCl, we found, excluding the shift mode, the representation of the displacements of the crystal at \(\Gamma\) point can be decomposed into irreducible representations \(\Gamma = T_{1u}\) with the following bases:
Direct product and symmetric direct product of irreducible representations
Direct product and symmetric direct product representations can be used the analyze phonons and their interactions. For example, with NaCl crystal at \(\Gamma\) point, we can analyze the second order phonons of the \(T_{1u}\) irreducible representation.
First, we can compute the decomposition of the direct product \(T_{1u} \otimes T_{1u} = A_{1g} \oplus E_g \oplus T_{1g} \oplus T_{2g}\) and it’s irreducible basis. In the case of phonon, we only concern the irreducible basis that transforms like identity:
>>> dp = DirectProduct(pg="Oh", irrep_inputs=["T1u", "T1u"])
>>> dp.irrep_counter
OrderedDict([('A1g', 1), ('Eg', 1), ('T1g', 1), ('T2g', 1)])
>>> dp.construct_irreducible_basis()
>>> dp.irrvec_dict[("A1g", 0)]
array([[0.57735027, 0. , 0. , 0. , 0.57735027, 0. , 0. , 0. , 0.57735027]])
>>> dp.basis
[(('T1u', 0), ('T1u', 0)),
(('T1u', 0), ('T1u', 1)),
(('T1u', 0), ('T1u', 2)),
(('T1u', 1), ('T1u', 0)),
(('T1u', 1), ('T1u', 1)),
(('T1u', 1), ('T1u', 2)),
(('T1u', 2), ('T1u', 0)),
(('T1u', 2), ('T1u', 1)),
(('T1u', 2), ('T1u', 2))]
Since phonons and their interaction have permutation symmetry of the derivative, we need to use the symmetric direct product when computing the product of the same irreducible representations. With symmetric direct product, we find the decomposition becomes \(\left[ T_{1u} \otimes T_{1u} \right]= A_{1g} \oplus E_g \oplus T_{2g}\) and the identity irreducible basis becomes:
>>> sdp = SymmetricDirectProduct(pg="Oh", irrep_inputs=["T1u", "T1u"])
>>> sdp.irrep_counter
OrderedDict([('A1g', 1), ('Eg', 1), ('T2g', 1)])
>>> sdp.construct_irreducible_basis()
>>> sdp.irrvec_dict[("A1g", 0)]
array([[0.57735027, 0. , 0. , 0.57735027, 0. , 0.57735027]])
>>> sdp.basis
[(('T1u', 0), ('T1u', 0)),
(('T1u', 0), ('T1u', 1)),
(('T1u', 0), ('T1u', 2)),
(('T1u', 1), ('T1u', 1)),
(('T1u', 1), ('T1u', 2)),
(('T1u', 2), ('T1u', 2))]